为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?



我的教授说,通常,我们只能使用4 GB RAM中的2 GB,因为另外2 GB由操作系统使用。但是,在运行某些测试时,我看到使用进程的 4 GB 虚拟内存空间,我最多只能使用VirtualAlloc()函数分配不到 2 GB。为什么会这样(我预计它大约超过 3 GB(?

据我所知,堆栈、数据和代码段仅使用少量内存。我的一个朋友告诉我,另外 2 GB 就像教授说的那样作系统使用。但是,我认为教授的意思是 2 GB 的physical memory.它不在这个过程的virtual memory。 谁能解释一下这里发生了什么?谢谢。

一些信息:

物理内存:4GB。

虚拟内存:4GB。

操作系统:视窗 10。

你的教授是对的 - 2 GB的虚拟内存是内核内存。 这样,当发生上下文切换时,这 2 GB 可以保留,只有其他 2 GB 需要交换。它有助于性能。

您还可以在此处查看Microsoft的说明,包括如何将用户部分增加到 3 GB 的说明。

顺便说一下,在 64 位机器中情况有所不同,其中虚拟内存要大得多。

它与RAM没有任何关系,VirtualAlloc((中的虚拟不会说谎。 当然,上部的2GB保留给操作系统,它需要的最大块是文件系统缓存和视频内存孔径。 后者是/3GB 启动选项不再起作用的更大原因。 正如您发现的那样,您永远无法获得完整的 2GB,您的程序也需要地址空间,并且始终是第一个。 当它作系统加载器加载时,它得到了它,剩下的可以由VirtualAlloc分配。

地址空间通常远小于 2 GB,往往会被加载的 DLL 碎片化。 请注意,即使您没有链接它们的导入库,您也可能使用一些,反恶意软件和云存储实用程序可能会注入它们。 程序中的任何堆分配也往往会导致拆分。

这些问题已经过时了,所有现代机器都启动64位操作系统。 32 位程序现在在模拟器中运行,操作系统不再需要上限。 现在,您可以通过使用/LARGEADDRESSAWARE 链接器选项链接来接近 4GB。 该选项本身为您提供了一个很好的提示,为什么他们最初决定像这样拆分地址空间被认为是一个好主意。 也是 64 位操作系统中采用的方法。

最新更新