首先,让我说我很清楚如何VirtualAlloc()
工作原理以及现代操作系统的虚拟内存设施通常如何工作。
表示,使用MAP_RESERVE
VirtualAlloc()
的标志Windows API,不同时使用 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
并用 MEM_COMMIT
调用它 N 次.
作为我所说内容的证明,我注意到 MEM_RESERVE
在使用 mmap(2)
的 Unices/POSIX 系统中根本不存在该设施系统调用。
您还可以在那里“提交”一大块调用 mmap(2)
的页面。一次,然后只有当你写入它们时才会真正分配页面,所有这些都由操作系统优化。
所以,正在使用 MEM_RESERVE
只有当内存页面是一种宝贵的资源时,单独只是过去的东西才有用,所以今天没用了?
或者,单独使用此标志(然后使用 VirtualAlloc()
调用 MEM_COMMIT
N 次)仍然有一些我缺少的实际用途?
最佳答案
当您提交内存时,内存管理器不会立即为您分配实际页面,而是it does count them towards the total number available.内存管理器永远不会提交比实际存在的页面更多的页面,并且可以保证当您访问已提交的页面时,内存就在那里。
MEM_RESERVE
的目的是分配虚拟内存地址。您可以根据需要保留任意多的地址空间,在 64 位系统上最多可保留数 TB,即使您没有多少 TB 的实际空间也是如此。
默认情况下,Linux 不会将分配限制为实际可用空间量。此“功能”称为过度使用。这意味着在 Linux 上没有单独的保留和提交步骤。如果您想在 Linux 上保留地址空间,another question recommends mmap
ping an area with no permissions. .
关于c - `MEM_RESERVE` 的 `VirtualAlloc()` 标志今天真的有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672069/