.Net应用程序突破2G的内存访问限制方法(2)
由于需要锁定物理内存,所以运行AWE功能的程序,必须要具备锁定内存的权限,系统管理员帐号是没有这个权限的,只有 System帐号有这个权限。当然你也可以在本地安全设置中指定某个帐号拥有这个权限。方法如下:
gpedit.msc ->Windows Settings->Security Settings->Local Policies->User Rights Assignment->Lock pages in memory
谈完锁定内存的问题,我们再看看上面那个图,我们会发现虽然AWE允许访问最多64G的内存,但这64G内存是被AWE映射到一个32位的用户模式下的内存地址中去的,也就是说通常情况下,我们最多可以同时访问64G内存中的2G内存 (如果配置了/3G开关,可以同时访问最多16G内存中的3G内存),如果要访问整个64G的内存,我们需要将一些不访问的内存取消映射,这样可以空出足够的用户模式下的虚拟内存地址来访问我们需要访问的内存。因此我封装的类中添加了Map和UnMap两个方法,让调用者可以根据实际情况来决定映射和去映射。2G的32位虚拟内存地址对于我们来是是如此的宝贵,调用者在贪婪的消耗大量内存时一定要注意节约这个资源。
谈完这些东西,下面让我们结合代码来看看在.Net 下如何来操作AWE 内存吧。
为了方便.Net 程序员访问AWE内存,我封装了一个AweStream类,这个类继承自Stream类。.Net程序员可以像操作普通的MemoryStream流那样操作AWE内存。同时我还为那些对效率要求非常苛刻的调用者提供了一个通过指针访问AWE内存的方法。
调用示例如下:注意必须在构造函数中指明申请的AWE内存的大小。
以下为引用的内容: byte[] inputBuffer = new byte[1024]; Stopwatch stopWatch = new Stopwatch(); using (AweStream.AweStream aweStream = new AweStream.AweStream(1024 * 1024 * 100)) //Copy one bytes stopWatch.Stop(); Console.WriteLine(stopWatch.ElapsedMilliseconds); aweStream.Position = 0;
for (int i = 0; i < 1024 * 100; i ) stopWatch.Stop(); Console.WriteLine(stopWatch.ElapsedMilliseconds); //UnMap |
我在 6G内存 windows 2003 企业版的环境中做了测试,申请内存到5G以上没有任何问题。
下面再看看如何来申请AWE内存