網(wǎng)頁設(shè)計(jì)配色時(shí)可以用關(guān)鍵詞是網(wǎng)站seo的核心工作
虛擬內(nèi)存的按需調(diào)撥
windows C++ 虛擬內(nèi)存的按需調(diào)撥
文章目錄
- 虛擬內(nèi)存的按需調(diào)撥
- 虛擬內(nèi)存的按需調(diào)撥
虛擬內(nèi)存的按需調(diào)撥
/*------------------------------------------------------------------------24-SEHAndMemory.cpp演示虛擬內(nèi)存的按需調(diào)撥-----------------------------------------------------------------------*/
#include <windows.h>
#include <tchar.h>
#include <locale.h>#define PAGELIMIT 80
LPBYTE lpNxtPage;
DWORD dwPages = 0;
DWORD dwPageSize;//頁面大小,一般為4KBINT PageFualtExceptionFilter(DWORD dwCode) {LPVOID lpvResult;//不是非法訪問內(nèi)存if (dwCode != EXCEPTION_ACCESS_VIOLATION) {//線程試圖讀寫一個(gè)虛擬內(nèi)存地址,但在這個(gè)地址它并不具備相應(yīng)權(quán)限return EXCEPTION_EXECUTE_HANDLER;//執(zhí)行except塊的異常處理程序代碼}//當(dāng)超過指定的頁面數(shù)時(shí)if (dwPages >= PAGELIMIT) {return EXCEPTION_EXECUTE_HANDLER;//執(zhí)行except塊的異常處理程序代碼}//非法訪問內(nèi)存,則為預(yù)訂的空間提交下一頁物理存儲(chǔ)器lpvResult = VirtualAlloc((LPVOID)lpNxtPage, dwPageSize, MEM_COMMIT, PAGE_READWRITE);if (lpvResult == NULL) {return EXCEPTION_EXECUTE_HANDLER;//執(zhí)行except塊的異常處理程序代碼}//提交成功dwPages++;lpNxtPage += dwPageSize;_tprintf(_T("第%d頁提交成功!\n"), dwPages);return EXCEPTION_CONTINUE_EXECUTION; //重新執(zhí)行觸發(fā)異常的那條CPU指令
}int main() {_tsetlocale(LC_ALL, _T("chs"));LPVOID lpvBase; LPTSTR lpPtr; BOOL bSuccess;SYSTEM_INFO sSysInfo;GetSystemInfo(&sSysInfo);dwPageSize = sSysInfo.dwPageSize;_tprintf(_T("CPU頁面大小為%dKB.\n"), sSysInfo.dwPageSize / 1024);//預(yù)訂存儲(chǔ)器lpvBase = VirtualAlloc(NULL, PAGELIMIT*dwPageSize, MEM_RESERVE, PAGE_NOACCESS);lpPtr = (LPTSTR)(lpNxtPage = (LPBYTE)lpvBase);for (DWORD i = 0; i < PAGELIMIT*dwPageSize / sizeof(TCHAR); i++) {__try {lpPtr[i] = _T('a');//寫入一個(gè)字節(jié)的數(shù)據(jù)}__except (PageFualtExceptionFilter(GetExceptionCode())) {_tprintf(_T("異常被處理\n"));//ExitProcess(GetLastError());}}bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);_tprintf(_T("釋放操作%s.\n"), bSuccess ? _T("成功") : _T("失敗"));_tsystem(_T("PAUSE"));return 0;
}