做数据采集时,需要分配一个大内存缓存。系统要求以2048(2K)的整倍数分配内存,结果发现在VC中,用GlobalAlloc和new最大都只能分配到604160*2048字节的空间,分配604161*2048时就分配不了了,能分配的内存是1.15G左右。单独写了一个MFC的对话框软件,可以分配到1.4G的内存。计算机中共有2G内存,操作系统+其他软件使用了400M左右。
我想问的是,两个程序能分配的内存大小为什么差了这么多,第一个程序其他地方即使占用了内存也多占不了这么多啊?我现在的程序想使用一个1.5G的缓存用来存放实时数据,应该如果操作,注意什么问题?
(不能用虚拟内存,速度赶不上)我现在计算机中的内存是2G,升级内存后程序中能否多分配些内存呢?
我想问的是,两个程序能分配的内存大小为什么差了这么多,第一个程序其他地方即使占用了内存也多占不了这么多啊?我现在的程序想使用一个1.5G的缓存用来存放实时数据,应该如果操作,注意什么问题?
(不能用虚拟内存,速度赶不上)我现在计算机中的内存是2G,升级内存后程序中能否多分配些内存呢?
你说不可以用虚拟内存,而系统以及其他程序也需要占用一部分物理内存,你看看还剩多少吧
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
);
用的32位XP Pro系统。
似乎不是所有的应用程序使用2G的内存吧,而是单一进程最大只能用到2G的内存空间吧。
恩,是单一进程, Windows 2000K可以获得3GB用户方式分区
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--
用户态和内核态都可以。
最好是用户态的,采集卡的驱动也是我们自己开发的,不过把这些内容放到驱动中不太好控制。
我们的设备几乎没有用IO端口,用的是DMA方式的数据采集。
就是DMA+中断的方式用户态不能操作物理内存吗,知道了物理内存的线性地址不就可以了吗?其实物理不物理内存的不是关键,关键是我如何可以开辟1.5G大的内存空间。
不知道你说的用户态没有权利操作物理内存的,是如何的操作,不能读写,不能分配还是什么。我所说的不能用虚拟内存是因为硬盘的读写速度不够,所以必须使用RAM上的空间。
我想做的就是如果可以分配一个大内存,而且要分配在RAM中不能在硬盘上。
怪我没有说明白。
我说的虚拟内存指的是windows系统设置里的那个分配在硬盘上的页面文件,不是我们编程意义上的。
这个1.15G肯定是分在了RAM里,而不是硬盘上的,因为通过了采集测试,硬盘上没有这么高的速度。
国外的产品是可以分到1.5G,我想知道该怎么分。不要说运气,没有运气,只有方法。
真的要先去冲冲电了。