32位的CPU下,程序使用的空间能不能超过4GB?


32位的CPU下,程序使用的空间能不能超过4GB?如果能的话,windows和linux( 我知道linux好像有个mmap函数 )各有什么方法和机制能实现这一目的呢?求讲解!
注意: 这里的“空间”指的是计算机的内存空间,不是虚拟地址空间,如果是虚拟地址空间,那答案肯定是否定的。

操作系统 Linux

bbsucg 11 years, 11 months ago

鉴于像数据库系统这样的应用程序对海量内存的需求,Intel公司也觉得4GB的内存不够用,因此就将CPU芯片中内存地址线由32根扩展到了36根(即最多64GB),这就是所谓的物理地址扩展(PAE:Physical Address Extension)。PAE使得操作系统或应用程序能够最多使用64GB的物理内存,对于Windows系统(2000以上)来说,只需在boot.ini文件中使用/PAE选项即可(类似于上面的/3GB选项)。需要提醒大家的是,如果没有在boot.ini文件中使用/PAE选项,那么即使计算机已经配置了超过4GB的物理内存,在Windows操作系统中也不能使用超过4GB的那些内存(事实上,根据我的经验,如果没有使用/PAE选项,Windows系统最多只能识别3.25GB的物理内存,我也不清楚为什么不是4GB?如果有知道的,请告诉我一声)。

虽然PAE使得在应用程序中使用超过4GB的物理内存成为可能,但是由于32位应用程序的虚拟地址空间并不随着物理内存的增大而有任何变化,这意味着你不可能使用类似VirtualAlloc( GetCurrentProcess,2GB,...,...)这样的函数=调直接分配接近用户模式地址空间大小的内存区域。为了突破32位地址空间的限制,需要使用一种被成为地址窗口扩展(AWE:Address Windowing Extensions)的机制(在类Unix的系统上则有多种技术在使用,例如使用mmap()按需要把一部分文件映射到地址空间)(参见下图)。
AWE

AWE是Windows的内存管理功能的一组扩展,它使应用程序能够使用的内存量超过通过标准32位寻址可使用的2~3GB内存。AWE允许应用程序获取物理内存,然后将非分页内存的视图动态映射到32位地址空间。虽然32位地址空间限制为4GB,但是非分页内存却可以远远大于4GB。这使需要大量内存的应用程序(如大型数据库系统)能使用的内存量远远大于32位地址空间所支持的内存量。

在使用AWE机制时,需要注意以下几点:
(1)AWE允许在32位体系结构上分配超过4GB的物理内存,只有当系统可用物理内存大于用户模式的虚拟地址空间时,才应该使用AWE。
(2)若要使32位操作系统支持4GB以上的物理内存,必须在Boot.ini文件启用/PAE选项。
(3)若在Boot.ini文件中启用了/3GB选项,则操作系统最多能够使用16GB的物理内存,因此如果实际的物理内存超过16GB,必须确保不使用/3GB选项。
(4)使用AWE分配的内存是非分页的物理内存,这意味着这部分内存只能由分配的应用程序独占使用,不能由操作系统或其他程序使用,直到这些内存被释放为止,这与通常的VirtualAlloc函数分配的虚拟内存存在显著的不同,它不会参与分页替换。

参考链接:
如何在32位程序中突破地址空间限制使用超过4G的内存
物理地址扩展(Physical Address Extension)

孟买的乌拉瓜 answered 11 years, 11 months ago

Your Answer