我的一个朋友正在为内存受限的Linux系统开发一个库。他建议使用shm_open
分配多个合理大小(16MB)的内存,以便在用户计算机上的多个不同程序之间进行进程间通信。
出现的问题是,如果分配了许多缓冲区(例如128个),则128×16MB可能是可用系统内存的重要部分,并且很可能没有太多的保留内存会被习惯的。例如,如果仅说每个缓冲区中的128K内存实际用于任何事情,则此方法将使用保留的内存的约128%。由于预期的访问方式,在任何给定时间,每个缓冲区的很小区域可能都很“热”。
我查阅了shm_open
的手册页,其中提到特别是在Linux上,实现使用tmpfs
作为分配的内存。 tmpfs
的手册页依次指出,如果计算机上存在物理内存压力,则可以调出分配的内存。它还说,只会分配存储文件系统已用内容所需的空间。
根据我的阅读,我假设以下内容是正确的:
使用shm_open
分配16MB的空间并不一定会立即消耗计算机上的16MB物理内存,因为大多数文件系统将是零页,而操作系统会延迟分配这些零页。使用的空间将与写入的数据量成比例。
如果计算机上几乎没有物理内存,则允许OS从共享内存缓冲区中调出部分。而且,如果在任何一次仅访问缓冲区的某些部分,那么假定在给定的时间分页那些区域(可能不是其他区域)将是不合理的。
< / li>这些假设是否合理?原则上,这可以通过经验进行测试,但是我们担心的是,我们会遇到“是的,可以在您的系统上运行,但通常不适用于其他Linux安装”形式的问题。
答案 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中,但这不是自动完成的,因此没有必要这样做。只是共享的虚拟内存。