【问题标题】:Is boost managed_mapped_file using my physical memory? [duplicate]boost managed_mapped_file 是否使用我的物理内存? [复制]
【发布时间】:2014-12-04 15:51:41
【问题描述】:

我想将一个文件(512M)映射到共享内存,以便每个进程都可以访问它。我选择 boost::interprocess::managed_mapped_file。

我认为共享内存不应该占用real 内存,因为它是由多个进程共享的。但是当我运行我的程序时,似乎每个进程都使用了 512M 的内存。而且内存不够20个进程。

那么为什么 boost::interprocess::managed_mapped_file 占用的是实内存而不是虚拟内存呢?

【问题讨论】:

  • 试试吧。我认为您将 virt 集误认为是 reserved/committed 集。
  • 是的,它正在使用您的物理内存,但仅限于可用内存。否则,未锁定的页面(可能是所有页面)将被换出物理内存。当然,这些页面仍将映射到您的虚拟地址空间,直到您取消映射。换出脏页需要写入,换回页需要读取,因此可用于“备份”虚拟文件映射的物理页太少可能会导致性能非常差。

标签: c++ linux memory boost mmap


【解决方案1】:

我认为共享内存不应该占用真实内存

不,您将需要多达 512M 的“真实”内存(尽管这可能会按需调入和调出物理内存)。每个进程都将使用该内存。

好像每个进程都使用了512M的内存

每个都会有 512M 的共享内存映射到它的虚拟地址空间;大概这就是你所看到的。在每个映射后面都是相同的 512M 物理内存。

而且没有足够的内存供 20 个进程使用。

你是说你的物理内存真的用完了,好像每个进程都分配了512M吧?如果每个进程都为自己占用物理内存,而不是共享它,那么当您创建和共享虚拟内存时就会出现问题。我们需要看看你是怎么做的,才能猜出可能出了什么问题。

【讨论】:

  • 不,您需要 512M 的“真实”内存 - 这不准确。仅当您使用 VirtualLock 或将它们锁定到位时才需要这样做
  • @sehe:确实,我的语言有点松散,希望意思足够清楚。 “你需要真正的内存”,我的意思是“你需要为所使用的内存分配尽可能多的页面,每个页面在访问时都需要物理内存。”
  • 重点是,您只需要说几页(我们取 40k)就可以有效地映射 21GiB 的文件。 (其余的将根据 LRU 禁止锁定进行换入/换出)
  • @sehe:好的,我们用“真实”这个词来表示不同的东西。希望我已经足够澄清了答案,而不需要太多关于内存管理的讲座。如果您认为本文不够严谨,请随意编写自己的文章。
  • @sehe 40k 可能不足以有效地映射一个 21GiB 的文件,想想一个由 20 个处理实时请求的进程共享的数据库 - 这将是一个明显的例子,用廉价的内存换取更低的延迟是一个明显的例子很好的权衡。
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 2012-10-27
  • 2011-02-04
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多