【问题标题】:Shared memory marked as virtual memory?共享内存标记为虚拟内存?
【发布时间】:2013-01-24 18:23:32
【问题描述】:

我运行一个程序,它分配 64MB 作为 IPC 通信的共享内存。 pmap 显示分配了 64MB 的块。然而,“top”显示proc的RES内存只有40MB左右!我得出结论,共享内存被标记为 VIRT。但为什么? Linux 仍然有超过 1GB 的可用 RAM。

【问题讨论】:

  • 是否立即使用全部 64MB?
  • 在 linux 中,除非您是内核,或者您正在处理诸如硬件映射的帧缓冲区之类的东西,否则几乎所有内存都是虚拟的。

标签: linux unix operating-system ipc


【解决方案1】:

共享内存,就像用户态程序处理的大多数(如果不是全部)内存一样,是虚拟的。只有活动页面需要映射到物理(即常驻内存)。采取不同的做法会浪费资源。

唯一的例外是当进程使用mlock 专门锁定 RAM 中的页面时。

【讨论】:

    【解决方案2】:

    Linux 不会将进程“获得”的所有内存加载到 RAM 中,它只会在您编程引用该内存块时将内存从虚拟位置加载到 RAM。这里的“内存”是指私有内存和共享内存。 我​​没有做过任何实验来验证上述观点,但是我在很多地方都看到了这个,我相信它。仅供参考。

    【讨论】:

      【解决方案3】:

      您是否实际使用过这 64MB 中的任何一个? Linux 延迟分配。

      参见。 Does malloc lazily create the backing pages for an allocation on Linux (and other platforms)?

      【讨论】:

      • 你的理论看起来是对的!我刚刚运行了一个测试,让这个应用程序使用共享内存块接收消息,并观察到 ​​RES 大幅增加,而 VIRT 几乎保持不变。
      • 它实际上是一个非常有用的功能,当应用程序预先分配大量内存时,它们实际上永远不会。
      • 操作系统是否使用延迟分配与 OP 在此处观察到的内容无关。这与不像 Solaris 那样进行惰性分配的操作系统完全相同。
      猜你喜欢
      • 2016-03-19
      • 2011-01-03
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多