保留和提交的内存有什么区别?

时间:2010-03-13 23:14:39

标签: windows memory-management

我知道在提交之前必须保留内存。当它被保留时,没有其他进程可以使用它。但是,保留的内存不计入可用的RAM。但不应该吗?因为如果没有其他人可以使用它,那么“可用”有什么用呢?

或者是否有更大的差异?

3 个答案:

答案 0 :(得分:47)

在Win32的上下文中,“保留”表示地址空间在请求它的进程中分配 。例如,这可以用于为大型缓冲区保留空间,而不需要立即使用,但是当需要它时,它需要是连续的。

保留内存根本不与其他进程交互,因为每个进程都有自己的专用地址空间。所以“当它被保留,没有其他进程可以使用它”这样的说法是没有意义的,因为进程通常无法在另一个进程的地址空间中分配内存。

当请求提交保留页面(为它们分配后备存储)时,由于缺少物理内存(或页面文件),该操作可能会失败。

答案 1 :(得分:11)

我想将Reserved视为预订地址空间,以便其他人无法分配它(但我不能在该地址使用内存,因为它还没有可用)。并Committed作为映射,将空间扩展到物理内存,以便可以使用它。

为什么我要保留?为什么不直接获得承诺?我有几个原因:

  1. 某些应用程序需要特定的地址范围,例如从0x400000到0x600000,但不需要内存来存储任何内容。它用于捕获内存访问。例如,如果某些代码访问了这样的区域,它将被捕获。 (因某种原因有用。)

  2. 某些线程需要存储逐步扩展的数据。并且数据需要在一个连续的内存块中。最好不要一次性提供大的物理内存,因为它不需要并且会是一种浪费。一些其他线程首先可以使用内存。物理内存仅在需要时提交。

答案 2 :(得分:5)

处理虚拟内存(地址空间)和实际RAM都不同。你可以拥有512MB的物理内存,但你的进程仍可以处理4GB的虚拟地址空间(2GB用户空间) 进程中的每个地址都可以被视为在任何给定时间的空闲,保留或提交。

流程以所有地址免费开始,这意味着它们可以自由提交 在使用任何空闲地址之前,必须首先将其分配为保留的 OR 。但是不需要保留它以便它被提交。

保留内存意味着为将来的目的保留virtaul地址空间。它与物理RAM(映射到RAM地址)无关。在提交内存意味着它将与实际RAM相关联,以便您可以在其中存储数据。

http://msdn.microsoft.com/en-us/library/ms810627.aspx