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

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

还是有一些更大的区别?

在Win32环境下,“保留”意味着地址空间在请求它的进程内分配。 例如,这可以用来为一个并不是所有需要的大缓冲区预留空间,但是当它需要的时候,它需要是连续的。

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

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

我喜欢查看Reserved作为预订的地址空间,以便其他人不能分配(但我不能使用该地址的内存,因为它尚未可用)。 并Committed 地址空间映射物理内存以便可以使用。

我为什么要保留 ? 为什么不只是得到承诺的内存? 我有几个理由:

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

  2. 有些线程需要逐步扩展数据。 数据需要在一块连续的内存中。 最好不要一次性投入大量的物理记忆,因为这是不必要的,而且会是一种浪费。 内存可以被其他一些线程使用。 物理内存仅在需求时才提交。

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

一个进程开始于所有的地址空闲,这意味着它们可以被自由地提交到内存或者保留以供将来使用。在任何空闲地址可以被使用之前,它必须首先被分配为保留的提交的。 但是不需要保留,以使其被执行。

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

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