虚存管理OS实验_第1页
虚存管理OS实验_第2页
虚存管理OS实验_第3页
虚存管理OS实验_第4页
虚存管理OS实验_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验三 虚存管理一、实验目的1. 加深对存储管理概念的理解。2. 深入了解Windows内存管理机制。3. 理解内存分配原理,特别是以页面为单位的虚拟内存分配方法。4. 掌握页式虚拟存储技术。5. 掌握“最不频繁使用淘汰算法”,即LFU页面淘汰算法。二、理论基础1. 页式存储管理技术。2. 虚拟存储管理技术。三、实验要求1. 编写程序实现简单的虚存管理。2. 实验具体包括:(1) 设计并实现一个虚存管理程序,模拟一个单道程序的页式存储管理,用一个一维数组模拟实存空间,用一个文本文件模拟辅存空间;(2) 建立一张一级页表;(3) 编写函数随机产生访存请求,访存操作包括读取、写入、执行等三种类型;

2、(4) 编写函数响应访存请求,完成虚地址到实地址的定位及读/写/执行操作,同时判断并处理缺页中断;(5) 实现LFU页面淘汰算法。3. 实验结束提交书面实验报告。四、实验环境1. 运行Windows操作系统的PC机一台。2. PC机上安装Visual C+ 6.0开发工具软件。五、实验内容1. 建立“Win32 Console Application”工程“vmm”。2. 建立“C/C+ Header File”头文件“vmm.h”,文件内容参见“程序代码”。3. 建立“C+ Source File”源文件“vmm.cpp”,文件内容参见“程序代码”。4. 建立“Text File”文本文件“

3、vmm_auxMem.txt”,模拟辅存空间,文件内容可以输入任意字符(字符数多于512个)。5. 运行程序并认真观察和分析程序的运行结果。七、程序代码头文件“vmm.h”#ifndef VMM_H#define VMM_H/* 模拟辅存的文件路径 */#define AUXILIARY_MEMORY vmm_auxMem.txt/* 页面大小(字节)*/#define PAGE_SIZE 4/* 虚存空间大小(字节) */#define VIRTUAL_MEMORY_SIZE (64 * 4)/* 实存空间大小(字节) */ #define ACTUAL_MEMORY_SIZE (32 *

4、4)/* 总虚页数 */#define PAGE_SUM (VIRTUAL_MEMORY_SIZE / PAGE_SIZE)/* 总物理块数 */#define BLOCK_SUM (ACTUAL_MEMORY_SIZE / PAGE_SIZE)/* 可读标识位 */#define READABLE 0x01u/* 可写标识位 */#define WRITABLE 0x02u/* 可执行标识位 */#define EXECUTABLE 0x04u/* 页表项 */typedef structunsigned int blockNum; /物理块号BOOL filled; /页面装入特征位BYT

5、E proType; /页面保护类型BOOL edited; /页面修改标识unsigned long auxAddr; /外存地址unsigned long count; /页面使用计数器 PageTableItem, *Ptr_PageTableItem;/* 访存请求类型 */typedef enum REQUEST_READ, REQUEST_WRITE, REQUEST_EXECUTE MemoryAccessRequestType;/* 访存请求 */typedef structMemoryAccessRequestType reqType; /访存请求类型unsigned lon

6、g virAddr; /虚地址BYTE value; /写请求的值 MemoryAccessRequest, *Ptr_MemoryAccessRequest;/* 访存错误代码 */typedef enum ERROR_READ_DENY, /该页不可读ERROR_WRITE_DENY, /该页不可写ERROR_EXECUTE_DENY, /该页不可执行ERROR_INVALID_REQUEST, /非法请求类型ERROR_OVER_BOUNDARY, /地址越界ERROR_FILE_OPEN_FAILED, /文件打开失败ERROR_FILE_CLOSE_FAILED, /文件关闭失败ER

