【问题标题】:Does shm_open commit a fixed amount of physical memory?shm_open 是否提交固定数量的物理内存?
【发布时间】:2018-08-31 00:55:34
【问题描述】:

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

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

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

根据我的阅读,我假设以下情况属实:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 2011-10-23
      • 1970-01-01
      • 2015-06-26
      • 2021-09-14
      • 1970-01-01
      • 2012-01-20
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多