保留对犯大阵列使用的VirtualAlloc +保留记忆的好处(Benefits of reserv

2019-09-17 02:29发布

我写一个C ++程序,基本上具有非常大的阵列工作。 在Windows中,我使用的VirtualAlloc分配内存以我的阵列。 现在,我完全理解保留,并承诺使用VirutalAlloc内存之间的区别; 不过,我想知道是否有犯内存页逐页以保留区域的任何利益。 特别是,MSDN( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx )包含了MEM_COMMIT选项如下解释:

实际的物理页面不分配,除非/直到虚拟地址实际上访问。

我的实验证实了这一点:我可以保存和提交的几个GB的内存wihtout增加我的过程的内存使用情况(如在任务管理器中显示); 当我真正访问内存的实际内存只得到分配。

现在,我看到好几个例子争辩说,应该保留地址空间的很大一部分,然后提交内存页逐页(或在一些较大的块,这取决于应用程序的逻辑)。 如上所述,然而,存储器似乎并不一个访问它之前被提交; 因此,我想知道是否有犯内存页逐页任何实际的好处。 事实上,提交内存页逐页实际上可能减缓我的程序下来,由于许多系统调用的实际comitting内存。 如果我提交整个区域一次,我要为只有一个系统调用,但内核似乎是足够聪明,实际上只分配,我实际使用的内存。

我将不胜感激,如果有人可以给我解释一下哪种策略更好。

Answer 1:

不同的是,承诺“背影”对页面文件的存储。 举个例子:

  1. 给定的物理RAM的2GB和交换的2GB(假设固定大小的交换用于此目的)。
  2. 储备6GB - 确定。
  3. 提交第一2GB - 确定。
  4. 提交剩余4GB - 失败。
  5. 扩展交换文件到8GB
  6. 提交剩余4GB - 成功。

之所以使用MEM_COMMIT将主要是用于运行时错误抑制(表观稳定性)。 如果您有承诺点播页面的过程,然后总有一个机会,一个提交沿的路,如果它超过了内存+可用的交换量可能会失败。 当内存已经由页面文件备份,那么你有一个强大的保证内存可供使用,从现在直到你释放的地步。

有许多理由去一个或其他方式,我不认为有任何完美的科学,以决定哪些。 单独MEM_RESERVE只需要非常大的稀疏数组的场景,例如:它具有至多25-33%的利用率(用于加速哈希表的流行技术等)的多千兆字节数组。

几乎一切是灰色地带,你很可能会有两种方式 - MEM_COMMIT的前期会使自己的应用程序多一点稳定,基本上是给它优先于物理内存在可能的按需调配竞争的应用程序。 (如果你抓住了公羊第一那么你的应用程序会在物理内存耗尽最后罚站),同时,如果你不实际使用所有的RAM,那么你可能最终限制的多任务处理您的潜力客户端的机器,或通过越来越多的页面文件造成不必要的浪费的磁盘空间。



文章来源: Benefits of reserving vs. committing+reserving memory using VirtualAlloc on large arrays