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

glu*_*z78 49 windows memory-management

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

或者是否有更大的差异?

Gre*_*ill 49

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

保留内存根本不与其他进程交互,因为每个进程都有自己的私有地址空间.因此,"当它被保留,没有其他进程可以使用它"的声明是没有意义的,因为进程通常无法在另一个进程的地址空间中分配内存.

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

  • @pydave:不,"缓存"和"保留"是不相关的概念.保留记忆有点像房地产开发商声称后来将包含房屋的土地.那里什么都没有,但也没有其他人可以在那里建房子.承诺实际上是建造房屋和建立电力和下水道等基础设施.另一方面,缓存是一种优化,可以使CPU运行得更快,所有数据仍然存储在RAM中的某个位置. (9认同)
  • @pydave:在Windows中,提交内存是一个单独的步骤,必须在尝试写入内存之前发生(写入未提交的页面通常会导致页面错误).有关详细信息,请参阅[VirtualAlloc](http://msdn.microsoft.com/en-us/library/aa366887%28v=vs.85%29.aspx)函数. (8认同)
  • 那么将数据写入内存页面会导致该页面被提交吗?(那么reserved和committed的区别就是reserved已经分配了,commited已经被使用了。) (3认同)

kao*_*sad 13

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

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

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

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

  • 对于 2,除非触及该数据,否则工作集中实际上不会分配任何空间(其中还包括页表结构,例如 PTE),但是分页文件将增长以保证在需要时可以使用内存。这确实是对磁盘空间的一种非常低效的利用。 (2认同)

小智 6

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

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

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

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

  • 一个狡辩:虚拟内存不需要在提交之前作为单独的步骤保留.VirtualAlloc可以在一次调用中保留和提交.但必须要做"储备".此外,提交实际上并不"分配"RAM; 只有后续页面错误才能这样做.我(试图?)编辑"它将被关联"到"它可以相关联".我还要在句末添加以下句子:"在访问已提交的区域之前,不会分配实际的RAM,并且是逐页完成的." 另外一件事:使用免费页面的另一种方法是映射内存. (3认同)