繁体   English   中英

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

[英]Why can I only allocate 2 GB on a 4 GB virtual memory space?

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

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

一些信息:

物理内存:4GB。

虚拟内存:4GB。

操作系统:Windows 10。

您的教授是正确的-2 GB的虚拟内存是内核内存。 这样,当发生上下文切换时,这2 GB可以保留,仅需要交换另外2 GB。 它有助于提高性能。

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

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

它与RAM没有任何关系,VirtualAlloc()中的函数不会说谎。 当然,上面的2GB预留给操作系统,它需要的最大块是文件系统缓存和视频内存孔。 后者是/ 3GB引导选项不再起作用的更大原因。 如您所知,您永远无法获得完整的2GB,您的程序也需要地址空间,并且始终是第一位。 它是由OS加载程序加载时得到的,剩下的可以由VirtualAlloc划分。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM