您好,欢迎访问三七文档
实验三虚存管理一、实验目的1.加深对存储管理概念的理解。2.深入了解Windows内存管理机制。3.理解内存分配原理,特别是以页面为单位的虚拟内存分配方法。4.掌握页式虚拟存储技术。5.掌握“最不频繁使用淘汰算法”,即LFU页面淘汰算法。二、理论基础1.页式存储管理技术。2.虚拟存储管理技术。三、实验要求1.编写程序实现简单的虚存管理。2.实验具体包括:(1)设计并实现一个虚存管理程序,模拟一个单道程序的页式存储管理,用一个一维数组模拟实存空间,用一个文本文件模拟辅存空间;(2)建立一张一级页表;(3)编写函数随机产生访存请求,访存操作包括读取、写入、执行等三种类型;(4)编写函数响应访存请求,完成虚地址到实地址的定位及读/写/执行操作,同时判断并处理缺页中断;(5)实现LFU页面淘汰算法。3.实验结束提交书面实验报告。四、实验环境1.运行Windows操作系统的PC机一台。2.PC机上安装VisualC++6.0开发工具软件。五、实验内容1.建立“Win32ConsoleApplication”工程“vmm”。2.建立“C/C++HeaderFile”头文件“vmm.h”,文件内容参见“程序代码”。3.建立“C++SourceFile”源文件“vmm.cpp”,文件内容参见“程序代码”。4.建立“TextFile”文本文件“vmm_auxMem.txt”,模拟辅存空间,文件内容可以输入任意字符(字符数多于512个)。5.运行程序并认真观察和分析程序的运行结果。七、程序代码头文件“vmm.h”#ifndefVMM_H#defineVMM_H/*模拟辅存的文件路径*/#defineAUXILIARY_MEMORYvmm_auxMem.txt/*页面大小(字节)*/#definePAGE_SIZE4/*虚存空间大小(字节)*/#defineVIRTUAL_MEMORY_SIZE(64*4)/*实存空间大小(字节)*/#defineACTUAL_MEMORY_SIZE(32*4)/*总虚页数*/#definePAGE_SUM(VIRTUAL_MEMORY_SIZE/PAGE_SIZE)/*总物理块数*/#defineBLOCK_SUM(ACTUAL_MEMORY_SIZE/PAGE_SIZE)/*可读标识位*/#defineREADABLE0x01u/*可写标识位*/#defineWRITABLE0x02u/*可执行标识位*/#defineEXECUTABLE0x04u/*页表项*/typedefstruct{unsignedintblockNum;//物理块号BOOLfilled;//页面装入特征位BYTEproType;//页面保护类型BOOLedited;//页面修改标识unsignedlongauxAddr;//外存地址unsignedlongcount;//页面使用计数器}PageTableItem,*Ptr_PageTableItem;/*访存请求类型*/typedefenum{REQUEST_READ,REQUEST_WRITE,REQUEST_EXECUTE}MemoryAccessRequestType;/*访存请求*/typedefstruct{MemoryAccessRequestTypereqType;//访存请求类型unsignedlongvirAddr;//虚地址BYTEvalue;//写请求的值}MemoryAccessRequest,*Ptr_MemoryAccessRequest;/*访存错误代码*/typedefenum{ERROR_READ_DENY,//该页不可读ERROR_WRITE_DENY,//该页不可写ERROR_EXECUTE_DENY,//该页不可执行ERROR_INVALID_REQUEST,//非法请求类型ERROR_OVER_BOUNDARY,//地址越界ERROR_FILE_OPEN_FAILED,//文件打开失败ERROR_FILE_CLOSE_FAILED,//文件关闭失败ERROR_FILE_SEEK_FAILED,//文件指针定位失败ERROR_FILE_READ_FAILED,//文件读取失败ERROR_FILE_WRITE_FAILED//文件写入失败}ERROR_CODE;/*产生访存请求*/voiddo_request();/*响应访存请求*/voiddo_response();/*处理缺页中断*/voiddo_page_fault(Ptr_PageTableItem);/*LFU页面替换*/voiddo_LFU(Ptr_PageTableItem);/*装入页面*/voiddo_page_in(Ptr_PageTableItem,unsignedint);/*写出页面*/voiddo_page_out(Ptr_PageTableItem);/*错误处理*/voiddo_error(ERROR_CODE);/*打印页表相关信息*/voiddo_print_info();/*获取页面保护类型字符串*/char*get_proType_str(char*,BYTE);#endif源文件“vmm.cpp”#includestdio.h#includestdlib.h#includetime.h#includewindows.h#includevmm.h/*页表*/PageTableItempageTable[PAGE_SUM];/*实存空间*/BYTEactMem[ACTUAL_MEMORY_SIZE];/*用文件模拟辅存空间*/FILE*ptr_auxMem;/*物理块使用标识*/boolblockStatus[BLOCK_SUM];/*访存请求*/Ptr_MemoryAccessRequestptr_memAccReq;/*初始化环境*/voiddo_init(){srand((unsignedint)time(NULL));for(inti=0;iPAGE_SUM;i++){pageTable[i].filled=false;pageTable[i].edited=false;pageTable[i].count=0;/*使用随机数设置该页的保护类型*/switch(rand()%7){case0:{pageTable[i].proType=READABLE;break;}case1:{pageTable[i].proType=WRITABLE;break;}case2:{pageTable[i].proType=EXECUTABLE;break;}case3:{pageTable[i].proType=READABLE|WRITABLE;break;}case4:{pageTable[i].proType=READABLE|EXECUTABLE;break;}case5:{pageTable[i].proType=WRITABLE|EXECUTABLE;break;}case6:{pageTable[i].proType=READABLE|WRITABLE|EXECUTABLE;break;}default:break;}/*设置该页对应的辅存地址,本程序为实现简单采用顺序设置的方式,可替换成其他设置方式,但须注意每个页表项对应的辅存地址均应为PAGE_SIZE的整数倍*/pageTable[i].auxAddr=i*PAGE_SIZE*2;}for(intj=0;jBLOCK_SUM;j++){/*随机选择一些物理块进行页面装入*/if(rand()%2==0){do_page_in(&pageTable[j],j);pageTable[j].blockNum=j;pageTable[j].filled=true;blockStatus[j]=true;}elseblockStatus[j]=false;}}/*响应请求*/voiddo_response(){Ptr_PageTableItemptr_pageTabIt;unsignedintpageNum,offAddr;unsignedintactAddr;/*检查地址是否越界*/if(ptr_memAccReq-virAddr0||ptr_memAccReq-virAddr=VIRTUAL_MEMORY_SIZE){do_error(ERROR_OVER_BOUNDARY);return;}/*计算页号和页内偏移值*/pageNum=ptr_memAccReq-virAddr/PAGE_SIZE;offAddr=ptr_memAccReq-virAddr%PAGE_SIZE;printf(页号为:%u\t页内偏移为:%u\n,pageNum,offAddr);/*获取对应页表项*/ptr_pageTabIt=&pageTable[pageNum];/*根据特征位决定是否产生缺页中断*/if(!ptr_pageTabIt-filled){do_page_fault(ptr_pageTabIt);}actAddr=ptr_pageTabIt-blockNum*PAGE_SIZE+offAddr;printf(实地址为:%u\n,actAddr);/*检查页面访问权限并处理访存请求*/switch(ptr_memAccReq-reqType){caseREQUEST_READ://读请求{ptr_pageTabIt-count++;if(!(ptr_pageTabIt-proType&READABLE))//页面不可读{do_error(ERROR_READ_DENY);return;}/*读取实存中的内容*/printf(读操作成功:值为%02X\n,actMem[actAddr]);break;}caseREQUEST_WRITE://写请求{ptr_pageTabIt-count++;if(!(ptr_pageTabIt-proType&WRITABLE))//页面不可写{do_error(ERROR_WRITE_DENY);return;}/*向实存中写入请求的内容*/actMem[actAddr]=ptr_memAccReq-value;ptr_pageTabIt-edited=true;printf(写操作成功\n);break;}caseREQUEST_EXECUTE://执行请求{ptr_pageTabIt-count++;if(!(ptr_pageTabIt-proType&EXECUTABLE))//页面不可执行{do_error(ERROR_EXECUTE_DENY);return;}printf(执行成功\n);break;}default://非法请求类型{do_error(ERROR_INVALID_REQUEST);return;}}}/*处理缺页中断*/voiddo_page_fault(Ptr_PageTableItemptr_pageTabIt){printf(产生缺页中断,开始进行调页...\n);for(unsignedinti=0;iBLOCK_SUM;i++){if(!blockStatus[i]){/*读辅存内容,写入到实存*/do_page_in(ptr_pageTabIt,i);/*更新页表内容*/ptr_pageTabIt-blockNum=i;ptr_pageTabIt-filled=true;ptr_pageTabIt-edited=false;ptr_pageTabIt-count=0;blockStatus[i]=true;return;}}/*没有空闲物理块,进行页面替换*/do_LFU(ptr_pageTabIt);}/*根据LFU算法进行页面替换*/voiddo_LFU(Ptr_PageTableItemptr_pageTabIt){printf(没有空闲物理
本文标题:虚存管理OS实验
链接地址:https://www.777doc.com/doc-5344086 .html