欢迎来到天天文库
浏览记录
ID:51078841
大小:114.00 KB
页数:12页
时间:2020-03-18
《【精品】实验六存储管理.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验六存储管理实践【实验目的】1)通过实验了解Windows2000内存的使用,学习如何在应用程序中管理内存,体会WindowsPZ用程序内存的简单性和自我防护能力。学习检查虚拟内存空间或对其进行操作;了解Windows2000的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。2)加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。【实验学时】建议2学时【实验内容】在Windows2000环境下,4GB的虚拟地址空间被划分成两个部分:低端2G
2、B提供给进程使用,高端2GB提供给系统使用。这意味着用户的应用程序代码,包括DLL以及进程使用的齐种数据等,都装在用户进程地址空间内(低端2GB)c第一部分虚拟内存的检测检测进程的虚拟地址空间//T•程vmwalker#include#include#include#include#pragmacomment(lib,HShlwapi.libM)//显示内存保护的方法。//保护标记指示:允许应用程序对内存进行访问的类型以及操作系统强制访问的类型inlineb
3、oolTestSet(DWORDdwTarget,DWORDdwMask){return((dwTarget&dwMask)==dwMask);}〃宏定义一个函数//TestSet为内联函数#defineSHOWMASK(dwTarget,type)讦(TestSet(dwTarget,PAGE_##type)){std::cout«",”«#type;}voidShowProtection(DWORDdwTarget)SHOWMASK(dwTarget,READONLY);SHOWMASK(dwTarget,GUARD);SHOWM
4、ASK(dwTarget,NOCACHE);SHOWMASK(dwTarget,READWRITE);SHOWMASK(dwTarget,WRITECOPY);SHOWMASK(dwTarget,EXECUTE);SHOWMASK(dwTarget,EXECUTE_READ);SHOWMASK(dwTarget,EXECUTE_READWRITE);SHOWMASK(dwTarget,EXECUTE_WRITECOPY);SHOWMASK(dwTarget,NOACCESS);//遍历整个虚拟内存,并显示虚拟内存属性voidWalkVM(
5、HANDLEhProcess){//首先,获得系统信息SYSTEM」NFOsi;::ZeroMemory(&si,sizeof(si));::GetSystemlnfb(&si);//分配要存放信息的缓冲区MEMORY_BASIC_INFORMATIONmbi;::ZeroMemory(&mbi,sizeof(mbi));//循环整个应用程序地址空间LPCVOIDpBlock=(LPVOID)si.lpMinimumApplicationAddress;while(pBlock6、//获得下一个虚拟内存块的信息if(::VirtualQueryEx(hProcess,pBlock,&mbi,sizeof(mbi))==sizeof(mbi))//相关的进程//开始位置//缓冲区//大小的确认//计算块的结尾及其大小LPCVOIDpEnd=(PBYTE)pBlock+mbi.RegionSize;TCHARszSize[MAX_PATHJ;::StrFormatByteSize(mbi.RegionSize,szSize,MAX_PATH);//显示块地址和大小std::cout.fill('()');std::co7、ut«std::hex«std::setw(8)«(DWORD)pBlock«”■”«std::hex«std::setw(8)«(DWORD)pEnd«(::strlen(szSize)==7?"(":”(”)«szSize«”)”;//显示块的状态switch(mbi.State){caseMEM_COMMIT:std::cout«"Committed";break;caseMEM_FREE:std::cout«"Free1';break;caseMEM.RESERVE:std::cout«"ReservedH;break;}//显示8、保护方式if(mbi.Protect==0&&mbi.State!二MEM_FREE){mbi.Protect=PAGE_READONLY;}ShowProtection(mbi.Protec
6、//获得下一个虚拟内存块的信息if(::VirtualQueryEx(hProcess,pBlock,&mbi,sizeof(mbi))==sizeof(mbi))//相关的进程//开始位置//缓冲区//大小的确认//计算块的结尾及其大小LPCVOIDpEnd=(PBYTE)pBlock+mbi.RegionSize;TCHARszSize[MAX_PATHJ;::StrFormatByteSize(mbi.RegionSize,szSize,MAX_PATH);//显示块地址和大小std::cout.fill('()');std::co
7、ut«std::hex«std::setw(8)«(DWORD)pBlock«”■”«std::hex«std::setw(8)«(DWORD)pEnd«(::strlen(szSize)==7?"(":”(”)«szSize«”)”;//显示块的状态switch(mbi.State){caseMEM_COMMIT:std::cout«"Committed";break;caseMEM_FREE:std::cout«"Free1';break;caseMEM.RESERVE:std::cout«"ReservedH;break;}//显示
8、保护方式if(mbi.Protect==0&&mbi.State!二MEM_FREE){mbi.Protect=PAGE_READONLY;}ShowProtection(mbi.Protec
此文档下载收益归作者所有