windows PAE扩展和AWE编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanuage/article/details/52003700

在32位windows上只能看到最大3GB的内存空间,而且每个应用程序只能访问4GB的的内存,这个限制是windows独有的,为了使程序能够访问大于4GB的内存空间,需要使用AWE编程接口,同时需要开启PAE,让系统支持大于3GB的内存,开启PAE最大能支持128GB的内存。

PAE开启

在windows 7及以上的系统主要使用BCDEdit命令而XP系统使用的是修改boot.ini文件的方式,下面主要介绍的是windows 7 上开启PAE的方式
在命令行下输入BCDEdit /set PAE forceenable windows
另外如果需要扩大用户分区可以打开/3GB开关,这个开关在windows 7上用命令:BCDEdit /set IncreaseUseVa 3072(后面的数字代表的是用户分区的大小,3072正是3GB)
另外编译选项需要打开/LARGEADDRESSAWARE开关

AWE编程接口

开启PAE之后想要自己的程序能够访问到超过4GB的内存,需要使用AWE的编程接口,AWE(Address Windowing Extensions)是地址窗口扩展。
使用AWE时,所有物理页面的交换控制就由应用程序自己控制
使用的基本步骤:
1. 使用VirtualAlloc + MEM_PHYSICAL分配保留一段地址空间
2. 准备用于存储页表的数组
3. 申请分配物理内存(AllocateUserPhysicalPages)
4. 将物理内存映射到“窗口”中(MapUserPhysicalPages)
5. 对映射的内存进行读写操作
6. 释放物理内存页面(FreeUserPhysicalPages)
7. 释放对应的保留地址空间
下面是使用AWE的简单例子

#define MEMORY_REQUESTED 1024 * 1024 * 1024 //1GB
    BOOL bResult;                   // generic Boolean value
    ULONG_PTR NumberOfPages;        // number of pages to request
    ULONG_PTR NumberOfPagesInitial; // initial number of pages requested
    ULONG_PTR *aPFNs1;               // page info; holds opaque data
    ULONG_PTR *aPFNs2;               // page info; holds opaque data
    PVOID lpMemReserved;            // AWE window
    SYSTEM_INFO sSysInfo;           // useful system information
    int PFNArraySize;               // memory to request for PFN array
    TCHAR* pszData;
    TCHAR  pszReadData[100];

    MEMORYSTATUSEX ms = {sizeof(MEMORYSTATUSEX)};
    GlobalMemoryStatusEx(&ms);
    //使用VirtualAlloc + MEM_PHYSICAL分配保留一段地址空间
    lpMemReserved = VirtualAlloc( NULL,MEMORY_REQUESTED, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE );
    //计算需要的物理页面大小 以及物理页面需要的页表数组大小
    GetSystemInfo(&sSysInfo);  // fill the system information structure
    //向上取整,计算出需要多少个页表项
    NumberOfPages = (MEMORY_REQUESTED + sSysInfo.dwPageSize - 1)/sSysInfo.dwPageSize;
    PFNArraySize = NumberOfPages * sizeof (ULONG_PTR);
    //2 准备物理页面的页表数组数据
    aPFNs1 = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);
    aPFNs2 = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);
    NumberOfPagesInitial = NumberOfPages;
    //3 分配物理页面
    bResult = AllocateUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs1 );
    bResult = AllocateUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs2 );
    //4 映射第一个1GB到保留的空间中
    bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs1 );
    pszData = (TCHAR*)lpMemReserved;
    _tcscpy(pszData,_T("这是第一块物理内存"));
    //5 映射第二个1GB到保留的空间中
    bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs2 );
    _tcscpy(pszData,_T("这是第二块物理内存"));
    //6 再映射回第一块内存,并读取开始部分
    bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,aPFNs1 );
    _tcscpy(pszReadData,pszData);
    //7 取消映射
    bResult = MapUserPhysicalPages( lpMemReserved,NumberOfPages,NULL );
    //8 释放物理页面
    bResult = FreeUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs1 );
    bResult = FreeUserPhysicalPages( GetCurrentProcess(),&NumberOfPages,aPFNs2 );
    //9 释放保留的"窗口"空间
    bResult = VirtualFree( lpMemReserved,0, MEM_RELEASE );
    //10 释放页表数组
    bResult = HeapFree(GetProcessHeap(), 0, aPFNs1);
    bResult = HeapFree(GetProcessHeap(), 0, aPFNs2);
    _tsystem(_T("PAUSE"));

上述代码中,虽然只保留了1GB的虚拟地址空间,但是这1GB的虚拟地址空间通过映射的方式,映射到具体不同的真实内存中,这个就是PAE能访问大于4GB内存的秘密,通过对分页机制的了解,4字节的虚拟地址空间能够映射4KB的一页内存,所以经过简单的计算,其实没多映射1GB的内存其实只需要1M的数组来存储这些页表项。
64位的windows不再也没有必要支持AWE技术,因为这个技术就是为了解决应用程序访问内存不足的情况,但是在64位系统中不存在这个问题,也许有朝一日64位的操作系统也会出现能够访问的内存太少的情况,这个时候说不定会出现类似于AWE的技术

展开阅读全文

/3g /pae awe 我这样理解对不对???

05-05

有一台数据库服务器,无其它应用 rn2个4核的CPUrn4G内存 rnwindows server 2003 企业版 rnsql server 2000 企业版(已打sp4) rnrn我的数据库服务器上只运行一个数据库,当运行内存达到2G的时候,sql2000就自动停止服务了。以下是errorlog中的信息rnComputer type is AT/AT COMPATIBLE. rnBios Version is DELL - 1 rnPhoenix ROM BIOS PLUS Version 1.10 2.3.1 rnCurrent time is 21:22:16 04/29/10. rn8 Intel x86 level 6, 1995 Mhz processor(s). rnWindows NT 5.2 Build 3790 CSD Service Pack 2. rn rnMemory rnMemoryLoad = 56% rnTotal Physical = 4090 MB rnAvailable Physical = 1787 MB rnTotal Page File = 5969 MB rnAvailable Page File = 3849 MB rnTotal Virtual = 2047 MB rnAvailable Virtual = 5 MB rn当物理内存使用了2G左右,虚拟内存也达到2个G的时候,sql2000就自动停止了rn我查了很多资料,很多朋友都建议用/3g/pae awe 来进行设置 ,我也对/3g/pae awe作了一些了解rnrn我是这样理解的,不知道对不对rn/3g开关,只是将用户可用物理内存调整为3g核心系统内存调整为1个g,提高用户程序的执行性能rn/pae开关,只是用于在大于4g的物理内存时 识别出更多内存使用rnawe 是帮助应用程序能寻址大于4g的空间 (网上好多帖子都说使用了awe系统内存变异常了,不大敢用)rnrn对于一些建议,我有一些疑惑rn1.建议用/pae +awe 设置 我觉得我的系统能识别出4g的内存,就没有必要用/pae开关了rn2.建议只开3g开关 rn 我认为对于sqlserver2000 运行在32位的系统上来说还是只能寻址4g的空间 跟我没使用3g开关前一样,使用了3g开关,数据库性能可能会更高rn我没有设置前 只不过是使用了2g的物理内存,2g的虚拟内存 都用满了才会停止服务的 ,所以我认为开了3g开关问题会依旧rnrn我现在想这样设置 不知道会不会有问题 开/3g开关,开awe,设置sql最大内存大小为6grn不知道这样做会不会有什么问题????rnrn rn 论坛

没有更多推荐了,返回首页