资源简介
假设每个页面中可存放10条指令,分配给作业的内存块数为4。
用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。
作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分;
具体的实施方法是:
在[0,319]的指令地址之间随机选取一起点m;
顺序执行下一条指令,即执行地址序号为m+1的指令;
通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;
顺序执行下一条指令,其地址序号为m1+1的指令;
通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
顺序执行下一条指令,其地址序号为m2+1的指令;
重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
代码片段和文件信息
#include
#include
#define Bsize 4
typedef struct BLOCK //定义物理块结构体
{
int pageNum; //页号
int accessed_time; //访问字段,其值表示多久未被访问
} BLOCK;
int pc; //程序计数器,用来记录指令的序号
int n; //缺页计数器,用来记录缺页的次数
static int temp[320]; //用来存储320条随机数
BLOCK block[Bsize]; //定义一大小为4的物理块数组
void init(); //程序初始化函数
int findExist(int curpage); //查找物理块中是否有该页面
int findSpace(); //查找空闲物理块
int findReplace(); //查找应予置换的页面
void random(); //产生320条随机数显示并存储到temp[320]
void show_Q_Page(); //显示调用的页面队列
void OPT(); //OPT算法
void LRU(); //LRU算法
void FIFO(); //FIFO算法
void init()
{
//初始化内存物理块数组,缺页次数和程序计数器
for(int i = 0; i < Bsize; i++)
{
block[i].pageNum = -1;
block[i].accessed_time = 0;
pc = n = 0;
}
}
int findExist(int curpage)
{
//查找物理块中是否有curpage页面
for(int i = 0; i < Bsize; i++)
{
//若检测到内存中有该页面,返回在block中的位置
if(block[i].pageNum == curpage )
return i;
}
return -1; //若没有则返回-1.
}
int findSpace()
{
//查找是否有空闲物理块
for(int i = 0; i < Bsize; i++)
{
//若找到空闲的block,返回在block的位置
if(block[i].pageNum == -1)
return i;
}
return -1; //否则返回-1.
}
int findReplace()
{
//找到应予置换页面,即最近最久未使用的页面,返回其所在块的位置
int pos = 0;
for(int i = 0; i < Bsize; i++)
{
if(block[i].accessed_time > block[pos].accessed_time)
pos = i;
}
return pos;
}
void random()
{
//产生320条随机数显示并存储到temp[320]
int flag = 0;
scanf(“%d“ &pc); //在[0,319]的指令地址之间随机选取一起点m
printf(“ - - - - - - 产生的320条指令序列:- - - - -\n“);
for(int i = 0; i < 320; i++)
{
temp[i] = pc;
if(flag % 2 == 0) pc = ++pc % 320; //产生50%的顺序执行指令(flag=0或2时顺序执行)
if(flag == 1) pc = rand() % (pc - 1); //产生25%的均匀分布在前地址部分指令
if(flag == 3) pc = pc + 1 + (rand() % (320 - (pc + 1)));
//产生25%的均匀分布在后地址部分指令
flag = ++flag % 4;
printf(“ %03d“ temp[i]);
if((i + 1) % 15 == 0) printf(“\n“);
}
}
void show_Q_Page()
{
//显示随机数
for(int i = 0; i < 320; i++)
{
printf(“ %03d“ temp[i] / 10);
if((i + 1) % 15 == 0) printf(“\n“);
}
}
void OPT()
{
int exist space position ;
int curpage;
int f = 0;
printf(“访问页 物理地址\t缺页\t\t访问页 物理地址\t缺页“);
for(int i = 0; i < 320; i++)
{
f++;
if(f % 2 == 1)printf(“\n“);
if(i % 100 == 0) getchar();
pc = temp[i];
curpage = pc / 10;
printf(“%4d“ curpage);
exist = findExist(curpage);//查找内存中是否有当前页面
if(exist == -1) //若没有
{
space = findSpace(); //在内存中查找是否有空闲块
if(space != -1)
- 上一篇:c++教师排课程序
- 下一篇:C++串口类 RS232
评论
共有 条评论