我的一个朋友正在为内存受限的 Linux 系统开发一个库。他建议使用shm_open
分配多个合理大小(16MB)的内存,用于跨用户机器上的多个不同程序的进程间通信。
出现的问题是,如果分配了很多缓冲区(例如 128),那么 128 × 16MB 可能是可用系统内存的重要部分,而且很有可能实际上不会有太多保留内存用过的。例如,如果每个缓冲区中只有 128K 的内存实际用于任何事情,那么这种方法将使用大约 1/128 的保留内存。由于预期的访问模式,在任何给定时间,每个缓冲区中可能只有一小部分区域是“热的”。
我查阅了 的手册页shm_open
,其中特别提到了在 Linux 上,实现tmpfs
用于分配的内存。手册页tmpfs
反过来说,如果机器上存在物理内存压力,则可以调出分配的内存。它还说只分配存储文件系统已用内容所需的空间。
通过阅读本文,我假设以下情况属实:
使用
shm_open
分配 16MB 的空间不一定会立即消耗机器上的 16MB 物理内存,因为大多数文件系统将是零页,操作系统将延迟分配。使用的空间将与写入的数据量成正比。如果机器上剩下的物理 RAM 很少,则允许操作系统从共享内存缓冲区中调出部分。此外,如果在任何时候只访问缓冲区的某些部分,那么假设这些区域(可能不是其他区域)将在给定时间被调入并不是不合理的。
这些假设合理吗?这原则上可以通过经验进行测试,但令人担忧的是,我们会遇到以下形式的问题:“是的,它适用于您的系统,但通常不适用于其他 Linux 安装。”</p>