windows xp 内存分配


这几天写程序,一直发现当程序分配较多的内存时会报错:
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84,

查了一下原来XP只支持2GB的程序空间,程序想多用内存就没门了,只能用64位的xp了。
http://www.81ren.net/thread-6272-1-1.html

支持VLM(超大内存)   
在介绍VLM之前,我们回顾一下Windows NT 4.0内存管理的进化过程。因为Windows NT 4.0是标准的32位操作系统,32位指针能够访问的最大空间范围是2的32次方,也就是4GB。但用户的应用程序并不能使用所有的4GB空间,其中4GB的上半部分属于系统空间,操作系统的所有进程都运行在系统空间中。下半部分属于用户空间,但用户空间的最上层驻留的是系统的动态链接库(DLL),这样用户真正能够使用的空间就少于2GB。不过是这种把系统空间和用户空间分开的技术极大地增强了系统的可靠性。   

但2GB的应用程序空间对于大型企业应用来说,是远远不够的,于是微软在Windows NT Server 4.0中将用户空间调整为3GB,但是在这3GB空间中,系统动态链接库的位置并没有改变,这就是说用户的3GB空间并不是连续的,它被系统的动态链接库所隔断。   

随着计算机软硬件的飞速发展,许多大型数据库的容量达到了几百个GB,对内存的需求也大大地增加。为了更好地参与企业应用,Windows 2000对DEC Alpha平台提供了VLM支持。因为Alpha平台的所有指针和寄存器都是64位的,因此Windows 2000能够访问高达32GB的内存空间,其中最上部的2GB空间是系统空间,最下部的2GB空间是用户空间,中间的28GB也是用户空间,所有这些空间只有使用64位指针才能访问到,这就对Windows 2000的32位指针进行了64位的符号扩展。须要注意的是,中间的28GB内存空间是不可交换的,也就是说必须是物理上配置28GB内存,而不能利用硬盘上的页交换文件来进行模拟,此外VLM的I/O只能支持异步和非缓存I/O。对VLM的访问是通过VLMAPI来实现的,这些API是原有的虚拟内存管理API的扩展,但使用的指针和参数都是64位的。

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s