【问题标题】:How to tell Linux that a mmap()'d page does not need to be written to swap if the backing physical page is needed?如果需要支持物理页面,如何告诉 Linux 不需要写入 mmap() 的页面来交换?
【发布时间】:2011-12-23 19:02:12
【问题描述】:

希望标题清楚。我有一块通过 mmap() 获得的内存。一段时间后,我得出结论,我不再需要这个范围内的数据。但是,我仍然希望保持这个范围。也就是说,我不想调用 mummap()。我正在努力成为一个好公民,而不是让系统交换超出它的需要。

有没有办法告诉 Linux 内核 if 给定页面由物理页面支持并且 如果 内核决定它需要该物理页面,不要麻烦写那个页面来交换?

我想在后台这个神奇的函数调用会破坏给定虚拟页面和物理页面之间的任何映射(如果存在),而无需先写入交换。

【问题讨论】:

  • munmap 有什么问题?它完全按照您所说的去做。如果要确保以后的 mmap 不会重用相同的虚拟地址,可以在 munmap 之后使用 MAP_FIXED+PROT_NONE 进行 mmap 以保留地址...
  • 你怎么知道它是这样做的(将支持的物理页面写入交换)?
  • @ChrisDodd 我只能使用 munmap() 如果我可以保证随后对 mmap() 的调用 - 使用适当的参数进行 - 将保留相同的页面。正是这种缺乏保证第二个 mmap() 将成功阻止我使用 munmap() 的保证。重要的是,我的内存块的开始和结束不会改变,即使我在不​​同时间知道特定页面不再包含有用的数据。
  • @user309483 我想我不能保证这些页面是为交换而写的,但同样,这纯粹是为了成为系统上的好公民。如果它们被写入交换,我想节省系统的工作量。

标签: linux swap mmap virtual-memory pagefile


【解决方案1】:

您的问题(如前所述)毫无意义。

让我们假设有一种方法可以告诉内核做你想做的事。

让我们进一步假设它确实需要额外的 RAM,因此它占用了您的页面,并且没有将其换出。

现在您的程序尝试读取该页面(因为您不想munmap 数据,可能您可能 尝试访问它)。内核要做什么?我看到的选择:

  1. 它可以为您提供一个充满 0 的新页面。
  2. 可以给你SIGSEGV

如果您想要选择 2,您可以使用 munmap 获得相同的结果。

如果您想要选择 1,您可以使用 MAP_ANON(或 munmap 后跟新的 mmap)覆盖现有映射 mremap

在任何一种情况下,您都不能在需要时依赖旧数据。

您的问题有意义的唯一方法是内核是否有一些额外的机制让您知道它正在夺走您的页面(例如,向您发送一个特殊信号)。但您所描述的情况可能非常罕见,足以保证额外的复杂性。

编辑:

您可能正在寻找madvise(..., MADV_DONTNEED)

【讨论】:

  • 完美! madvise() 正是我想要的。像 (1) 这样的行为是我想要的,尽管零填充是不必要的。任何垃圾都可以。 mremap() 在您的系统上是否有 MAP_ANON 标志?我的文档没有这个。
【解决方案2】:

你可以munmap该地区,然后mmap它再次MAP_NORESERVE

如果您在初始映射时知道不需要交换,请使用MAP_NORESERVE

【讨论】:

  • 无法保证第二个 mmap() 会成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2017-11-16
  • 2012-03-02
  • 2014-07-14
  • 2021-12-20
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多