7、ROR_FILE_SEEK_FAILED, /文件指针定位失败ERROR_FILE_READ_FAILED, /文件读取失败ERROR_FILE_WRITE_FAILED /文件写入失败 ERROR_CODE;/* 产生访存请求 */void do_request();/* 响应访存请求 */void do_response();/* 处理缺页中断 */void do_page_fault(Ptr_PageTableItem);/* LFU页面替换 */void do_LFU(Ptr_PageTableItem);/* 装入页面 */void do_page_in(Ptr_PageTableI

8、tem, unsigned int);/* 写出页面 */void do_page_out(Ptr_PageTableItem);/* 错误处理 */void do_error(ERROR_CODE);/* 打印页表相关信息 */void do_print_info();/* 获取页面保护类型字符串 */char *get_proType_str(char *, BYTE);#endif源文件“vmm.cpp”#include #include #include #include #include vmm.h/* 页表 */PageTableItem pageTablePAGE_SUM;/*

9、实存空间 */BYTE actMemACTUAL_MEMORY_SIZE;/* 用文件模拟辅存空间 */FILE *ptr_auxMem;/* 物理块使用标识 */bool blockStatusBLOCK_SUM;/* 访存请求 */Ptr_MemoryAccessRequest ptr_memAccReq;/* 初始化环境 */void do_init()srand(unsigned int) time(NULL);for (int i = 0; i PAGE_SUM; i+)pageTablei.filled = false;pageTablei.edited = false;pageT

10、ablei.count = 0;/* 使用随机数设置该页的保护类型 */switch (rand() % 7)case 0:pageTType = READABLE;break;case 1:pageTType = WRITABLE;break;case 2:pageTType = EXECUTABLE;break;case 3:pageTType = READABLE | WRITABLE;break;case 4:pageTType = READABLE | EXECUTABLE;break;case

