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

时间:2017-07-30 08:07:28

标签: c++ memory memory-management windows-10

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

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

一些信息:

物理内存:4GB。

虚拟内存:4GB。

操作系统:Windows 10。

2 个答案:

答案 0 :(得分:4)

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

您还可以看到Microsoft的here解释,包括如何将用户部分增加到3 GB的说明。

顺便说一句,64位计算机的情况有所不同,虚拟内存要大得多。

答案 1 :(得分:3)

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

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

这些问题变得过时,所有现代机器都启动了64位操作系统。现在,32位程序在仿真器中运行,操作系统不再需要上限。现在,通过链接/LARGEADDRESSAWARE linker option,您可以获得接近4GB的批次。这个选项本身给你一个很好的暗示,为什么他们最初决定分割地址空间就像是一个好主意。也是在64位操作系统中采用的方法。