windows C++ 虚拟内存的按需调拨

虚拟内存的按需调拨

windows C++ 虚拟内存的按需调拨

文章目录


虚拟内存的按需调拨

cpp 复制代码
/*------------------------------------------------------------------------
 24-SEHAndMemory.cpp
	 
	演示虚拟内存的按需调拨
 
-----------------------------------------------------------------------*/
#include <windows.h>
#include <tchar.h>
#include <locale.h>

#define PAGELIMIT 80
LPBYTE lpNxtPage;
DWORD dwPages = 0;
DWORD dwPageSize;//页面大小,一般为4KB

INT PageFualtExceptionFilter(DWORD dwCode) {
	LPVOID lpvResult;

	//不是非法访问内存
	if (dwCode != EXCEPTION_ACCESS_VIOLATION) {//线程试图读写一个虚拟内存地址,但在这个地址它并不具备相应权限
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//当超过指定的页面数时
	if (dwPages >= PAGELIMIT) {
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//非法访问内存,则为预订的空间提交下一页物理存储器
	lpvResult = VirtualAlloc((LPVOID)lpNxtPage, dwPageSize, MEM_COMMIT, PAGE_READWRITE);
	if (lpvResult == NULL) {
		return EXCEPTION_EXECUTE_HANDLER;//执行except块的异常处理程序代码
	}

	//提交成功
	dwPages++;
	lpNxtPage += dwPageSize;

	_tprintf(_T("第%d页提交成功!\n"), dwPages);
	return EXCEPTION_CONTINUE_EXECUTION; //重新执行触发异常的那条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);

	//预订存储器
	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');//写入一个字节的数据
		}
		__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;
}
相关推荐
SilentSamsara16 小时前
NumPy 进阶:广播机制、ufunc 与向量化计算的工程实践
开发语言·python·青少年编程·性能优化·numpy
珊瑚里的鱼16 小时前
C++的强制类型转换
android·开发语言·c++
编程探索者小陈16 小时前
接口自动化三件套:JSON Schema 校验 + logging 日志 + Allure 测试报告
开发语言·python
星恒随风16 小时前
C++ 类和对象入门(二):默认成员函数、构造函数和析构函数详解
开发语言·c++·笔记·学习
一个不知名程序员www17 小时前
算法学习入门---算法题DAY5
c++·算法
摇滚侠17 小时前
JavaWeb 全套教程 乱码问题 85-88
java·开发语言
devilnumber17 小时前
Java Lambda方法引用的三类核心类型、转化逻辑与深度对比
java·开发语言
geminigoth17 小时前
python入门三:字典、输入、while循环
开发语言·python
牛油果子哥q17 小时前
【C++ this指针】C++ this指针深度精讲:this底层本质、存储位置、调用机制、const this指针、空指针调用、面试坑点与工程实战
开发语言·c++·面试
胡萝卜的兔17 小时前
go使用voidint实现版本切换
开发语言·chrome·golang