shm_open是否提交固定数量的物理内存吗?

时间:2018-08-31 00:55:34

标签: linux posix shared-memory virtual-memory tmpfs

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

出现的问题是,如果分配了许多缓冲区(例如128个),则128×16MB可能是可用系统内存的重要部分,并且很可能没有太多的保留内存会被习惯的。例如,如果仅说每个缓冲区中的128K内存实际用于任何事情,则此方法将使用保留的内存的约128%。由于预期的访问方式,在任何给定时间,每个缓冲区的很小区域可能都很“热”。

我查阅了shm_open的手册页,其中提到特别是在Linux上,实现使用tmpfs作为分配的内存。 tmpfs的手册页依次指出,如果计算机上存在物理内存压力,则可以调出分配的内存。它还说,只会分配存储文件系统已用内容所需的空间。

根据我的阅读,我假设以下内容是正确的:

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

  2. 如果计算机上几乎没有物理内存,则允许OS从共享内存缓冲区中调出部分。而且,如果在任何一次仅访问缓冲区的某些部分,那么假定在给定的时间分页那些区域(可能不是其他区域)将是不合理的。

    < / li>

这些假设是否合理?原则上,这可以通过经验进行测试,但是我们担心的是,我们会遇到“是的,可以在您的系统上运行,但通常不适用于其他Linux安装”形式的问题。

1 个答案:

答案 0 :(得分:1)

用户模式应用程序通常可以保留物理内存的唯一方法是使用mlock系列系统调用;该过程必须具有 S _________________|_____________________________ NP VBD IN NP ________|_________________ | | _____|____ the/DT little/JJ yellow/JJ dog/NN barked/VBD at/IN the/DT cat/NN 特权,或者被限制为CAP_IPC_LOCK个字节。

可以使用RLIMIT_MEMLOCK将共享内存锁定到RAM中,但这不是自动完成的,因此没有必要这样做。只是共享的虚拟内存。