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