“保留内存”和“已提交内存”有什么区别?

59

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

还是说有更大的区别?


你能提供一下你在哪里找到“保留”这个定义的参考文献吗? - Greg Hewgill
http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx - glutz78
6
请查看马克·拉辛诺维奇在PDC 10上的演讲,名为“PDC10:揭秘Windows内存管理之谜:第一部分”。他详细地介绍了这个主题。链接为http://player.microsoftpdc.com。 - NigelTufnel
1
Mark Russinovich的演示可在https://www.youtube.com/watch?v=AjTl53I_qzY找到。 - fractor
@fractor 非常感谢。 - golosovsky
4个回答

55
在Win32环境下,“reserved”表示在“请求它的进程”中分配地址空间。例如,可以用于为不完全需要的大型缓存保留空间,但当需要时,这些空间需要是连续的。
预留内存完全不与其他进程交互,因为每个进程都有自己私有的地址空间。因此,“当它被预留时,没有其他进程可以使用它”这一说法是无意义的,因为进程通常不能在另一个进程的地址空间中分配内存。
当请求将预留的页面提交(为其分配后备存储)时,由于缺乏物理内存(或页面文件),该操作可能会失败。

1
为它们分配了后备存储区:您的意思是仅存储在缓存中的数据称为保留,当它被写入RAM或页面文件时,则称为提交? - idbrii
13
不,"cache"和"reserved"是不相关的概念。保留内存有点像房地产开发商声明未来将建造房屋的土地,目前那里还没有任何东西,但其他人也不能在那里建造房屋。而提交则是真正建造房屋并设置基础设施如电力和下水道。另一方面,缓存是优化让中央处理器(CPU)运行更快的方法,所有数据仍然存储在RAM中。 - Greg Hewgill
3
将数据写入内存页面是否会导致该页面被提交?(那么“保留”和“提交”的区别在于,“保留”已经被分配,而“提交”已经被使用。) - idbrii
8
在Windows系统中,分配内存和写入内存是两个独立的步骤(写入未分配的页面通常会导致页面错误)。要了解更多信息,请参考VirtualAlloc函数。 - Greg Hewgill
1
@idbrii 不是的。保留和提交与物理内存(即RAM)的分配无关,只涉及虚拟内存。对已提交页面的第一次内存访问会导致为其分配一个RAM页面并与之关联。这就是为什么提交可以比实际使用的物理内存要大得多 - 许多应用程序提交的内存远远超过它们实际使用的量。 - Jamie Hanrahan
显示剩余3条评论

16

我认为Reserved可以视为预定地址空间,以便其他人无法分配它(但是我不能在该地址处使用内存,因为它尚未可用)。而Committed则将该地址空间映射物理内存,以便可以使用它。

为什么我要预留呢? 为什么不直接获取提交的内存?我有几个原因:

  1. 某些应用程序需要特定的地址范围,例如从0x400000到0x600000,但不需要用于存储任何东西。它用于捕获内存访问。例如,如果某个代码访问此类区域,则会被捕获。(某种原因很有用)

  2. 某些线程需要存储逐渐扩展的数据。并且数据需要在一个连续的内存块中。最好不要一次提交大量物理内存,因为这是不必要的,也会浪费资源。该内存首先可以被其他线程利用。只有在需要时才提交物理内存。


2
对于2,除非数据被访问,否则工作集中实际上不会分配任何空间(这也包括页面表结构,如PTE),但是分页文件将增长以确保在需要时可以使用内存。这确实是一种相当低效的磁盘空间利用方式。 - Mihai Albert

11

进程虚拟内存(地址空间)和实际RAM是不同的。你可能有512MB物理内存,但仍然可以访问4GB虚拟地址空间(2GB用户空间)。 进程中的每个地址在任何时候都可以被认为是自由、保留或已提交。

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

保留内存的意思是为未来预留虚拟地址空间。它不与物理内存相关联(映射到RAM地址)。而已提交内存的意思是它将与实际RAM相关联,所以你可以在其中存储数据。

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


5
一个小问题:虚拟内存在分配前不需要“单独保留”。VirtualAlloc可以一次性进行保留和分配。但是,“保留”必须完成。此外,只有在出现后续页面错误时,“提交”才会实际上“分配”RAM。我试图将“it will be associated”编辑为“it can be associated”。我还想在结尾添加以下句子:“只有在访问已经提交的区域时,才会实际分配RAM,且是按页逐个完成的。”另外还有一件事:使用可用页面的另一种方式是映射内存。 - Jamie Hanrahan

0

我认为最简单的答案是:

  • 你在虚拟地址空间中保留内存,以便同一进程内的其他代码部分无法获取它
  • 你将内存提交到物理RAM/交换空间中,以便其他进程无法获取它

例如,如果一个进程的内存限制为1 GB,并且在开始时进行了1 GB的malloc保留,则即使进程在操作系统级别上的内存使用量(已提交的内存)接近0,它也无法再进行任何malloc。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接