操作系统实验4请求分页存储管理模拟实验.docx
《操作系统实验4请求分页存储管理模拟实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验4请求分页存储管理模拟实验.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验4请求分页存储管理模拟实验
实验四
请求分页存储管理模拟实验
一:
实验目的
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。
二:
实验内容
假设每个页面可以存放10条指令,分配给进程的存储块数为4。
用C语言或Pascal语言模拟一进程的执行过程。
设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。
模拟运行时,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。
最后显示其物理地址,并转下一条指令。
在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。
页面置换算法:
分别采用OPT、FIFO、LRU三种算法。
进程中的指令访问次序按如下原则生成:
50%的指令是顺序执行的。
25%的指令是均匀分布在低地址部分。
25%的指令是均匀分布在高地址部分。
三:
实验类别
分页存储管理
四:
实验类型
模拟实验
五:
主要仪器
计算机
六:
结果
OPT:
LRU:
FIFO:
七:
程序
#include
#include
#include
#defineblocknum4//页面尺寸大小
intm;//程序计数器,用来记录按次序执行的指令对应的页号
staticintnum[320];//用来存储320条指令
typedefstructBLOCK//声明一种新类型--物理块类型
{
intpagenum;//页号
intaccessed;//访问量,其值表示多久未被访问
}BLOCK;
BLOCKblock[blocknum];//定义一大小为8的物理块数组
voidinit()//程序初始化函数,对block初始化
{
for(inti=0;i{
block[i].pagenum=-1;
block[i].accessed=0;
m=0;
}
}
intpageExist(intcurpage)//查找物理块中页面是否存在,寻找该页面curpage是否在内存块block中,若在,返回块号
{
for(inti=0;i{
if(block[i].pagenum==curpage)
returni;//在内存块block中,返回块号
}
return-1;
}
intfindSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号
{
for(inti=0;i{
if(block[i].pagenum==-1)
returni;//找到了空闲的block,返回块号
}
return-1;
}
intfindReplace()//查找应予置换的页面
{
intpos=0;
for(inti=0;i{
if(block[i].accessed>block[pos].accessed)
pos=i;//找到应该置换页面,返回BLOCK中位置
}
returnpos;
}
voiddisplay()//显示物理块中的页面号
{
for(inti=0;i{
if(block[i].pagenum!
=-1)
{
printf("%02d",block[i].pagenum);
printf("%p|",&block[i].pagenum);
}
}
printf("\n");
}
voidrandam()//产生320条随机数,显示并存储到num[320]
{
intflag=0;
printf("请为一进程输入起始执行指令的序号(0~320):
\n");
scanf("%d",&m);//用户决定的起始执行指令
printf("******进程中指令访问次序如下:
(由随机数产生)*******\n");
for(inti=0;i<320;i++)
{//进程中的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个页面
printf("\n");
}
}
voidpagestring()//显示调用的页面序列,求出此进程按次序执行的各指令所在的页面号并显示输出
{
for(inti=0;i<320;i++)
{
printf("%02d",num[i]/10);//输出格式:
2位数
if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面
printf("\n");
}
}
voidOPT()//最佳替换算法
{
intn=0;//记录缺页次数
intexist,space,position;
intcurpage;//当前指令的页面号
for(inti=0;i<320;i++)
{
m=num[i];
curpage=m/10;
exist=pageExist(curpage);
if(exist==-1)
{//当前指令的页面号不在物理块中
space=findSpace();
if(space!
=-1)
{//当前存在空闲的物理块
block[space].pagenum=curpage;//将此页面调入内存
display();//显示物理块中的页面号
n++;//缺页次数+1
}
else
{//当前不存在空闲的物理块,需要进行页面置换
for(intk=0;k{
for(intj=i;j<320;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;//将新页面调入
display();
n++;//缺页次数+1
}
}
}
printf("缺页次数:
%d\n",n);
printf("缺页率:
%f%%\n",(n/320.0)*100);
}
voidLRU()//最近最久未使用算法
{
intn=0;//记录缺页次数
intexist,space,position;
intcurpage;//当前指令的页面号
for(inti=0;i<320;i++)
{
m=num[i];
curpage=m/10;
exist=pageExist(curpage);
if(exist==-1)
{//当前指令的页面号不在物理块中
space=findSpace();
if(space!
=-1)
{//当前存在空闲的物理块
block[space].pagenum=curpage;//将此页面调入内存
display();//显示物理块中的页面号
n++;//缺页次数+1
}
else
{//当前不存在空闲的物理块,需要进行页面置换
position=findReplace();
block[position].pagenum=curpage;
display();
n++;//缺页次数+1
}
}
else
block[exist].accessed=-1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(intj=0;j{//其余的accessed++
block[j].accessed++;
}
}
printf("缺页次数:
%d\n",n);
printf("缺页率:
%f%%\n",(n/320.0)*100);
}
voidFIFO()
{
intn=0;//记录缺页次数
intexist,space,position;
intcurpage;//当前指令的页面号
intblockpointer=-1;
for(inti=0;i<320;i++)
{
m=num[i];
curpage=m/10;
exist=pageExist(curpage);
if(exist==-1)
{//当前指令的页面号不在物理块中
space=findSpace();
if(space!
=-1)
{//当前存在空闲的物理块
blockpointer++;
block[space].pagenum=curpage;//将此页面调入内存
n++;//缺页次数+1
display();//显示物理块中的页面号
}
else
{//没有空闲物理块,进行置换
position=(++blockpointer)%4;
block[position].pagenum=curpage;//将此页面调入内存
n++;
display();
}
}
}
printf("缺页次数:
%d\n",n);
printf("缺页率:
%f%%\n",(n/320.0)*100);
}
voidmain()
{
intchoice;
printf("************请求分页存储管理模拟系统*************\n");
randam();
printf("************此进程的页面调用序列如下**************\n");
pagestring();
while(choice!
=4)
{
printf("********1:
OPT2:
LRU3:
FIFO4:
退出*********\n");
printf("请选择一种页面置换算法:
");
scanf("%d",&choice);
init();
switch(choice)
{
case1:
printf("最佳置换算法OPT:
\n");
printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");
OPT();
break;
case2:
printf("最近最久未使用置换算法LRU:
\n");
printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");
LRU();
break;
case3:
printf("先进先出置换算法FIFO:
\n");
printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");
FIFO();
break;
}
}
}