有人知道32位Windows系统进程无法处理4GB内存而只有2GB的原因吗?
它只是Windows系统的限制吗?
注意:我不是指可寻址的总内存,而是指单个进程可以寻址的内存。
答案 0 :(得分:2)
简单的答案是,某些虚拟地址空间是为操作系统保留的,用于将内容映射到其中,例如自己的内存空间,VM页表,硬件设备等。
理论上它可以提供更多可用(实际上你可以告诉Windows让你有〜3GB,但是如果某些软件/驱动程序/等有问题,它默认没有启用),但你赢了'获得完整的4GB而不会削弱操作系统有效运行系统的能力。
即使您在Windows上将用户区空间扩展到3GB,默认情况下应用程序也不会获得额外的范围。 Windows要求应用程序设置一个标志(在MSVC下使用/ LARGEADDRESSAWARE构建,不了解其他构建环境)或限制为2GB,以避免因软件对地址做出假设而导致的任何问题。
答案 1 :(得分:2)
为什么在32位Windows系统进程中无法处理4GB内存
但他们肯定能。您的代码通常不具有寻址地址空间上部所需的访问权限。用户模式代码在环3运行,到达上部需要响铃0访问权限。内核模式。
好的,这有点诙谐,操作系统内核和具有ring 0访问权限的驱动程序通常不被认为是该过程的一部分。即使它们在逻辑上是,它们也映射到每个进程中的相同地址。从技术上讲,可以动态映射页面,因为进程从ring 3切换到ring 0模式,但这会使内核模式转换过于昂贵和麻烦。
直观地说:由ReadFile()填充的文件缓冲区可能具有与一大块操作系统代码或数据重叠的地址。最坏的情况是,它可能与文件系统驱动程序代码重叠。或者,更有可能的是文件系统缓存。所需的页面翻转和双重复制会使读取变得不可预测地变慢。最简单的架构选择,以及1992年制造的那个,当时没有人能够负担得起一块千兆字节的RAM,就是简单地将地址空间切成两半,这样就不会有任何重叠。
这是一个已解决的问题,32位版本的Windows变得越来越少,32位进程可以在64位版本的Windows上处理4 GB。它只需要EXE头中的一个选项位,即链接器和editbin.exe中可用的/ LARGEADDRESSAWARE选项设置的位
答案 2 :(得分:0)
32位Windows系统在用户和系统之间平均分配4GB虚拟内存范围,这样每个系统只有2GB(虚拟)可用空间。
请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366912%28v=vs.85%29.aspx