首先,让我说,我非常清楚VirtualAlloc()是如何工作的,以及现代操作系统的虚拟内存设施是如何工作的。
说,使用MAP_RESERVEWindows API的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不是浪费时间吗?
只要用VirtualAlloc()调用MEM_RESERVE|MEM_COMMIT一次,用VirtualAlloc()调用MEM_RESERVE1次,用MEM_COMMIT调用几个N次,基本上就可以得到相同的结果。
作为我所说的一个证明,我注意到在使用UCIS/POSIX系统的MEM_RESERVE SysCALL中根本不存在mmap(2)设施。
在那里,您可以“提交”一次调用mmap(2)的大块页面,然后只有当您写入这些页面时才会真正分配这些页面,所有这些页面都由操作系统优化。
那么,仅仅使用MEM_RESERVE只是过去的事情吗?只有当内存页是一种宝贵的资源,而今天却毫无用处?
或者,单独使用这个标志(然后用VirtualAlloc()调用MEM_COMMITN次)仍然有一些我缺少的实际用途?

最佳答案

当您提交内存时,内存管理器不会立即为您分配实际页,但it does count them towards the total number available.内存管理器将不会提交比实际存在更多的页,并且保证当您访问已提交的页时,内存在那里。
MEM_RESERVE的目的是分配虚拟内存地址。您可以根据需要保留尽可能多的地址空间,在64位系统上最多可保留数TB的地址空间,即使您没有多少TB的实际空间。
默认情况下,Linux不会将分配限制为实际可用空间。这个“特性”叫做overcommit。这意味着在Linux上没有单独的保留和提交步骤。如果要在Linux上保留地址空间,another question recommends mmapping an area with no permissions.

08-27 07:38