2015-08-15 22 views
3

的Windows 8.1 /服务器2012RC2虚拟内存管理刚刚推出了新的API:OfferVirtualMemory()ReclaimVirtualMemory()DiscardVirtualMemory() ,他们的使用非常简单,只需查看他们的名字即可。新的Windows 8.1的API,虚拟内存管理:`DiscardVirtualMemory()``VS的VirtualAlloc()`和`MEM_RESET`和`MEM_RESET_UNDO`

我无法得到的东西是这些API对VirtualAlloc()加上标记MEM_RESETMEM_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_DONTNEEDMADV_WILLNEED的POSIX中移植一个应用程序,模拟此POSIX行为的最佳方法是什么?到现在为止,我用VirtualAlloc() + MEM_RESETMADV_DONTNEEDVirtualAlloc() + MEM_RESET_UNDOMADV_WILLNEED。 没问题,或者我可以用这些新的API做得更好?

+1

MEM_RESET不会强制将页面从工作集中删除,尽管如果工作集需要减少,它们大概是第一个被选中的页面。 DiscardVirtualMemory()和MEM_RESET之间的明显区别是前者不能被撤消。最合适的API选择可能取决于您的特定用例,对于所有情况都没有单一的最佳选择。 –

+2

让页面无法访问是一项重大改进,当您意外地继续使用它们时,完全没有任何可以获得完全随机AV的内容。我认为将它们从工作集中删除只是其中的一个副作用。但是没有忘记,显然最重要的新功能是*优先权*论据。特别是移动设备可以从中受益。 –

+0

@HansPassant是的,我同意你关于* priority *的说法,并且通过设置这些页面不可用,当然这样的错误很快就会被捕获。 –

回答

2

DiscardVirtualMemory on MSDN

当存储器的区域被再次由应用程序访问时,背衬 RAM被恢复,并且存储器的内容是不确定的。

如果我行,那说,念之间

  • 一些什么是有可能依然存在,当你访问它
  • 允许给你垃圾初始化页面时那些页面提交
  • 如果机器实际上受限于内存,某些页面可能会初始化为零零点

如果您使用旧API重置虚拟地址范围,则不会发生这种情况。在这种情况下,保证在您稍后访问这些页面时提供零初始化页面。

这使得Windows可以减少对归零页面池的压力,当程序想要变得更好时,并告诉Windows可以丢弃一些已释放的内存范围。

+0

是的,这是一个非常有趣的观点。我赞同你。那么您认为Windows通过添加这些API来添加更多的“精细”粒度? –