让.Net 应用程序突破2G的内存访问限制(3)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:解读.NET 2.0中Hashtable快速查找的方法
一般来说我们都是用 Hashtable 的 ContainsKey 方法来查找 Hashtable 中是否存在某个键值然后读取他,但是这个方法并不是效率最好的方法。比较好的方法是直接读取键值然后判断这个对象是否

1、为当前进程申请锁定内存的权限(注意 调用进程的帐号必须具备锁定内存的权限,否则这一步会失败)

2、就是需要申请的页面数量

3、通过 AllocateUserPhysicalPages API 申请AWE内存

以下为引用的内容:

public AweStream(UInt32 capacity)
{
unsafe
{
// Enable the privilege of lock memory.

lock (_SetLockPagesPrivilegeLockObj)
{
if (!_SetLockPagesPrivilegeOk)
{
LoggedSetLockPagesPrivilege.SetLockPagesPrivilege(System.Diagnostics.Process.GetCurrentProcess(), true);
_SetLockPagesPrivilegeOk = true;
}
}

General.SYSTEM_INFO sysInfo;
General.GetSystemInfo(out sysInfo); // fill the system information structure

_PageSize = sysInfo.dwPageSize;
if ((capacity % _PageSize) != 0)
{
_NumberOfPages = capacity / _PageSize 1;
}
else
{
_NumberOfPages = capacity / _PageSize;
}

_PFNArraySize = (UInt32)(_NumberOfPages * sizeof(UInt64*)); // memory to request for PFN array

_PFNArray = Marshal.AllocHGlobal((int)_PFNArraySize);

UInt32 numberOfPagesInitial = _NumberOfPages;

if (!AweApi.AllocateUserPhysicalPages(System.Diagnostics.Process.GetCurrentProcess().Handle,
ref _NumberOfPages, _PFNArray))
{
Dispose();
throw new AweStreamException("Cannot allocate physical pages", AweStreamException.Reason.CannotAllocatePhysicalPages);
}

_AweAllocated = true;

if (numberOfPagesInitial != _NumberOfPages)
{
Dispose();
throw new AweStreamException(string.Format("Allocated only {0} pages.", _NumberOfPages),
AweStreamException.Reason.AweMemoryNotEnough);
}

_Capacity = _PageSize * _NumberOfPages;
}

}


AWE内存申请完毕后并不能被立即访问到,我们必须将其映射到32位内存地址中才可以访问。

下面是内存映射的代码:

也很简单:

分享:解读26个ASP.Net开发新手的常见问题
一位ASP.net初学者学习过程中整理的备忘录,包括“打开新的窗口并传送参数,为按钮添加对话框,删除表格选定记录,删除表格记录警告”等等常见问题的解决方法。 1. 打开新的窗

来源:模板无忧//所属分类:.Net教程/更新时间:2008-12-05
相关.Net教程