做数据采集时,需要分配一个大内存缓存。系统要求以2048(2K)的整倍数分配内存,结果发现在VC中,用GlobalAlloc和new最大都只能分配到604160*2048字节的空间,分配604161*2048时就分配不了了,能分配的内存是1.15G左右。单独写了一个MFC的对话框软件,可以分配到1.4G的内存。计算机中共有2G内存,操作系统+其他软件使用了400M左右。
我想问的是,两个程序能分配的内存大小为什么差了这么多,第一个程序其他地方即使占用了内存也多占不了这么多啊?我现在的程序想使用一个1.5G的缓存用来存放实时数据,应该如果操作,注意什么问题?
(不能用虚拟内存,速度赶不上)我现在计算机中的内存是2G,升级内存后程序中能否多分配些内存呢?

解决方案 »

  1.   

    取决于你的堆(heap)的大小,这个大小取决于你的物理内存+虚拟内存的大小
    你说不可以用虚拟内存,而系统以及其他程序也需要占用一部分物理内存,你看看还剩多少吧
      

  2.   

    建议使用VirtualAlloc。  The   VirtualAlloc   function   reserves   or   commits   a   region   of   pages   in   the   virtual   address   space   of   the   calling   process.   Memory   allocated   by   this   function   is   automatically   initialized   to   zero,   unless   the   MEM_RESET   flag   is   set.    
      LPVOID   VirtualAlloc(  
          LPVOID   lpAddress,   //   address   of   region   to   reserve   or   commit  
          DWORD   dwSize,           //   size   of   region  
          DWORD   flAllocationType,    //   type   of   allocation  
          DWORD   flProtect       //   type   of   access   protection  
      );   
      

  3.   

    不知道你使用的是什么操作系统,在32为Windows XP系统中,默认只能识别3点G的内存,理论上可以使用4GB内存.但是在操作系统设计中,系统中的高2GB内存保留给系统,用户程序只能使用低2GB的内存.因此所有的应用软件最大只能使用2GB内存,这其中包括操作系统应用程序还占用了一部分和其他软件占用了一部分.平时我们在任务管理器中看见的程序使用的内存,那是实际占用的物理内存,此外应用程序还占用一部分虚拟内存,两者加起来才使软件实际使用的内存。操作系统会根据内存使用的情况,将不常使用的内存页面交换的虚拟内存中去。因此你能使用的内存必须刨除其它程序占用的物理内存和虚拟内存之和才能是你使用的最大内存。
      

  4.   


    用的32位XP Pro系统。
    似乎不是所有的应用程序使用2G的内存吧,而是单一进程最大只能用到2G的内存空间吧。
      

  5.   

     
    恩,是单一进程, Windows 2000K可以获得3GB用户方式分区
      

  6.   

    是不是所有程序都使用2GB内存,可是系统分给应用程序最大的内存空间就是2GB,去掉其他程序占用的,只能少于2GB,如果按照理论值,最大还能访问4GB呢,可是XP系统目前32位系统默认只能识别3G多内存,就算你把内存加到4G,也只能使用3G多内存,不过2003系统,可以设置用户内存为3GB.
      

  7.   

    别胡说啊,就算你的4G空间,你给我分配个1G的看看还访问4G呢,4G里你能访问的空间有多少啊
      

  8.   

    看看4G给你留多少内存!00000000     Free                65536       
    00010000     Private              8192      1  -RW-
    00012000     Free                57344       
    00020000     Private              4096      1  -RW-
    00021000     Free                61440       
    00030000     Private           1048576      3  -RW-     Thread Stack
    00130000     Mapped              12288      1  -R--
    00133000     Free                53248       
    00140000     Private           1048576      2  -RW-
    00240000     Private             65536      2  -RW-
    00250000     Mapped              65536      2  -RW-
    00260000     Mapped              90112      1  -R--     \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls
    00280000     Mapped             266240      1  -R--     \Device\HarddiskVolume1\WINDOWS\system32\locale.nls
    002D0000     Mapped             266240      1  -R--     \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls
    00320000     Mapped              24576      1  -R--     \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls
    00326000     Free                40960       
    00330000     Mapped             266240      1  -R--
    00371000     Free                61440       
    00380000     Private             65536      2  -RW-
    00390000     Private              4096      1  -RW-
    00391000     Free                61440       
    003A0000     Private              4096      1  -RW- 
    003A1000     Free                61440       
    003B0000     Private             65536      2  -RW-     
    003C0000     Mapped              12288      1  -R--     \Device\HarddiskVolume1\WINDOWS\system32\ctype.nls
    003C3000     Free                53248       
    003D0000     Mapped               8192      1  -R--     
    003D2000     Free                57344       
    003E0000     Mapped               8192      1  -R--     
    003E2000     Free                57344       
    003F0000     Private             65536      2  -RW-     
    00400000     Image              106496      5  ERWC     F:\x86\Debug\14 VMMap.exe
    0041A000     Free                24576       
    00420000     Mapped             819200      4  ER--     
    004E8000     Free                32768       
    004F0000     Mapped            1060864      1  -R--    
    005F3000     Free                53248       
    00600000     Mapped            3145728      2  ER--     
    00900000     Mapped             274432      1  -R--     
    00943000     Free                53248       
    00950000     Mapped               8192      1  -R--     
    00952000     Free                57344       
    00960000     Mapped               8192      1  -R--     
    00962000     Free                57344       
    00970000     Private             65536      2  -RW-     
    00980000     Mapped               8192      1  -R--     
    00982000     Free                57344       
    00990000     Mapped              57344      1  -RW-     
    0099E000     Free               335872       
    009F0000     Mapped               8192      1  -R--     
    009F2000     Free                57344       
    00A00000     Private            524288      2  -RW-     
    00A80000     Private           1048576      2  -RW-     
    00B80000     Free            256376832       
    10000000     Image              192512      7  ERWC     D:\Program Files\360\360Safe\safemon\safemon.dll      
    5ADC0000     Image              225280      4  ERWC     C:\WINDOWS\system32\uxtheme.dll    
    5D170000     Image              630784      4  ERWC     C:\WINDOWS\system32\comctl32.dll      
    62C20000     Image               36864      4  ERWC     C:\WINDOWS\system32\LPK.DLL      
    71A10000     Image               32768      4  ERWC     C:\WINDOWS\system32\WS2HELP.dll     
    71A20000     Image               94208      4  ERWC     C:\WINDOWS\system32\WS2_32.dll     
    73640000     Image              188416      4  ERWC     C:\WINDOWS\system32\msctfime.ime   
    73FA0000     Image              438272      8  ERWC     C:\WINDOWS\system32\USP10.dll       
    75C60000     Image              655360     11  ERWC     C:\WINDOWS\system32\urlmon.dll   
    76300000     Image              118784      4  ERWC     C:\WINDOWS\system32\IMM32.DLL     
    765E0000     Image              602112      5  ERWC     C:\WINDOWS\system32\CRYPT32.dll   
    76680000     Image              679936      5  ERWC     C:\WINDOWS\system32\WININET.dll    
    76990000     Image             1298432      5  ERWC     C:\WINDOWS\system32\ole32.dll    
    76BC0000     Image               45056      5  ERWC     C:\WINDOWS\system32\PSAPI.dll   
    76DB0000     Image               73728      4  ERWC     C:\WINDOWS\system32\MSASN1.dll   
    770F0000     Image              569344      5  ERWC     C:\WINDOWS\system32\OLEAUT32.dll    
    77180000     Image             1060864      4  ERWC     C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\COMCTL32.dll     
    77BD0000     Image               32768      4  ERWC     C:\WINDOWS\system32\VERSION.dll    
    77BE0000     Image              360448      7  ERWC     C:\WINDOWS\system32\MSVCRT.dll     
    77D10000     Image              589824      5  ERWC     C:\WINDOWS\system32\USER32.dll
    77DA0000     Image              692224      5  ERWC     C:\WINDOWS\system32\ADVAPI32.dll    
    77E50000     Image              598016      4  ERWC     C:\WINDOWS\system32\RPCRT4.dll    
    77EF0000     Image              299008      4  ERWC     C:\WINDOWS\system32\GDI32.dll    
    77F40000     Image              483328      4  ERWC     C:\WINDOWS\system32\SHLWAPI.dll
    77FC0000     Image               69632      4  ERWC     C:\WINDOWS\system32\Secur32.dll
    7C800000     Image             1171456      5  ERWC     C:\WINDOWS\system32\kernel32.dll
    7C920000     Image              614400      6  ERWC     C:\WINDOWS\system32\ntdll.dll
    7D590000     Image             8339456      6  ERWC     C:\WINDOWS\system32\SHELL32.dll
    7F6F0000     Mapped            1048576      2  ER--     
    7F7F0000     Free              8060928       
    7FFA0000     Mapped             208896      1  -R--     
    7FFD3000     Free                40960       
    7FFDD000     Private              4096      1  -RW-     
    7FFDE000     Free                 4096       
    7FFDF000     Private              4096      1  -RW-     
    7FFE0000     Private             65536      2  -R--     
      

  9.   

    并且写Free的也不会叫你碰的,哈哈哈哈哈!!!!!!!!所以给你的解决方案:FileMapping不过在NTF32中不允许超过4G
      

  10.   

    楼上的几位,你们就别再误导楼主了,你们只是道听途说罢了Windows Internal里面的MS编写者讲过:针对32位系统的庞大数据库映射而言,Windows早发现了这一点,所以它提供了一种成为 地址窗口扩展的机制(Address Windowing Extension),使得32位系统上的应用程序可以申请多达64GB的物理内存,然后将内存视图映射到2GB的虚拟地址空间中也就是说,当你的物理内存足够大的实话,就能分配出64G的物理内存以便使用。你们没见到那些公司的SQLServer消耗内存都是几十个G么?
      

  11.   

    LZ的帖子里说不用虚拟内存,那就非常好了。直接在内核下在PCI上分配物理内存,只要你的物理内存足够,几十个G是没问题的
      

  12.   

    LZ用的应该是I/O设备吧?判断IO端口是否需要映射,需要映射就MmMapIoSpace得端口地址,不需要就直接获得QuardPart,然后IoConnectInterrput链接中断,接着用MmAllocateContiguousMemory分配物理内存,写物理内存建议用WDK里面提供好的宏,WRITE_REGISTER_BUFFER_UCHAR
      

  13.   


    用户态和内核态都可以。
    最好是用户态的,采集卡的驱动也是我们自己开发的,不过把这些内容放到驱动中不太好控制。
    我们的设备几乎没有用IO端口,用的是DMA方式的数据采集。
      

  14.   

    用DMA的啊?你的意思是中断资源咯?用户态不能操作物理内存
      

  15.   


    就是DMA+中断的方式用户态不能操作物理内存吗,知道了物理内存的线性地址不就可以了吗?其实物理不物理内存的不是关键,关键是我如何可以开辟1.5G大的内存空间。
      

  16.   


    不知道你说的用户态没有权利操作物理内存的,是如何的操作,不能读写,不能分配还是什么。我所说的不能用虚拟内存是因为硬盘的读写速度不够,所以必须使用RAM上的空间。
      

  17.   

    Ring3程序被约束在虚拟内存操作中,虚拟内存是物理内存映射在硬盘上表现出来的。当你的资源消耗过多的时候,系统会帮你把更多的物理内存映射到2G的虚存用户区中,直到物理内存消耗达到64G为止
      

  18.   


    我想做的就是如果可以分配一个大内存,而且要分配在RAM中不能在硬盘上。
      

  19.   


    怪我没有说明白。
    我说的虚拟内存指的是windows系统设置里的那个分配在硬盘上的页面文件,不是我们编程意义上的。
      

  20.   


    这个1.15G肯定是分在了RAM里,而不是硬盘上的,因为通过了采集测试,硬盘上没有这么高的速度。
    国外的产品是可以分到1.5G,我想知道该怎么分。不要说运气,没有运气,只有方法。
      

  21.   

    lz还是没明白,new分配的是虚拟内存,一段可用的地址空间,并不一定都映射到内存中。
      

  22.   

    如果要申请物理内存,可查看MSDN关于AWE的例子,使用AllocateUserPhysicalPages。
      

  23.   

    呵呵,感谢各位,尤其感谢Tr0j4n和jingzhongrong两位。
    真的要先去冲冲电了。
      

  24.   

    看来我想用现在的方法可能有点行不通了,我本想不改动现有的硬件而只改软件。接下来要研究一下DMA的Scatter/Gather模式,看能不能解决问题。再次的感谢大家,我的VC是半路出家,基础很差,看来有时间要好好补习一下了。