虚拟存储器管理 .
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮海工学院计算机工程学院实验报告书
课程名:《操作系统原理》
题目:虚拟存储器管理
班级:网络122
学号:
姓名
评语:
成绩:指导教师:
批阅时间:年月日
一、实验目的
请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。
二、实验内容
本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。
其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。
三、实验步骤
1.实验说明
实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。
2.实验流程
Y N 发生缺页
N Y
主页面 OPT 算法 LRU 算法 开始 取指令 取指令中的负号 查页表
页标志=1
? 形成绝对地址 输出绝对地址 输出*页号表示发生缺页中断 有后续指令 取下条指令 输出缺页数及缺页率 结束
四、实验源程序
#include
#include
#include
using namespace std;
#define M 9
#define N 20
typedef struct node1/*页面的数据结构*/
{
int num;
int age;
int state;
int blocknum;
}page ;
typedef struct node2/*内存块的数据结构*/
{
int num;
int state;
int pagenum;
int age;
}Block;
void LRU(Block b[],int n,page p[],int m)/*最近最少使用页面置换算法*/ {
int i,j,j1,k,mm,mn,flag=0;
float num=0,c=0;
for (j=0;j { for (mm=0;mm { if(b[mm].pagenum==p[j].num) flag=1; } if(flag==1) cout< { c++; cout< if (p[j].state==0) { for(i=0;i { if(b[i].state==0) { p[j].blocknum=b[i].num; p[j].state=1; b[i].pagenum=p[j].num; b[i].state=1; break; } } if(i>=n) { for (mn=j-1;mn>=0;mn--) { if(num { num++; for (j1=mn+1;j1<=j-1;j1++) { if(p[mn].num==p[j1].num) { num--; } } } if (num==n) { break; } } for (mm=0;mm { if (p[mn].num==b[mm].pagenum) { k=mm; break; } } b[k].pagenum=p[j].num; b[k].age=0; p[j].blocknum=b[mm].num; p[j].state=1; } } } cout<<"页面调序列为:"; for (mm=0;mm { cout< } cout< flag=0; num=0; } cout<<"缺页总次数:"< cout<<"缺页率:"< } void OPT(Block b[],int n,page p[],int m)/*最优页面置换算法*/ { int i,j,k,mm,mn,flag=0; int maxage=-1;float c=0; for (j=0;j { for (mm=0;mm { if(b[mm].pagenum==p[j].num) flag=1; } if(flag==1) cout< else if (flag==0) { c++; cout< if (p[j].state==0) { for(i=0;i { if(b[i].state==0) { p[j].blocknum=b[i].num; p[j].state=1; b[i].pagenum=p[j].num; b[i].state=1; break;