我想知道提交大小 (在任务pipe理器中可见)和虚拟大小 (在SysInternals的Process Explorer中可见)之间的确切区别。
Process Explorer中的 “ 虚拟大小”参数看起来像一个stream程的总体虚拟内存使用情况的更准确的指标。 但是提交大小始终小于虚拟大小 ,我想它不包括进程正在使用的所有虚拟内存。 我希望有人解释这些参数中包含的内容。
内存可以保留,提交,第一次访问,并成为工作集的一部分。 当内存被保留时 ,一部分地址空间被搁置,没有其他事情发生。
当提交内存时,操作系统保证相应的页面原则上可以存在于物理RAM或页面文件中。 换句话说,它将计入系统中可用页面的硬性限制,并正式创建页面。 也就是说,它创建页面并假装它们存在(实际上它们还不存在)。
当内存第一次被访问时, 正式存在的页面被创建,所以它们确实存在。 将零页面提供给进程,或者将数据从映射读入页面。 页面被移动到进程的工作集 (但不一定会永远留在那里)。
每个正在运行的进程都有一些实际和逻辑上在RAM中的页面,也就是说这些页面是存在的,它们也是“正式”存在的。 这是进程的工作集。
而且,每个正在运行的进程都有实际在RAM中的页面,但是不再正式存在于RAM中。 他们可能在所谓的“备用列表”或缓冲区缓存的一部分,或者不同的东西。 当这些被访问时,OS可以简单地将它们移动到工作集中。
最后,每个进程的页面都不在RAM中(交换或者不存在)。
虚拟大小包括进程保留的所有页面的大小。
提交大小只包含已提交的页面。
也就是说,从外行的角度来说,“虚拟大小”几乎是你自己的问题,只受地址空间大小的限制,而“提交大小”是每个人的问题,因为它消耗了全局有限的资源(RAM加swap)。 因此影响其他进程 。
提交大小是进程的分页文件中保留的空间量。 当其页面需要被换出来为其他进程在RAM中留出空间时使用。
是的,虚拟内存的大小将会更大,因为它包含了页面文件不支持的页面。 至少在EXE和非重定位DLL中的代码和资源部分。 必要时,可以简单地将这些页面从文件中丢弃并重新加载。 所有的操作系统DLL都适合这个类别。 另外还有进程使用的任何内存映射文件。 SysInternals的VMMap实用程序可以提供洞察力。
虚拟大小是进程的虚拟地址空间的大小。
分配内存时,可以请求一个地址范围,而不需要实际提交内存。 这些地址不会指向物理内存,直到使用第二个分配调用来提交它们。
阅读更多关于VirtualAlloc 。 Linux有mmap函数可以做同样的事情。