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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

实验四

请求分页存储管理模拟实验

一:实验目的

通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。

二:实验内容

假设每个页面可以存放10条指令,分配给进程的存储块数为4。

用C语言或Pascal语言模拟一进程的执行过程。设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。模拟运行时,如果所访问的指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。最后显示其物理地址,并转下一条指令。在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。

页面置换算法:分别采用OPT、FIFO、LRU三种算法。

进程中的指令访问次序按如下原则生成:

50%的指令是顺序执行的。

25%的指令是均匀分布在低地址部分。

25%的指令是均匀分布在高地址部分。

三:实验类别

分页存储管理四:实验类型模拟实验

五:主要仪器计算机

六:结果

OPT:

LRU:

FIFO:

七:程序

# include

# include

# include

# 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

{

block[i].pagenum=-1;

block[i].accessed=0;

m=0;

}

}

int pageExist(int curpage)//查找物理块中页面是否存在,寻找该页面curpage是否在内存块block中,若在,返回块号

{

for(int i=0; i

{

if(block[i].pagenum == curpage )

return i; //在内存块block中,返回块号

}

return -1;

}

int findSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号

{

for(int i=0;i

{

if(block[i].pagenum==-1)

return i; //找到了空闲的block,返回块号

}

return -1;

}

int findReplace()//查找应予置换的页面

{

int pos = 0;

for(int i=0;i

{

if(block[i].accessed > block[pos].accessed)

pos = i; //找到应该置换页面,返回BLOCK中位置

}

return pos;

}

void display()//显示物理块中的页面号

{

for(int i=0; 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() //最佳替换算法

相关文档
最新文档