这两天果壳上有些人问到了关于在32位系统下使用4G或以上内存的问题。对于“32位操作系统能否使用4G或以上的内存”这个问题,在
网络上争论也是很多。下面,我就我自己对操作系统内存分配的理解,谈谈我的观点。
32位、64和“最大内存量”是怎么回事首先需要明确一下,32位也好,64位也好,这个概念是同时存在于软件、系统、主板芯片组和CPU四个方面的。对于操作系统到底最多能支持多少内存这个问题,其实不是操作系统一方面说了算的。
目前不少人可能对于CPU的寻址概念有些模糊,认为CPU的寻址范围与其平常概念上的位宽直接联系,即所谓的32位CPU寻址范围为2^32,64位的则是2^64。其实这是一个错误的概念,对于CPU来说,这个的位宽一般是指是其数据总线位宽,和寻址能力并无直接联系。至于一个CPU的寻址位宽是多少则要看其具体的设计。
而对于主板芯片组这方面来说,目前的Intel x86平台采取的是内存映射技术(Memory-Mapped I/O, MMIO),也是PCI规范的一部分,也就是将I/O设备放置在内存空间而非I/O空间,从处理器和操作系统看来,访问一个硬件也就是访问内存空间,因此主板的芯片组也存在一个寻址位宽的问题,当然也有可能成为内存总量的一个瓶颈。当然了,现在的新主机一般都不会有这个问题了。
说完了硬件层面的概念,我们继续看操作系统是如何与CPU进行“交流”的:
Windows对于内存的管理,采取的是分页机制,每个进程都占有一定的虚拟地址空间,在这个机制下,这个空间一部分被映射到物理内存,一部分映射到虚拟内存(存在于硬盘上的一个或多个空间),还有一部分则可能什么也没有映射。同时,在CPU中,会设置一个“分页标志位”,如果CPU在运行指令时发现这个分页标志被设置,则会根据页目录和页表中的对应关系,将指令中的虚拟地址转换为实际的物理地址。
目前的32位系统分页大小为4K,寻址位宽为32位,因此,第0个分页的地址是0x00000000,第1个分页地址从0x00001000开始,以此类推。所以,在目前的32位系统中,用到了32位中的高20位来标记物理页,剩余的12位用于添加一些标记信息等。这样,就可以支持到最大(2^20)*4096=4GB内存,除掉我们上面所说的为I/O保留的内存映射空间和操作系统本身保留的内存,剩下的就是我们在任务管理器里能看到的可用空间。
上图显示的是我的电脑目前的内存分配情况32位系统下的悲剧,这个图是从网上搜罗来的如何突破32位系统的4G限制其实PAE并不是一个新鲜东西,也不是操作系统弄出来的特性为了对PC服务器提供大内存的支持,Intel采取了物理地址扩展(Physical Address Extension, PAE)的技术,将现有的IA32架构的处理器的地址总线从32位扩展到了36位,这样从硬件层面来看,可以支持最多64G的内存。至于操作系统要如何实现对多出来的这几位进行内存地址映射,简要的说就是将原有的分页表结构改成了三层结构。
根据微软官方的说法,下述系统支持开启PAE功能:
•
Windows 7 (32 bit only)
• Windows Server 2008 (32-bit only)
• Windows
Vista (32-bit only)
• Windows Server 2003 (32-bit only)
• Windows XP (32-bit only)
• Windows 2000 Datacenter Server
• Windows 2000 Advanced Server
具体实现步骤可以见微软官方文章:
http://msdn.microsoft.com/en-us/library/aa366796%28v=vs.85%29.aspx在这里,推荐大家用一个叫Ready4GB的小程序,可以自动完成改造工作。
开启PAE的兼容性问题和收益关于开启PAE以后的兼容性问题和是否有效可能是大家最为关心的问题了,根据微软官方的说法,PAE开启后,可能会造成部分驱动程序的兼容性出现问题。事实上根据我自己的体验,本人的NV 540M双显卡就无法正确工作在PAE模式下,查证后发现所有的Nvidia的双显卡都是不支持PAE的,
网络上也有少数人反应开启PAE后会造成蓝屏等现象,是否有相关性尚无明确验证。所以具体情况要尝试后才能确定了。
说到收益,
网络上是众说纷纭,很多人认为即便开启了PAE,单个32位程序也无法分配到超过4G的空间,因此无效。
先简要了解一下应用程序运行时的内存使用情况是什么样的:因为不同用户使用环境不会完全一样,很显然应用程序的开发人员不可能在设计阶段去确定这个程序有多少内存空间可以使用。所以,正如前文所述,现在的应用程序运行时,都会分配到一个“虚拟”的内存空间,所有的内存请求都是在这个虚拟地址内完成的,然后再根据具体的内存映射关系,将这些虚拟地址转换为具体的内存地址,或者是上的硬盘空间,在这些地方读写具体的数据。
因此关于上述说法,前半句是对的,对于普通的32位程序来说,无论工作在何种环境下,其始终都只能分配到最多4G虚拟内存地址(0x00000000-0xFFFFFFFF),而这4G内存,其中有2G是操作系统保留的核心内存,另外2G才是程序的自由空间。这是32位程序的机制所决定的,即便我们将这些程序拿到现有的64位系统下运行,它们也只能分配到4G内存,2G可用内存。
应用程序内存分配示例但是上述机制的存在绝不代表这PAE对于整个操作系统的性能没有帮助,更多的内存有利于操作系统对多任务进行内存分页,可以提高系统在多任务下的表现。总之,单个程序不能利用超过4G内存,不代表整个系统不能完全利用。
另外,对于支持PAE的几个系统来说,它们同时还支持另外一项技术:地址窗口扩展(Address Windowing Extensions, AWE)。这是一个程序设计时的接口,它可以使得32位程序访问到超过4GB的内存,目前SQL Server是内置支持这项技术的。