我知道在提交之前必须预留内存。当内存被预留时,其他进程无法使用它。但预留内存不会计入可用RAM中。但是它不应该计入吗?因为如果没有其他人可以使用它,那么“可用”有什么好处呢?
还是说有更大的区别?
我知道在提交之前必须预留内存。当内存被预留时,其他进程无法使用它。但预留内存不会计入可用RAM中。但是它不应该计入吗?因为如果没有其他人可以使用它,那么“可用”有什么好处呢?
还是说有更大的区别?
我认为Reserved
可以视为预定地址空间,以便其他人无法分配它(但是我不能在该地址处使用内存,因为它尚未可用)。而Committed
则将该地址空间映射到物理内存,以便可以使用它。
为什么我要预留呢? 为什么不直接获取提交的内存?我有几个原因:
某些应用程序需要特定的地址范围,例如从0x400000到0x600000,但不需要用于存储任何东西。它用于捕获内存访问。例如,如果某个代码访问此类区域,则会被捕获。(某种原因很有用)
某些线程需要存储逐渐扩展的数据。并且数据需要在一个连续的内存块中。最好不要一次提交大量物理内存,因为这是不必要的,也会浪费资源。该内存首先可以被其他线程利用。只有在需要时才提交物理内存。
进程虚拟内存(地址空间)和实际RAM是不同的。你可能有512MB物理内存,但仍然可以访问4GB虚拟地址空间(2GB用户空间)。 进程中的每个地址在任何时候都可以被认为是自由、保留或已提交。
一个进程开始时所有的地址都是自由的,意味着它们可以被提交到内存或者保留供将来使用。在任何自由地址被使用之前,它必须首先被分配为保留或提交。但它不需要被保留就能够被提交。
保留内存的意思是为未来预留虚拟地址空间。它不与物理内存相关联(映射到RAM地址)。而已提交内存的意思是它将与实际RAM相关联,所以你可以在其中存储数据。
我认为最简单的答案是:
例如,如果一个进程的内存限制为1 GB,并且在开始时进行了1 GB的malloc保留,则即使进程在操作系统级别上的内存使用量(已提交的内存)接近0,它也无法再进行任何malloc。