//windows 内存分配. windows/visual stdio*/cl xxx.cpp
#include #include#include#include#include#include#include
using namespacestd;
DWORD dwID;
MEMORYSTATUS memInfo;#define C(I, S) CreateSemaphore(NULL, (I), 3, (S))
#define P(S) WaitForSingleObject((S), INFINITE)
#define V(S) ReleaseSemaphore((S), 1, NULL)
#define CT(func, args) CreateThread(NULL, 0, (func), (args), 0, &dwID)
#define PM(num, S) WaitForMultipleObjects((num), (S), true, INFINITE)DWORD WINAPI Tracer(LPVOID lpParam);
HANDLE hThread;
HANDLE s1, s2;
LPVOID lpvBase;//整个大内存基址
LPTSTR lpNxtPage; //下一个页面地址
LPTSTR lpPtr; //字符指针,用于测试访问,赋值
DWORD PageSize; //页面大小
DWORD showSysInfo()
{
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
cout<< "---------------BEG SYSTEM_INFO---------------" <
cout<< "OEM ID:" << siSysInfo.dwOemId <
cout<< "Number of processors:" << siSysInfo.dwNumberOfProcessors <
cout<< "Page size:" << siSysInfo.dwPageSize <
cout<< "Processor type:" << siSysInfo.dwProcessorType <
cout<< "Minimum application address:" << siSysInfo.lpMinimumApplicationAddress <
cout<< "Maximum application address:" << siSysInfo.lpMaximumApplicationAddress <
cout<< "---------------END SYSTEM_INFO---------------\n\n";returnsiSysInfo.dwPageSize;
}void showMemStatus(const char*s)
{
GlobalMemoryStatus(&memInfo);
cout<
cout<< hex << "dwAvailPhys: 0x" << memInfo.dwAvailPhys << ", dwAvailPageFile: 0x" <
}
DWORD WINAPI Tracer(LPVOID lpParam)
{for(int i = 0; i < 3; ++i) {
P(s2);
showMemStatus("提交页面了并且赋值了");
V(s1);
}return 0;
}
INT PageFaultExceptionFilter(DWORD dwCode)
{
LPVOID lpvResult;
cout<< "访问异常, 错误代码 = 0x" << dwCode << endl <
lpvResult= VirtualAlloc((LPVOID)lpNxtPage, 10000*PageSize, MEM_COMMIT, PAGE_READWRITE);if (lpvResult ==NULL) {
cout<< "VirtualAlloc failed" << endl <
}else{
showMemStatus("刚刚提交完页面");
}
lpNxtPage= (LPTSTR) ((PCHAR) lpNxtPage + 10000*PageSize);returnEXCEPTION_CONTINUE_EXECUTION;
}intmain()
{
PageSize=showSysInfo();
s1= C(1, "ss1");
s2= C(0, "ss2");
hThread=CT(Tracer, NULL);
showMemStatus("之前");
lpvBase= VirtualAlloc(NULL, 30000*PageSize, MEM_RESERVE, PAGE_NOACCESS); //先设置noacess, 赋值会出错,执行PageFaultExceptionFilter//cout <
if (lpvBase ==NULL) {
cout<< GetLastError() <
}else{
cout<< "成功初始化保留页面" <
}
showMemStatus("初始化: 保留页面");
lpPtr= lpNxtPage =(LPTSTR) lpvBase;for(int i = 0;i < 3; ++i) {
P(s1);for(int j = 0; j < 10000*PageSize; ++j) {
__try {//测试给申请的内存赋值
lpPtr[10000*i*PageSize + j] = 'a';
}
__except (PageFaultExceptionFilter(GetExceptionCode())) {
_tprintf (TEXT("出错了"));
ExitProcess( GetLastError() );
}
}
V(s2);
}
cout<< "第一个页面内容:" << lpPtr[3] << endl <
P(s1);
LPVOID lpvResult= VirtualAlloc(NULL, PageSize, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE |PAGE_GUARD);if (lpvResult ==NULL) {
cout<< GetLastError() <
}else{
cout<< "已经成功提交了一个页面\n\n";
}//测试一次性的PAGE_GUARD功能!同时测试锁定
BOOL bLocked =VirtualLock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
bLocked=VirtualLock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
showMemStatus("锁定了一个页面");//测试解锁
bLocked =VirtualUnlock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能解锁锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
showMemStatus("解锁完一个页面");//测试reset
LPVOID lpvResult1 =VirtualAlloc(lpvResult, PageSize, MEM_RESET, PAGE_READWRITE);if (lpvResult ==NULL) {
cout<< GetLastError() <
}else{
cout<< "已经成功Reset了一个页面\n\n";
}
showMemStatus("Reset了一个页面");//测试释放, 整个,物理+页面虚拟
BOOL bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);if (!bSuccess) {
cout<< "错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功释放了" << lpvBase << "\n\n";
}
showMemStatus("释放了大内存");
P(hThread);return 0;
}