我有一个程序需要使用大内存(6G)我的系统已经打了PAE补丁,它是不是会自动能使用超过4G的内存呢?

解决方案 »

  1.   

    不是,PAE只影响CPU的寻址,不影响你的程序,因为你的程序用的是虚拟内存。你说的4G大概是指32位的编译器产生的指针能够访问的地址空间大小。地址空间大小只限制你的程序在同一时间可以访问的内存大小,你的应用程序能够分配的内存不受地址空间大小限制,但是受虚拟内存大小限制。比如你的32位计算机有2G物理内存,虚拟内存有10G,那么理想情况下(比如不考虑操作系统和驱动所占内存)你的32位程序可以申请到12G内存,但是同一时间内只能看到其中的4G。
      

  2.   


    什么叫不能同时看到呢?本来就不能同时使用吧,一般的CPU也就是64位,8个字节,怎么可能同时使用呢?!
      

  3.   


    看你的操作系统。32bit下,我从没有用到超过4G的内存,PAE也没用。是否有高明的方法,我不知。但64bit的应该没问题。我在windows sever 2003 64bit下可以使用8g没问题。
      

  4.   

    32bit,进程最大4G,一般内核要使用2G,自己程序只使用2G.我的观念一直这样,留个痕迹,关注高手现身!
      

  5.   


    这个PAE补丁是在微软下载的应该也属于系统补丁。有人这样用过吗??
      

  6.   

    进程能直接看到的就是2G或3G
    非服务器版的32位windows最多能用约3.7g物理内存,这是由软件人为限制的,你开pae,安再多内存也没用
      

  7.   

    下面语句分配4G的内存
    HANDLE h = CreateFileMapping(INVALID_HANDLE_VALUE, 0,
                                 PAGE_READWRITE, 1, 0, NULL);
    分配的内存不一定占用地址空间,
      

  8.   

    和操作系统有关系,操作系统不支持的话
    程序基本用不了,CreateFileMapping 只是分配了
    使用的话还需要以来 CreateFileMapping类函数
    完美支持直接上64位系统
      

  9.   


    我上了个MSDN,上面说System Support for PAE
    PAE is supported only on the following 32-bit versions of Windows running on x86-based systems:
    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
    这样的话,看来系统还是支持PAE的,但是我们的应用程序需要怎么做才能访问这些超过的内存呢?
    是不是不用干什么就能访问呢?
      

  10.   

    支持pae并不表明能用超过4g
    你可以看msdn.microsoft.com/en-us/library/windows/desktop/aa366796(v=vs.85).aspx
    msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx#physical_memory_limits_windows_xp
    32位windowsxp只能用4g物理内存,主存还不到4g,因为其他设备则会占用物理地址
      

  11.   


    按这个链接,PAE使操作系统可以使用多余4G内存,用于页面交换,提高性能。当多个程序同时运行时,可以改善性能。但关键是这句:
    PAE does not change the amount of virtual address space available to a process. Each process running in 32-bit Windows is still limited to a 4 GB virtual address space. 就是说,一个具体的应用程序可使用的内存,还是不能大于4 GB 。所以,LZ不要再费神了。换64bit操作系统。
      

  12.   

    非服务器版的32位windows根本不会分配超过4g的物理地址,因为有些驱动程序假定地址不会超过32位,为了稳定性操作系统就不用多余的内存
      

  13.   

    只能上32位的server,或64位的桌面。
      

  14.   

    看来还是有很多人把进程的内存地址空间和进程的可用内存搞混。内存地址只限制进程在同一时间能够访问的内存大小,进程能够分配的内存大小不受内存地址空间限制,因为可以把内存页交换出去。有用过DOS的EMM386的都知道这个技术吧?自己动手做实验这么难么?我自己试过,在32位系统上分配过将近12G的内存。
      

  15.   

    在32位系统中,很多内存管理的API本身参数就只是32位,怎么支持大于4G的空间?
      

  16.   

    CreateFileMapping用于内存映射,是可以读写远大于4G的文件。但是如果需要分配一个大于4G的数组,在一般32位的xp下通过PAE可以成功吗?我3年前在32位下设置PAE,每次new到1G就不能再多了。从那以后一直都用64bit。
      

  17.   

    这里用的是CreateFileMapping不是new或者其他内存管理API。
    而且访问的不是文件是分配的内存。
      

  18.   

    是可以的,Windows提供了AWE(地址窗口扩展),允许进程分配没有分页的物理内存来用,32位应用程序可以使用2GB以上的内存。
    http://msdn.microsoft.com/en-us/library/aa366527(v=vs.85).aspx
    里面有详细的说明。
    大体过程是用VirtualAlloc在进程的地址空间里开一个窗口,然后利用AWE提供的函数,分配一定的物理内存。
    然后利用相关的函数将其一部分映射到进程地址空间里的窗口中。通过移动窗口的映射位置,就可以访问那部分内存了。
    根据x86的PAE实现限制,最大可以寻址的物理内存是64GB。
    不过AWE因为是没有分页的物理内存,所以如果一个程序分配过多的话,OS可用的分页内存就会减少了。
    因为AWE不会被交换到硬盘的交换文件,所以可以除了为数据库、图形处理等高内存需求用途外,另外就是可以用来暂存密钥等敏感信息。
      

  19.   

    Quote=引用 22 楼 bokutake 的回复:]
    是可以的,Windows提供了AWE(地址窗口扩展),允许进程分配没有分页的物理内存来用,32位应用程序可以使用2GB以上的内存。
    http://msdn.microsoft.com/en-us/library/aa366527(v=vs.85).aspx
    里面有详细的说明。
    大体过程是用VirtualAlloc在进程的地址空间里开一个窗口,然后利用AWE提供的函数,分配一定的物理内存。
    ……
    [/Quote]谢谢两位!
    看了这个链接:
    http://msdn.microsoft.com/en-us/library/aa366527(v=vs.85).aspx
    这么多年第一次弄懂AWE/PAE的用途,是用于数据处理程序缓冲交换数据。
    只是现在一直用64bit系统,不方便实际写段程序,运行一下。