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;
}
相关推荐
毕设源码-钟学长几秒前
【开题答辩全过程】以 基于Java的停车场信息管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
Mr -老鬼1 分钟前
基于 Go 的脚本平台 APP 云控系统
开发语言·后端·golang
hewence14 分钟前
Kotlin CoroutineScope解密
android·开发语言·kotlin
咩图6 分钟前
VSCode+Python创建项目
开发语言·python
zhanglu51167 分钟前
Java Lambda 表达式使用深度解析
开发语言·前端·python
Coding茶水间8 分钟前
基于深度学习的车牌识别系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·机器学习
郁闷的网纹蟒25 分钟前
虚幻5---第15部分---宝藏(掉落物)
开发语言·c++·ue5·游戏引擎·虚幻
大鹏说大话34 分钟前
深入理解 Go 中的 make(chan chan error):高阶通道的典型用法与实战场景
开发语言·后端·golang
俩娃妈教编程35 分钟前
洛谷选题:P1888 三角函数
c++·算法
yuuki23323336 分钟前
【C++】模拟实现 红黑树(RBTree)
java·开发语言·c++