分配“临时”内存(在Linux中)

时间:2014-03-15 07:38:19

标签: linux memory memory-management

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

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

我知道有很多方法可以从程序中执行此操作,但实际上更多的是处理此问题的内核工作。在某种程度上,我问内核:

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

具体来说,我对可以在Linux上运行的解决方案感兴趣,但是有兴趣了解是否存在任何其他操作系统。

更新

关于我希望如何工作的一个例子:

  • 映射页面(通过交换)。现在没什么可用的。
  • 告诉内核该页面是“临时的”(缺少更好的名称),这意味着如果此页面消失,我不希望它被分页。
  • 告诉内核我需要“返回”临时页面。如果页面被取消映射,因为我将其标记为“临时”,我被告知发生了。如果没有,则它开始表现为常规页面。

以下是在现有MM上完成的问题:

为了使页面不被分页,我必须分配它们。但是,他们可以在任何时候被点出来,恕不另行通知。使用mincore()进行测试并不能保证在mincore()完成时页面仍然存在。使用mlock()需要提升权限。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我不确定完全了解您的需求。请记住,processes virtual memory中运行address spacekernel为虚拟),MMU正在处理虚拟到物理地址转换(使用paging)和与page fault。所以mmap(2)可以随时发生。内核将选择在任意时刻进行页面调入或页面调出 - 并将选择要交换的页面(只有内核关心RAM,并且它可以随意页面调出任何物理RAM页面)。也许您希望内核在页面被真正丢弃时告诉您。如果没有通知您的进程,内核将如何从您的进程中删除临时内存?内核可能会带走并稍后返回一些内存....(所以你想知道给定的内存何时是新鲜的)

您可以先将mincore(2)MAP_NORESERVE一起使用,然后再使用MAP_FIXED|MAP_PRIVATE再次(在相同的内存范围内)。另请参阅mlock(2)madvise(2)

您也可以稍后将GNU HurdMADV_WONTNEEDMADV_WILLNEED等一起使用。

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

external pager mechanism有一个FUSE ...你还不能在Linux上得到这个。 (也许在{{3}}已挂载的文件上考虑mmap

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

相关问题