【问题标题】:Allocating "temporary" memory (in Linux)分配“临时”内存(在 Linux 中)
【发布时间】:2014-04-20 16:32:59
【问题描述】:

我正在尝试找到任何允许进程分配“临时”内存的系统功能 - 即被进程视为可丢弃的内存,并且可以在需要内存时被系统带走,但允许尽可能从可用内存中受益的进程。换句话说,进程告诉系统在进程不使用内存块时牺牲它是可以的。释放块也比交换它更可取(交换它而不是重建它的内容更昂贵或同样昂贵)。

系统(例如 Linux)在内核中有这些东西,例如 F/S 内存缓存。我正在寻找类似的东西,但对用户空间可用。

我知道有一些方法可以从程序中做到这一点,但处理这个问题实际上更多的是内核工作。在某种程度上,我在问内核:

  • 如果您需要减少我或其他进程的驻留,请先关闭这些临时页面
  • 如果您要关闭这些临时页面,请不要将它们换掉,只需取消映射即可

具体来说,我对适用于 Linux 的解决方案很感兴趣,但有兴趣了解是否存在适用于任何其他操作系统的解决方案。

更新

我希望它如何工作的示例:

  • 映射页面(过度交换)。与现在可用的内容没有区别。
  • 告诉内核该页面是“临时的”(因为没有更好的名称),这意味着如果该页面消失,我不希望它被分页。
  • 告诉内核我需要临时页面“返回”。如果页面在我将其标记为“临时”后未映射,我会被告知发生了这种情况。如果没有,则它开始表现得像一个常规页面。

以下是现有 MM 需要解决的问题:

要使页面不被分页,我必须将它们分配给空。但是,他们可以随时被调出,恕不另行通知。使用 mincore() 进行测试并不能保证在 mincore() 完成时页面仍然存在。使用 mlock() 需要提升的权限。

所以,我最接近的方法是使用 mlock() 和匿名页面。按照我之前概述的期望,它将是:

  • 映射一个匿名的锁定页面。 (MAP_ANON|MAP_LOCKED|MAP_NORESERVE)。用魔法在页面上加盖印章。
  • 为了使页面“临时”,解锁页面
  • 当需要页面时,再次锁定它。如果魔法存在,那就是我的数据,否则它就丢失了,我需要重新构建它。

但是,当我使用页面时,我真的不需要将页面锁定在 RAM 中。此外,如果内存过度使用,MAP_NORESERVE 也会出现问题。

【问题讨论】:

  • 您还需要内核在丢弃页面时告诉您的进程……这是一个难题。
  • @BasileStarynkevitch 一点也不。我只需要“签出”一个页面。如果它存在,我会得到它,并且在我重新签入之前它不再是临时的。
  • 在下面查看我的改进答案。当内核已调出某个页面并再次调入(因为您的程序访问它)时,您希望发生什么? 请编辑您的问题以改进它

标签: linux memory memory-management


【解决方案1】:

我不确定是否完全了解您的需求。请记住processesvirtual memory 中运行(它们的address space 是虚拟的),kernel 正在处理虚拟到物理地址的转换(使用MMU)和paging。所以page fault 随时可能发生。内核将在任意时刻选择页入或页出 - 并将选择要交换的页面(只有内核关心 RAM,它可以随意页出任何物理 RAM 页面)。也许您希望内核告诉您何时真正丢弃了页面。内核如何在不通知您的进程的情况下从您的进程中取出临时内存?内核可能会拿走一些 RAM,然后再归还一些 RAM....(所以你想知道给定的内存何时是新的)

您可以先将mmap(2)MAP_NORESERVE 一起使用,然后再(在同一内存范围内)与MAP_FIXED|MAP_PRIVATE 一起使用。另见mincore(2)mlock(2)

您也可以稍后将madvise(2)MADV_WONTNEEDMADV_WILLNEED 等一起使用。

也许您想mmap 一些设备,例如/dev/null/dev/full/dev/zero,或者(更有可能)编写自己的内核模块来提供类似的设备。

GNU Hurd 有一个 external pager mechanism... 你还不能在 Linux 上得到它。 (也许考虑在某些 FUSE 挂载文件上使用 mmap)。

我不明白当内核分页你的内存时你想要发生什么,以及当内核再次分页这样一个页面时你想要发生什么,因为你的进程正在访问它。你想得到一个零页面,还是一个SIGSEGV

【讨论】:

    【解决方案2】:

    这是VmWare ESXi 服务器又名Virtual Machine Monitor (VMM) 层实现的。这在虚拟机中使用,是从虚拟机来宾reclaim 内存的一种方式。分配的内存比实际使用/需要的多的虚拟机将被释放/释放给 VMM,以便它可以将其分配回需要它的虚拟机来宾。

    本文提到了Memory Reclamation的这种技术:http://www.vmware.com/files/pdf/mem_mgmt_perf_vsphere5.pdf

    在类似的行中,您可以在内核中实现类似的东西。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多