Mar*_*cci 4 c memory winapi memory-management virtual-memory
首先,让我说我非常了解VirtualAlloc()现代操作系统的虚拟内存设施是如何工作的,一般来说是如何工作的。
说,使用Windows API的MAP_RESERVE标志VirtualAlloc(),不使用也MEM_COMMIT,今天有一些实际用途吗?
我的意思是,当我打电话VirtualAlloc()跟MEM_RESERVE|MEM_COMMMIT我都保存和提交页面,但我知道,操作系统将真正分配页面,只有当我尝试写放进去。这种优化几乎发生在所有现代操作系统上。
因此,这种优化的头脑,如果我叫VirtualAlloc()用MEM_RESERVE,然后我把它叫做几次MEM_COMMIT提交页面,是不是同一调用的结果VirtualAlloc()只有一次,指定MEM_RESERVE|MEM_COMMIT?
既然指定只MEM_RESERVE保留页边界地址,不提交真实页,那么MEM_RESERVE|MEM_COMMIT只保留+提交我写的页,不是MEM_RESERVE单独使用,今天浪费时间吗?由于只有1呼吁VirtualAlloc()与MEM_RESERVE|MEM_COMMIT我基本上能获得调用的结果相同VirtualAlloc()1周时间MEM_RESERVE,并调用了好N倍MEM_COMMIT。
作为我所说的证据,我注意到MEM_RESERVE在使用mmap(2)系统调用的Unices/POSIX 系统中根本不存在该工具。此外,您可以在那里“提交”一大块页面调用mmap(2)一次,然后只有在您写入页面时才会真正分配页面,所有页面均由操作系统优化。
那么,MEM_RESERVE只有当内存页是一种宝贵的资源时,单独使用只是过去的事情才有用,所以今天没有用吗?或者,单独使用这个标志(然后用 调用VirtualAlloc()N 次MEM_COMMIT)仍然有一些我缺少的实际用途?
当您提交内存时,内存管理器不会立即为您分配实际页面,但会将它们计入可用总数。 内存管理器永远不会提交比实际存在更多的页面,并且你可以保证当你访问一个提交的页面时,内存就在那里。
MEM_RESERVE的目的是分配虚拟内存地址。您可以根据需要保留尽可能多的地址空间,在 64 位系统上最多可保留许多 TB,即使您没有多少 TB 的实际空间。
默认情况下,Linux 不会将分配限制为实际可用空间量。此“功能”称为overcommit。这意味着在 Linux 上没有单独的保留和提交步骤。如果你想在Linux上预留地址空间,另一个问题建议mmapping一个没有权限的区域。.