我知道在提交之前必须保留内存。当它被保留时,没有其他进程可以使用它。但是,保留的内存不计入可用的RAM。但不应该吗?因为如果没有其他人可以使用它,那么“可用”有什么用呢?
或者是否有更大的差异?
答案 0 :(得分:47)
在Win32的上下文中,“保留”表示地址空间在请求它的进程中分配 。例如,这可以用于为大型缓冲区保留空间,而不需要立即使用,但是当需要它时,它需要是连续的。
保留内存根本不与其他进程交互,因为每个进程都有自己的专用地址空间。所以“当它被保留,没有其他进程可以使用它”这样的说法是没有意义的,因为进程通常无法在另一个进程的地址空间中分配内存。
当请求提交保留页面(为它们分配后备存储)时,由于缺少物理内存(或页面文件),该操作可能会失败。
答案 1 :(得分:11)
我想将Reserved
视为预订地址空间,以便其他人无法分配它(但我不能在该地址使用内存,因为它还没有可用)。并Committed
作为映射,将空间扩展到物理内存,以便可以使用它。
为什么我要保留?为什么不直接获得承诺?我有几个原因:
某些应用程序需要特定的地址范围,例如从0x400000到0x600000,但不需要内存来存储任何内容。它用于捕获内存访问。例如,如果某些代码访问了这样的区域,它将被捕获。 (因某种原因有用。)
某些线程需要存储逐步扩展的数据。并且数据需要在一个连续的内存块中。最好不要一次性提供大的物理内存,因为它不需要并且会是一种浪费。一些其他线程首先可以使用内存。物理内存仅在需要时提交。
答案 2 :(得分:5)
处理虚拟内存(地址空间)和实际RAM都不同。你可以拥有512MB的物理内存,但你的进程仍可以处理4GB的虚拟地址空间(2GB用户空间) 进程中的每个地址都可以被视为在任何给定时间的空闲,保留或提交。
流程以所有地址免费开始,这意味着它们可以自由提交 在使用任何空闲地址之前,必须首先将其分配为保留的 OR 。但是不需要保留它以便它被提交。
保留内存意味着为将来的目的保留virtaul地址空间。它与物理RAM(映射到RAM地址)无关。在提交内存意味着它将与实际RAM相关联,以便您可以在其中存储数据。