的Windows 8.1 /服务器2012RC2虚拟内存管理刚刚推出了新的API:OfferVirtualMemory()
,ReclaimVirtualMemory()
,DiscardVirtualMemory()
,他们的使用非常简单,只需查看他们的名字即可。新的Windows 8.1的API,虚拟内存管理:`DiscardVirtualMemory()``VS的VirtualAlloc()`和`MEM_RESET`和`MEM_RESET_UNDO`
我无法得到的东西是这些API对VirtualAlloc()
加上标记MEM_RESET
和MEM_RESET_UNDO
的工作方式,以及它们之间有什么细微差别。
对于OfferVirtualMemory()
,MSDN表示,它与VirtualAlloc()
+ MEM_RESET
非常相似,不同之处在于它从工作集中删除页面,并限制对页面的进一步访问。
所以,基本上它限制了对页面的访问,如果我想再次访问这些页面,我必须调用ReclaimVirtualMemory()
,这很好,但是不应该也从工作集中删除页面? 不应该MEM_RESET
充当madvise(2)
的POSIX MADV_DONTNEED
标志基本上去除进程的页表页,如果我在以后再次访问这些网页时,访问将产生一个软故障,而这些网页将被重新分配再次初始化为零。
如果这是真的,当然页的从工作集的过程中,因为他们基本上得到解除了分配,即使过程保持分配的虚拟地址,看看他们“承诺”中删除。
现在,让我们来看看DiscardVirtualMemory()
:这里MSDN只字未提MEM_RESET
标志,但如果我读这个API的说明,似乎真的的同样的事情VirtualAlloc()
+ MEM_RESET
。
因此,没有人知道,如果有这些API之间的一些差异,而这些细微的差别正确使用的情况下是什么? 如果他们引入了像DiscardVirtualMemory()
这样的新API,那么与旧方法应该有一些区别。
如果我想从使用madvise(2)
和MADV_DONTNEED
和MADV_WILLNEED
的POSIX中移植一个应用程序,模拟此POSIX行为的最佳方法是什么?到现在为止,我用VirtualAlloc()
+ MEM_RESET
为MADV_DONTNEED
和VirtualAlloc()
+ MEM_RESET_UNDO
为MADV_WILLNEED
。 没问题,或者我可以用这些新的API做得更好?
MEM_RESET不会强制将页面从工作集中删除,尽管如果工作集需要减少,它们大概是第一个被选中的页面。 DiscardVirtualMemory()和MEM_RESET之间的明显区别是前者不能被撤消。最合适的API选择可能取决于您的特定用例,对于所有情况都没有单一的最佳选择。 –
让页面无法访问是一项重大改进,当您意外地继续使用它们时,完全没有任何可以获得完全随机AV的内容。我认为将它们从工作集中删除只是其中的一个副作用。但是没有忘记,显然最重要的新功能是*优先权*论据。特别是移动设备可以从中受益。 –
@HansPassant是的,我同意你关于* priority *的说法,并且通过设置这些页面不可用,当然这样的错误很快就会被捕获。 –