我正在尝试找到任何允许进程分配“临时”内存的系统功能 - 即被进程视为可丢弃的内存,并且可以在需要内存时被系统带走,但允许尽可能从可用内存中受益的过程。换句话说,该过程告诉系统,当进程不使用它时,可以牺牲内存块。释放块也是最好的交换(它更昂贵,或者更昂贵,交换它而不是重新构成其内容)。
系统(例如Linux),在内核中有这些东西,比如F / S内存缓存。我正在寻找类似的东西,但可供用户空间使用。
我知道有很多方法可以从程序中执行此操作,但实际上更多的是处理此问题的内核工作。在某种程度上,我问内核:
具体来说,我对可以在Linux上运行的解决方案感兴趣,但是有兴趣了解是否存在任何其他操作系统。
更新
关于我希望如何工作的一个例子:
以下是在现有MM上完成的问题:
为了使页面不被分页,我必须分配它们。但是,他们可以在任何时候被点出来,恕不另行通知。使用mincore()进行测试并不能保证在mincore()完成时页面仍然存在。使用mlock()需要提升权限。
所以,我能得到的最接近的是使用mlock()和匿名页面。按照我之前概述的预期,它将是:
但是,当我使用它时,我并不需要将页面锁定在RAM中。此外,如果内存过载,MAP_NORESERVE会出现问题。
答案 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 space(kernel为虚拟),MMU正在处理虚拟到物理地址转换(使用paging)和与page fault。所以mmap(2)可以随时发生。内核将选择在任意时刻进行页面调入或页面调出 - 并将选择要交换的页面(只有内核关心RAM,并且它可以随意页面调出任何物理RAM页面)。也许您希望内核在页面被真正丢弃时告诉您。如果没有通知您的进程,内核将如何从您的进程中删除临时内存?内核可能会带走并稍后返回一些内存....(所以你想知道给定的内存何时是新鲜的)
您可以先将mincore(2)与MAP_NORESERVE
一起使用,然后再使用MAP_FIXED|MAP_PRIVATE
再次(在相同的内存范围内)。另请参阅mlock(2)和madvise(2)
您也可以稍后将GNU Hurd与MADV_WONTNEED
或MADV_WILLNEED
等一起使用。
也许您想要mmap
某些设备,例如/dev/null
,/dev/full
,/dev/zero
或(更有可能)编写您自己的内核模块,提供类似的设备。
external pager mechanism有一个FUSE ...你还不能在Linux上得到这个。 (也许在{{3}}已挂载的文件上考虑mmap
。
我不明白当内核分页你的内存时你想要发生什么,以及当内核再次分页这样的页面时你想要发生什么,因为你的进程正在访问它。您想获得一个归零的页面,还是SIGSEGV
?