操作系统实验4请求分页存储管理模拟实验Word格式文档下载.docx
《操作系统实验4请求分页存储管理模拟实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验4请求分页存储管理模拟实验Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
三:
实验类别
分页存储管理
四:
实验类型
模拟实验
五:
主要仪器
计算机
六:
结果
OPT:
LRU:
FIFO:
七:
程序
#include<
stdio.h>
stdlib.h>
conio.h>
#defineblocknum4//页面尺寸大小
intm;
//程序计数器,用来记录按次序执行的指令对应的页号
staticintnum[320];
//用来存储320条指令
typedefstructBLOCK//声明一种新类型--物理块类型
{
intpagenum;
//页号
intaccessed;
//访问量,其值表示多久未被访问
}BLOCK;
BLOCKblock[blocknum];
//定义一大小为8的物理块数组
voidinit()//程序初始化函数,对block初始化
for(inti=0;
i<
blocknum;
i++)
{
block[i].pagenum=-1;
block[i].accessed=0;
m=0;
}
}
intpageExist(intcurpage)//查找物理块中页面是否存在,寻找该页面curpage是否在存块block中,若在,返回块号
{
i<
i++)
if(block[i].pagenum==curpage)
returni;
//在存块block中,返回块号
return-1;
intfindSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号
i++)
if(block[i].pagenum==-1)
//找到了空闲的block,返回块号
}
intfindReplace()//查找应予置换的页面
intpos=0;
if(block[i].accessed>
block[pos].accessed)
pos=i;
//找到应该置换页面,返回BLOCK中位置
returnpos;
voiddisplay()//显示物理块中的页面号
{
if(block[i].pagenum!
=-1)
{
printf("
%02d"
block[i].pagenum);
%p|"
&
block[i].pagenum);
}
printf("
\n"
);
voidrandam()//产生320条随机数,显示并存储到num[320]
intflag=0;
请为一进程输入起始执行指令的序号(0~320):
scanf("
%d"
m);
//用户决定的起始执行指令
******进程中指令访问次序如下:
(由随机数产生)*******\n"
320;
{//进程中的320条指令访问次序的生成
num[i]=m;
//当前执行的指令数,
if(flag%2==0)
m=++m%320;
//顺序执行下一条指令
if(flag==1)
m=rand()%(m-1);
//通过随机数,跳转到低地址部分[0,m-1]的一条指令处,设其序号为m1
if(flag==3)
m=m+1+(rand()%(320-(m+1)));
//通过随机数,跳转到高地址部分[m1+2,319]的一条指令处,设其序号为m2
flag=++flag%4;
printf("
%03d"
num[i]);
//输出格式:
3位数
if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面
voidpagestring()//显示调用的页面序列,求出此进程按次序执行的各指令所在的页面号并显示输出
{
%02d"
num[i]/10);
2位数
if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面
voidOPT()//最佳替换算法
intn=0;
//记录缺页次数
intexist,space,position;
intcurpage;
//当前指令的页面号
m=num[i];
curpage=m/10;
exist=pageExist(curpage);
if(exist==-1)
{//当前指令的页面号不在物理块中
space=findSpace();
if(space!
{//当前存在空闲的物理块
block[space].pagenum=curpage;
//将此页面调入存
display();
//显示物理块中的页面号
n++;
//缺页次数+1
}
else
{//当前不存在空闲的物理块,需要进行页面置换
for(intk=0;
k<
k++)
{
for(intj=i;
j<
j++)
{//找到在最长(未来)时间不再被访问的页面
if(block[k].pagenum!
=num[j]/10)
{
block[k].accessed=1000;
}//将来不会被访问,设置为一个很大数
else
{//将来会被访问,访问量设为j
block[k].accessed=j;
break;
}
}
}
position=findReplace();
//找到被置换的页面,淘汰
block[position].pagenum=curpage;
//将新页面调入
//缺页次数+1
缺页次数:
%d\n"
n);
缺页率:
%f%%\n"
(n/320.0)*100);
voidLRU()//最近最久未使用算法
intexist,space,position;
exist=pageExist(curpage);
space=findSpace();
else
block[exist].accessed=-1;
//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(intj=0;
j<
j++)
{//其余的accessed++
block[j].accessed++;
voidFIFO()
intblockpointer=-1;
blockpointer++;
block[space].pagenum=curpage;
{//没有空闲物理块,进行置换
position=(++blockpointer)%4;
voidmain()
intchoice;
************请求分页存储管理模拟系统**********