操作系统实验4请求分页存储管理模拟实验.docx

上传人:b****6 文档编号:7010678 上传时间:2023-01-16 格式:DOCX 页数:13 大小:372.25KB
下载 相关 举报
操作系统实验4请求分页存储管理模拟实验.docx_第1页
第1页 / 共13页
操作系统实验4请求分页存储管理模拟实验.docx_第2页
第2页 / 共13页
操作系统实验4请求分页存储管理模拟实验.docx_第3页
第3页 / 共13页
操作系统实验4请求分页存储管理模拟实验.docx_第4页
第4页 / 共13页
操作系统实验4请求分页存储管理模拟实验.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

操作系统实验4请求分页存储管理模拟实验.docx

《操作系统实验4请求分页存储管理模拟实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验4请求分页存储管理模拟实验.docx(13页珍藏版)》请在冰豆网上搜索。

操作系统实验4请求分页存储管理模拟实验.docx

操作系统实验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;

}

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1