1

我的一个朋友正在为内存受限的 Linux 系统开发一个库。他建议使用shm_open分配多个合理大小(16MB)的内存,用于跨用户机器上的多个不同程序的进程间通信。

出现的问题是,如果分配了很多缓冲区(例如 128),那么 128 × 16MB 可能是可用系统内存的重要部分,而且很有可能实际上不会有太多保留内存用过的。例如,如果每个缓冲区中只有 128K 的内存实际用于任何事情,那么这种方法将使用大约 1/128 的保留内存。由于预期的访问模式,在任何给定时间,每个缓冲区中可能只有一小部分区域是“热的”。

我查阅了 的手册页shm_open,其中特别提到了在 Linux 上,实现tmpfs用于分配的内存。手册页tmpfs反过来说,如果机器上存在物理内存压力,则可以调出分配的内存。它还说只分配存储文件系统已用内容所需的空间。

通过阅读本文,我假设以下情况属实:

  1. 使用shm_open分配 16MB 的空间不一定会立即消耗机器上的 16MB 物理内存,因为大多数文件系统将是零页,操作系统将延迟分配。使用的空间将与写入的数据量成正比。

  2. 如果机器上剩下的物理 RAM 很少,则允许操作系统从共享内存缓冲区中调出部分。此外,如果在任何时候只访问缓冲区的某些部分,那么假设这些区域(可能不是其他区域)将在给定时间被调入并不是不合理的。

这些假设合理吗?这原则上可以通过经验进行测试,但令人担忧的是,我们会遇到以下形式的问题:“是的,它适用于您的系统,但通常不适用于其他 Linux 安装。”</p>

4

1 回答 1

1

用户模式应用程序通常可以保留物理内存的唯一方法是使用mlock系统调用系列。该进程必须具有CAP_IPC_LOCK特权或仅限于RLIMIT_MEMLOCK字节。

可以使用 将共享内存锁定到 RAM 中mlock(),但这不是自动完成的,也没有理由需要这样做。它只是共享虚拟内存。

于 2018-08-31T01:49:54.637 回答