11、 5:pageTType = WRITABLE | EXECUTABLE;break;case 6:pageTType = READABLE | WRITABLE | EXECUTABLE;break;default:break;/* 设置该页对应的辅存地址,本程序为实现简单采用顺序设置的方式,可替换成其他设置方式,但须注意每个页表项对应的辅存地址均应为PAGE_SIZE的整数倍 */pageTablei.auxAddr = i * PAGE_SIZE * 2;for (int j = 0; j virAddr virAddr = VIRTUAL_MEMOR

12、Y_SIZE)do_error(ERROR_OVER_BOUNDARY);return;/* 计算页号和页内偏移值 */pageNum = ptr_memAccReq-virAddr / PAGE_SIZE;offAddr = ptr_memAccReq-virAddr % PAGE_SIZE;printf(页号为:%ut页内偏移为:%un, pageNum, offAddr);/* 获取对应页表项 */ptr_pageTabIt = &pageTablepageNum;/* 根据特征位决定是否产生缺页中断 */if (!ptr_pageTabIt-filled)do_page_fault(p

13、tr_pageTabIt);actAddr = ptr_pageTabIt-blockNum * PAGE_SIZE + offAddr;printf(实地址为:%un, actAddr);/* 检查页面访问权限并处理访存请求 */switch (ptr_memAccReq-reqType)case REQUEST_READ: /读请求ptr_pageTabIt-count+;if (!(ptr_pageTabIt-proType & READABLE) /页面不可读do_error(ERROR_READ_DENY);return;/* 读取实存中的内容 */printf(读操作成功:值为%0

14、2Xn, actMemactAddr);break;case REQUEST_WRITE: /写请求ptr_pageTabIt-count+;if (!(ptr_pageTabIt-proType & WRITABLE) /页面不可写do_error(ERROR_WRITE_DENY);return;/* 向实存中写入请求的内容 */actMemactAddr = ptr_memAccReq-value;ptr_pageTabIt-edited = true;printf(写操作成功n);break;case REQUEST_EXECUTE: /执行请求ptr_pageTabIt-count+

15、;if (!(ptr_pageTabIt-proType & EXECUTABLE) /页面不可执行do_error(ERROR_EXECUTE_DENY);return;printf(执行成功n);break;default: /非法请求类型do_error(ERROR_INVALID_REQUEST);return;/* 处理缺页中断 */void do_page_fault(Ptr_PageTableItem ptr_pageTabIt)printf(产生缺页中断,开始进行调页.n);for (unsigned int i = 0; i blockNum = i;ptr_pageTabI

16、t-filled = true;ptr_pageTabIt-edited = false;ptr_pageTabIt-count = 0;blockStatusi = true;return;/* 没有空闲物理块,进行页面替换 */do_LFU(ptr_pageTabIt);/* 根据LFU算法进行页面替换 */void do_LFU(Ptr_PageTableItem ptr_pageTabIt)printf(没有空闲物理块,开始进行LFU页面替换.n);for (unsigned int i = 0, min = 0xFFFFFFFF, page = 0; i PAGE_SUM; i+)i

17、f (pageTablei.count blockNum = pageTablepage.blockNum;ptr_pageTabIt-filled = true;ptr_pageTabIt-edited = false;ptr_pageTabIt-count = 0;printf(页面替换成功n);/* 将辅存内容写入实存 */void do_page_in(Ptr_PageTableItem ptr_pageTabIt, unsigned int blockNum)unsigned int readNum;if (fseek(ptr_auxMem, ptr_pageTabIt-auxAdd

18、r, SEEK_SET) 0)exit(1);if (readNum = fread(actMem + blockNum * PAGE_SIZE, sizeof(BYTE), PAGE_SIZE, ptr_auxMem) 物理块%un, ptr_pageTabIt-auxAddr, blockNum);/* 将被替换页面的内容写回辅存 */void do_page_out(Ptr_PageTableItem ptr_pageTabIt)unsigned int writeNum;if (fseek(ptr_auxMem, ptr_pageTabIt-auxAddr, SEEK_SET) blo

19、ckNum * PAGE_SIZE, sizeof(BYTE), PAGE_SIZE, ptr_auxMem) 辅存地址%un, ptr_pageTabIt-auxAddr, ptr_pageTabIt-blockNum);/* 错误处理 */void do_error(ERROR_CODE code)switch (code)case ERROR_READ_DENY:printf(访存失败:该地址内容不可读n);break;case ERROR_WRITE_DENY:printf(访存失败:该地址内容不可写n);break;case ERROR_EXECUTE_DENY:printf(访存失

20、败:该地址内容不可执行n);break;case ERROR_INVALID_REQUEST:printf(访存失败:非法访存请求n);break;case ERROR_OVER_BOUNDARY:printf(访存失败:地址越界n);break;case ERROR_FILE_OPEN_FAILED:printf(系统错误:打开文件失败n);break;case ERROR_FILE_CLOSE_FAILED:printf(系统错误:关闭文件失败n);break;case ERROR_FILE_SEEK_FAILED:printf(系统错误:文件指针定位失败n);break;case ERR

21、OR_FILE_READ_FAILED:printf(系统错误:读取文件失败n);break;case ERROR_FILE_WRITE_FAILED:printf(系统错误:写入文件失败n);break;default:printf(未知错误:没有这个错误代码n);/* 产生访存请求 */void do_request()/* 随机产生请求地址 */ptr_memAccReq-virAddr = rand() % VIRTUAL_MEMORY_SIZE;/* 随机产生请求类型 */switch (rand() % 3)case 0: /读请求ptr_memAccReq-reqType = R

22、EQUEST_READ;printf(产生请求:n地址:%ut类型:读取n, ptr_memAccReq-virAddr);break;case 1: /写请求ptr_memAccReq-reqType = REQUEST_WRITE;/* 随机产生待写入的值 */ptr_memAccReq-value = rand() % 0xFFu;printf(产生请求:n地址:%ut类型:写入t值:%02Xn, ptr_memAccReq-virAddr, ptr_memAccReq-value);break;case 2:ptr_memAccReq-reqType = REQUEST_EXECUTE;printf(产生请求:n地址:%ut类型:执行n, ptr_memAccReq-virAddr);break;default:break;/* 打印页表 */void do_print_info()char str4;printf(页号t块号t装入t修改t保护t计数t辅存n);for (unsigned int i = 0; i PAGE_SUM; i+)printf(%ut%ut%ut%ut%st%ut%un, i, pageTablei.blockNum, pageTabl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论