c - `MEM_RESERVE` 的 `VirtualAlloc()` 标志今天真的有用吗?

标签 c winapi memory memory-management virtual-memory

首先,让我说我很清楚如何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 mmapping an area with no permissions. .

关于c - `MEM_RESERVE` 的 `VirtualAlloc()` 标志今天真的有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672069/

相关文章:

c - Fortran 中的模块 "header"

java - 如何防止 JNI 覆盖 GetLastError()

c - 强制使用 ANSI 编辑控件而不是 comctl32 编辑控件

linux - 我可以将 O_DIRECT 用于写入请求以避免在电源故障期间丢失数据吗?

c++ - 为什么在 new 之前添加::operator 关键字用于内存分配?

c - 如何在linux中模拟socket/tcp编程的异常情况,例如终止连接的一侧?

c - -> 和点有什么区别

c++ - 递归函数的内存分配

你能把更小的结构放入更大的内存块吗?

c - EOF 在 C 中如何工作?