资源描述
实验四
请求分页存储管理模拟实验
一:实验目得
通过对页面、页表、地址转换与页面置换过程得模拟,加深对请求分页存储管理系统得原理与实现技术得理解.
二:实验内容
假设每个页面可以存放10条指令,分配给进程得存储块数为4。
用C语言或Pascal语言模拟一进程得执行过程。设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。模拟运行时,如果所访问得指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问得指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。最后显示其物理地址,并转下一条指令。在所有指令执行完毕后,显示进程运行过程中得缺页次数与缺页率.
页面置换算法:分别采用OPT、FIFO、LRU三种算法。
进程中得指令访问次序按如下原则生成:
50%得指令就是顺序执行得。
25%得指令就是均匀分布在低地址部分.
25%得指令就是均匀分布在高地址部分.
三:实验类别
分页存储管理
四:实验类型
模拟实验
五:主要仪器
计算机
六:结果
OPT:
LRU:
FIFO:
七:程序
# include〈stdio、h〉
# include〈stdlib、h〉
# include〈conio、h>
# define blocknum 4//页面尺寸大小
int m; //程序计数器,用来记录按次序执行得指令对应得页号
static int num[320]; //用来存储320条指令
typedef struct BLOCK //声明一种新类型—-物理块类型
{
ﻩint pagenum; //页号
ﻩint accessed; //访问量,其值表示多久未被访问
}BLOCK;
BLOCK block[blocknum]; //定义一大小为8得物理块数组
void init() //程序初始化函数,对block初始化
{
for(int i=0;i<blocknum;i++)
ﻩ{
block[i]、pagenum=—1;
block[i]、accessed=0;
ﻩm=0;
}
}
int pageExist(int curpage)//查找物理块中页面就是否存在,寻找该页面curpage就是否在内存块block中,若在,返回块号
{
ﻩfor(int i=0; i<blocknum; i++)
ﻩ{
ﻩﻩif(block[i]、pagenum == curpage )
ﻩﻩreturn i; //在内存块block中,返回块号
ﻩ}
return -1;
}
int findSpace()//查找就是否有空闲物理块,寻找空闲块block,返回其块号
{
for(int i=0;i<blocknum;i++)
ﻩ{
if(block[i]、pagenum==-1)
ﻩreturn i; //找到了空闲得block,返回块号
}
ﻩreturn -1;
}
int findReplace()//查找应予置换得页面
{
ﻩint pos = 0;
ﻩfor(int i=0;i〈blocknum;i++)
{
if(block[i]、accessed 〉 block[pos]、accessed)
ﻩpos = i; //找到应该置换页面,返回BLOCK中位置
ﻩ}
return pos;
}
void display()//显示物理块中得页面号
{ ﻩ
ﻩfor(int i=0; i〈blocknum; i++)
ﻩ{
ﻩ if(block[i]、pagenum != -1)
ﻩ{
ﻩﻩ printf(” %02d ",block[i]、pagenum);
ﻩﻩﻩprintf("%p |”,&block[i]、pagenum);
ﻩﻩ}
}
printf("\n");
}
void randam()//产生320条随机数,显示并存储到num[320]
{
int flag=0;
printf(”请为一进程输入起始执行指令得序号(0~320):\n”);
ﻩscanf("%d",&m);//用户决定得起始执行指令
printf("******进程中指令访问次序如下:(由随机数产生)*******\n");
for(int i=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”);
}
}
void pagestring() //显示调用得页面序列,求出此进程按次序执行得各指令所在得页面号并显示输出
{
for(int i=0;i〈320;i++)
ﻩ{
printf(” %02d",num[i]/10);//输出格式:2位数
if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面
ﻩﻩ printf("\n”);
}
}
void OPT() //最佳替换算法
{
ﻩint n=0;//记录缺页次数
int exist,space,position;
ﻩint curpage;//当前指令得页面号
ﻩfor(int i=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(int k=0;k<blocknum;k++)
ﻩﻩﻩﻩ{
for(int j=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);
}
void LRU() //最近最久未使用算法
{
int n=0;//记录缺页次数
ﻩint exist,space,position ;
ﻩint curpage;//当前指令得页面号
ﻩfor(int i=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(int j=0; j<blocknum; j++)
ﻩﻩ{//其余得accessed++
ﻩﻩblock[j]、accessed++;
}
ﻩ}
printf("缺页次数:%d\n”,n);
ﻩprintf("缺页率:%f%%\n",(n/320、0)*100);
}
void FIFO()
{
int n=0;//记录缺页次数
int exist,space,position ;
ﻩ int curpage;//当前指令得页面号
int blockpointer=-1;
for(int i=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);
}
void main()
{
ﻩint choice;
ﻩprintf("************请求分页存储管理模拟系统*************\n");
ﻩrandam();
printf("************此进程得页面调用序列如下**************\n”);
pagestring();
ﻩwhile(choice != 4)
{
ﻩﻩprintf("********1:OPT 2:LRU 3:FIFO 4:退出*********\n”);
ﻩprintf("请选择一种页面置换算法:”);
ﻩ scanf("%d",&choice);
ﻩ init();
ﻩswitch(choice)
ﻩ {
ﻩ case 1:
ﻩﻩﻩprintf(”最佳置换算法OPT:\n");
ﻩprintf("页面号 物理地址 页面号 物理地址 页面号 物理地址 页面号 物理地址\n");
ﻩﻩﻩOPT();
ﻩ break;
ﻩ case 2:
ﻩﻩ printf("最近最久未使用置换算法LRU:\n");
ﻩ printf("页面号 物理地址 页面号 物理地址 页面号 物理地址 页面号 物理地址\n");
ﻩ LRU();
ﻩﻩﻩbreak;
ﻩﻩcase 3:
ﻩ printf("先进先出置换算法FIFO:\n");
ﻩprintf("页面号 物理地址 页面号 物理地址 页面号 物理地址 页面号 物理地址\n");
FIFO();
ﻩﻩbreak;
ﻩ }
}
}
展开阅读全文