gpt4 book ai didi

winapi - 用于虚拟内存管理的新 Windows 8.1 API : `DiscardVirtualMemory()` vs `VirtualAlloc()` and `MEM_RESET` and `MEM_RESET_UNDO`

转载 作者:可可西里 更新时间:2023-11-01 09:24:02 33 4
gpt4 key购买 nike

Windows 8.1/Server 2012RC2 刚刚引入了用于虚拟内存管理的新 API:OfferVirtualMemory()ReclaimVirtualMemory()DiscardVirtualMemory()、它们的用法非常简单,只需查看它们的名称即可。

我无法理解这些 API 如何针对 VirtualAlloc() 以及标志 MEM_RESETMEM_RESET_UNDO 工作,以及什么是细微差别。

对于 OfferVirtualMemory(),MSDN 说它与 VirtualAlloc()+MEM_RESET 非常相似,只是它从工作集,并限制对页面的进一步访问。

所以,基本上它限制了对页面的访问,如果我想再次访问这些页面,我必须调用 ReclaimVirtualMemory()。很好,但是 MEM_RESET 不应该也从工作集中删除页面吗?MEM_RESET 不应该充当 madvise(2) 的 POSIX MADV_DONTNEED 标志,它基本上从进程的页面表中删除页面,如果我以后再次访问这些页面,访问将产生软故障,这些页面将再次重新分配,初始化为零。

如果这是真的,当然,页面会从进程的工作集中删除,因为它们基本上会被释放,即使进程保持分配的虚拟地址,并看到它们“已提交”。

现在,让我们看看 DiscardVirtualMemory():这里 MSDN 没有提到 MEM_RESET 标志,但是如果我阅读这个 API 的描述,它似乎真的VirtualAlloc()+MEM_RESET 相同。

那么,有谁知道这些 API 之间是否存在一些差异,这些细微差异的正确用例是什么?如果他们引入了一个全新的 API,例如 DiscardVirtualMemory(),那么与旧方法应该会有一些区别。

如果我想从 POSIX 移植一个应用程序,它使用 madvise(2)MADV_DONTNEEDMADV_WILLNEED,什么是最好的方法模仿这种 POSIX 行为?到目前为止,我使用 VirtualAlloc()+MEM_RESET 来实现 MADV_DONTNEEDVirtualAlloc()+MEM_RESET_UNDO 用于 MADV_WILLNEED。这样可以吗,或者我可以使用这些新 API 做得更好?

最佳答案

DiscardVirtualMemory on MSDN

When the region of memory is again accessed by the application, the backing RAM is restored, and the contents of the memory is undefined.

如果我从字里行间看出,那就是,

  • 当您访问它时,其中一些可能仍然存在
  • 允许在页面提交时为您提供垃圾初始化页面
  • 如果机器实际上受到内存限制,一些页面有时可能会被零初始化

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

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

关于winapi - 用于虚拟内存管理的新 Windows 8.1 API : `DiscardVirtualMemory()` vs `VirtualAlloc()` and `MEM_RESET` and `MEM_RESET_UNDO` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023771/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com