【发布时间】:2015-10-18 18:12:40
【问题描述】:
首先,让我说我非常了解VirtualAlloc() 的工作原理以及现代操作系统的虚拟内存设施一般是如何工作的。
说,使用VirtualAlloc() Windows API 的MAP_RESERVE 标志,没有还使用MEM_COMMIT,今天有一些实际用途吗?
我的意思是,当我用MEM_RESERVE|MEM_COMMMIT 调用VirtualAlloc() 时,我会保留和提交页面,但是我知道操作系统只会在我尝试写入页面时才真正分配页面。
这种优化几乎发生在所有现代操作系统上。
因此,考虑到这种优化,如果我用MEM_RESERVE 调用VirtualAlloc(),然后我用MEM_COMMIT 调用它几次来提交页面,不是 same 结果只调用一次VirtualAlloc(),指定MEM_RESERVE|MEM_COMMIT?
由于仅指定MEM_RESERVE 将仅保留页面边界地址,而不提交真实页面,但是MEM_RESERVE|MEM_COMMIT 将仅保留+提交我写入的页面,不单独使用MEM_RESERVE,今天浪费时间?
只需 1 用MEM_RESERVE|MEM_COMMIT 调用VirtualAlloc(),我基本上可以获得相同的结果,即用MEM_RESERVE 调用VirtualAlloc() 1 次并用MEM_COMMIT 调用它N 次。
作为我所说的证明,我注意到 MEM_RESERVE 设施在使用 mmap(2) 系统调用的 Unices/POSIX 系统中根本不存在。
您还可以在那里“提交”一大块调用mmap(2) 的页面,然后只有在您写入页面时才会真正分配页面,所有这些都由操作系统优化。
那么,单独使用MEM_RESERVE 是否只是旧时的东西,只有当内存页面是宝贵的资源时才有用,所以今天没用?
或者,单独使用这个标志(然后用MEM_COMMIT 调用VirtualAlloc() N 次)仍然有一些我缺少的实际用途?
【问题讨论】:
-
见stackoverflow.com/q/10494588/613130 区别在于交换文件的处理(如果那里的响应正确的话)
-
在地址空间有限的 32 位系统上,我可以看到
MEM_RESERVE本身仍然有用。在 64 位系统上可能没什么意义。
标签: c winapi memory memory-management virtual-memory