




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 建立“Te
3、xt File”文本文件“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
4、ACTUAL_MEMORY_SIZE (32 * 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; /物理块
5、号BOOL filled; /页面装入特征位BYTE proType; /页面保护类型BOOL edited; /页面修改标识unsigned long auxAddr; /外存地址unsigned long count; /页面使用计数器 PageTableItem, *Ptr_PageTableItem;/* 访存请求类型 */typedef enum REQUEST_READ, REQUEST_WRITE, REQUEST_EXECUTE MemoryAccessRequestType;/* 访存请求 */typedef structMemoryAccessRequestType req
6、Type; /访存请求类型unsigned long 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_FIL
7、E_CLOSE_FAILED, /文件关闭失败ERROR_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
8、do_page_in(Ptr_PageTableItem, 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 <stdio.h>#include <stdlib.h>#include <time.h
9、>#include <windows.h>#include "vmm.h"/* 页表 */PageTableItem pageTablePAGE_SUM;/* 实存空间 */BYTE actMemACTUAL_MEMORY_SIZE;/* 用文件模拟辅存空间 */FILE *ptr_auxMem;/* 物理块使用标识 */bool blockStatusBLOCK_SUM;/* 访存请求 */Ptr_MemoryAccessRequest ptr_memAccReq;/* 初始化环境 */void do_init()srand(unsigned int)
10、time(NULL);for (int i = 0; i < PAGE_SUM; i+)pageTablei.filled = false;pageTablei.edited = false;pageTablei.count = 0;/* 使用随机数设置该页的保护类型 */switch (rand() % 7)case 0:pageTType = READABLE;break;case 1:pageTType = WRITABLE;break;case 2:pageTType = EXECUTABLE;break;case 3:pag
11、eTType = READABLE | WRITABLE;break;case 4:pageTType = READABLE | EXECUTABLE;break;case 5:pageTType = WRITABLE | EXECUTABLE;break;case 6:pageTType = READABLE | WRITABLE | EXECUTABLE;break;default:break;/* 设置该页对应的辅存地址,本程序为实现简单采用顺序设置的方式,可替换成其他设置方式,但须注意每个页表项对应的辅存地址均应为
12、PAGE_SIZE的整数倍 */pageTablei.auxAddr = i * PAGE_SIZE * 2;for (int j = 0; j < BLOCK_SUM; j+)/* 随机选择一些物理块进行页面装入 */if (rand() % 2 = 0)do_page_in(&pageTablej, j);pageTablej.blockNum = j;pageTablej.filled = true;blockStatusj = true;elseblockStatusj = false;/* 响应请求 */void do_response()Ptr_PageTableIt
13、em ptr_pageTabIt;unsigned int pageNum, offAddr;unsigned int actAddr;/* 检查地址是否越界 */if (ptr_memAccReq->virAddr < 0 | ptr_memAccReq->virAddr >= VIRTUAL_MEMORY_SIZE)do_error(ERROR_OVER_BOUNDARY);return;/* 计算页号和页内偏移值 */pageNum = ptr_memAccReq->virAddr / PAGE_SIZE;offAddr = ptr_memAccReq-&g
14、t;virAddr % PAGE_SIZE;printf("页号为:%ut页内偏移为:%un", pageNum, offAddr);/* 获取对应页表项 */ptr_pageTabIt = &pageTablepageNum;/* 根据特征位决定是否产生缺页中断 */if (!ptr_pageTabIt->filled)do_page_fault(ptr_pageTabIt);actAddr = ptr_pageTabIt->blockNum * PAGE_SIZE + offAddr;printf("实地址为:%un", actA
15、ddr);/* 检查页面访问权限并处理访存请求 */switch (ptr_memAccReq->reqType)case REQUEST_READ: /读请求ptr_pageTabIt->count+;if (!(ptr_pageTabIt->proType & READABLE) /页面不可读do_error(ERROR_READ_DENY);return;/* 读取实存中的内容 */printf("读操作成功:值为%02Xn", actMemactAddr);break;case REQUEST_WRITE: /写请求ptr_pageTabI
16、t->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+;if (!(ptr_pageTabIt->p
17、roType & 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 < BLOCK_SUM; i+)
18、if (!blockStatusi)/* 读辅存内容,写入到实存 */do_page_in(ptr_pageTabIt, i);/* 更新页表内容 */ptr_pageTabIt->blockNum = i;ptr_pageTabIt->filled = true;ptr_pageTabIt->edited = false;ptr_pageTabIt->count = 0;blockStatusi = true;return;/* 没有空闲物理块,进行页面替换 */do_LFU(ptr_pageTabIt);/* 根据LFU算法进行页面替换 */void do_LFU(
19、Ptr_PageTableItem ptr_pageTabIt)printf("没有空闲物理块,开始进行LFU页面替换.n");for (unsigned int i = 0, min = 0xFFFFFFFF, page = 0; i < PAGE_SUM; i+)if (pageTablei.count < min)min = pageTablei.count;page = i;printf("选择第%u页进行替换n", page);if (pageTablepage.edited)/* 页面内容有修改,需要写回至辅存 */printf(
20、"该页内容有修改,写回至辅存n");do_page_out(&pageTablepage);pageTablepage.filled = false;pageTablepage.count = 0;/* 读辅存内容,写入到实存 */do_page_in(ptr_pageTabIt, pageTablepage.blockNum);/* 更新页表内容 */ptr_pageTabIt->blockNum = pageTablepage.blockNum;ptr_pageTabIt->filled = true;ptr_pageTabIt->edited
21、 = 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->auxAddr, SEEK_SET) < 0)exit(1);if (readNum = fread(actMem + blockNum * PAGE_SIZE, siz
22、eof(BYTE), PAGE_SIZE, ptr_auxMem) < PAGE_SIZE)exit(1);printf("调页成功:辅存地址%u->>物理块%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) < 0)exi
23、t(1);if (writeNum = fwrite(actMem + ptr_pageTabIt->blockNum * PAGE_SIZE, sizeof(BYTE), PAGE_SIZE, ptr_auxMem) < PAGE_SIZE)do_error(ERROR_FILE_WRITE_FAILED);exit(1);printf("写回成功:物理块%u->>辅存地址%un", ptr_pageTabIt->auxAddr, ptr_pageTabIt->blockNum);/* 错误处理 */void do_error(ERRO
24、R_CODE code)switch (code)case ERROR_READ_DENY:printf("访存失败:该地址内容不可读n");break;case ERROR_WRITE_DENY:printf("访存失败:该地址内容不可写n");break;case ERROR_EXECUTE_DENY:printf("访存失败:该地址内容不可执行n");break;case ERROR_INVALID_REQUEST:printf("访存失败:非法访存请求n");break;case ERROR_OVER_BO
25、UNDARY: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 ERROR_FILE_READ_FAILED:printf("系统错误:读取文件失败
26、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
27、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+)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢材加工安装合同范本
- 合伙创业分红合同范本
- 吉林省吉林市吉林高新技术产业开发区2024-2025学年八年级上学期12月期末考试数学试卷(含解析)
- 雕塑进货出售合同范本
- 砂石土方运输合同范本
- 豆粨采购合同范本
- 《2025租赁合同终极大典》
- 出售球拍合同范本
- 山东省日照市2025届高三下学期一模试题 政治 无答案
- 2024年扬州市广陵区教育系统事业单位招聘教师真题
- 2025-2030年中国CAE软件行业市场行情监测及发展前景研判报告
- 2025江西南昌市江铜产融社会招聘1人笔试参考题库附带答案详解
- (二统)昆明市2025届“三诊一模”高三复习教学质量检测地理试卷(含答案)
- Unit 3 Keep Fit Section A 2a-2e 教学设计 2024-2025学年人教版(2024)七年级英语下册
- 2025徽县辅警考试题库
- (一模)2025年广东省高三高考模拟测试 (一) 卷数学试卷(含官方答案)
- 脑心健康管理师的学习汇报
- 树木移植合同范本
- 2025年开封大学单招职业技能测试题库新版
- 2025年张家界航空工业职业技术学院单招职业技能测试题库及参考答案
- 财政投资评审咨询服务预算和结算评审项目投标文件(技术方案)
评论
0/150
提交评论