【问题标题】:Why would we need to lock a process's address space in RAM?为什么我们需要将进程的地址空间锁定在 RAM 中?
【发布时间】:2012-03-22 08:35:44
【问题描述】:

http://linux.die.net/man/2/mlockall

mlockall() 将调用进程的所有虚拟地址空间锁定到 RAM 中,防止该内存被分页到交换区域。

为什么这在实时系统中很重要?

【问题讨论】:

标签: c linux real-time


【解决方案1】:

它确保内存始终在 RAM 中,并且永远不会移动到交换磁盘。这使得访问这些内存位置的速度大大更快,因为与 RAM 相比,磁盘非常慢。

在实时系统中(顺便说一句,Linux 不是 RTS!)您需要极低的延迟,因此导致磁盘访问的内存访问在时间关键型代码中通常是不可接受的。

【讨论】:

  • 好的,是的,感谢您将这句话加粗。所以,这意味着在这个实时的东西被激活之前,非重要的任务不会在 ram 中占据任何位置?
  • @AnishaKaul:这意味着该进程将始终以更好的性能运行,因为与该进程关联的所有页面都保留在 RAM 中。但是请注意,在使用 mlockall() 时如果没有足够的物理内存,其他进程中的内存分配调用会失败。
【解决方案2】:

例如,它可以用于实时应用程序或高安全性数据处理。 这是来自 mlockall() 文档的引用:

实时应用程序需要确定的时间,并且,例如 调度, 分页是意外程序执行延迟的主要原因之一。实时应用程序通常也会切换到 带有 sched_setscheduler(2) 的实时调度器。加密- 图形安全软件通常将密码或密钥等关键字节作为数据结构处理。作为分页的结果, 这些秘密可以转移到一个 per- 持久交换存储介质,在安全软件删除其中的秘密很久之后,敌人可能可以访问它们 RAM 并终止。 (但请注意, 笔记本电脑和某些台式电脑上的挂起模式会将系统 RAM 的副本保存到磁盘,而不管内存是否锁定。)

使用 mlockall() 来防止页面错误延迟的实时进程应在之前保留足够的锁定堆栈页面 进入时间关键部分,因此没有 页面错误可能是由函数调用引起的。这可以通过调用分配足够大的函数来实现 自动变量(一个数组)并写入内存 ory 被这个数组占用,以便接触这些堆栈页面。这样,将为堆栈映射足够的页面,并且可以 锁定在 RAM 中。虚拟写入确保 在临界区甚至不会发生写时复制页面错误。

【讨论】:

  • 非常感谢。我的错,我应该在询问之前正确阅读文档。
【解决方案3】:

实时处理的关键要素是实时组件 - 即,您不必等待从内存中换入/换出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-01-14
    • 2021-05-23
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多