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;
}
相关推荐
曹轲恒7 小时前
Java中断
java·开发语言
施棠海8 小时前
监听与回调的三个demo
java·开发语言
時肆4858 小时前
C语言造轮子大赛:从零构建核心组件
c语言·开发语言
赴前尘8 小时前
golang 查看指定版本库所依赖库的版本
开发语言·后端·golang
de之梦-御风9 小时前
【C#.Net】C#开发的未来前景
开发语言·c#·.net
知乎的哥廷根数学学派9 小时前
基于数据驱动的自适应正交小波基优化算法(Python)
开发语言·网络·人工智能·pytorch·python·深度学习·算法
非凡ghost9 小时前
Wireshark中文版(网络抓包工具)
网络·windows·学习·测试工具·wireshark·软件需求
de之梦-御风9 小时前
【C#.Net】C#在工业领域的具体应用场景
开发语言·c#·.net
sunfove9 小时前
将 Python 仿真工具部署并嵌入个人博客
开发语言·数据库·python
ID_180079054739 小时前
YouTube item_get_video接口认证方式:API密钥与OAuth2.0的选择与应用
服务器·windows·microsoft