操作系统实验虚拟存储管理最佳置换先进先出最近最久未使用文档格式.docx
《操作系统实验虚拟存储管理最佳置换先进先出最近最久未使用文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验虚拟存储管理最佳置换先进先出最近最久未使用文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
2structPAGE_LIST
3{
4intid;
//块号
5intflag;
//自适应标志
6}page_list[MAX];
7intN=0;
//页面表大小
8intorder[MAX];
//调用串
9//调用长度
10intM=0;
//定义输出容
11intG[MAX][MAX];
//输出置换图
12intI,J;
//置换图扫描指针
13intLL[MAX];
//缺页序列
14intLI;
//缺页序列扫描指针
15intRL[MAX];
//置换序列
16//置换序列扫描指针
17intRI;
函数说明:
voidinit();
//初始化函数
voidprint();
//输出函数
voidOptimal();
//最正确置换算法
voidFIFO()//先进先出算法
voidLRU();
//最近最久未使用算法
流程图
先进先出置换算法:
代码:
*include<
stdio.h>
*defineMAX100
structPAGE_LIST
{
intid;
intflag;
}page_list[MAX];
intN=0;
intorder[MAX];
//调用长度
intM=0;
intG[MAX][MAX];
intI,J;
intLL[MAX];
intLI;
intRL[MAX];
//置换序列扫描指针
intRI;
voidinit()
inti;
I=0;
J=0;
LI=0;
RI=0;
for(i=0;
i<
100;
i++)
{
page_list[i].id=-1;
page_list[i].flag=999;
}
printf("
请输入页表的大小:
"
);
scanf("
%d"
&
N);
请输入调用长度:
M);
请输入调用串:
\n"
M;
scanf("
order[i]);
}
voiddisplay()
inti,j;
floatx;
置换图为:
N;
printf("
for(j=0;
j<
J;
j++)
printf("
==="
%3d"
G[i][j]);
\n缺页序列为:
LI;
LL[i]);
\n置换序列为:
RI;
RL[i]);
x=(float)J/(float)M;
x*=100;
\n缺页率为:
\n%3.2f%%\n"
x);
//判断页是否在页表
intIsExist(intx)
if(page_list[i].id==x)
{
return1;
}
return0;
//此算法中自适应标志代表后面序列中是否访问到了此位置
voidOptimal()
inti,j,k;
intcou;
init();
page_list[i].id=order[i];
G[I][J]=page_list[j].id;
I++;
I=0;
J++;
LL[LI]=order[i];
LI++;
for(;
if(!
IsExist(order[i]))
cou=0;
for(j=i+1;
{
if(cou==N-1)
break;
for(k=0;
k<
k++)
if(page_list[k].id==order[j]&
&
page_list[k].flag!
=0)
{
page_list[k].flag=0;
cou++;
}
}
if(page_list[j].flag!
{
page_list[j].id=order[i];
}
G[I][J]=page_list[j].id;
I++;
I=0;
J++;
LL[LI]=order[i];
LI++;
RL[RI]=order[i];
RI++;
page_list[j].flag=999;
//先进先出算法
//此算法中自适应标志不需要使用
voidFIFO()
intpos=0;
page_list[pos].id=order[i];
pos=(pos+1)%N;
G[I][J]=page_list[j].id;
if(i>
=N)
RL[RI]=order[i];
RI++;
//此算法中自适应标志为起未被使用的次数
voidLRU()
intpos,max;
pos=0;
max=0;
if(page_list[j].flag>
max)
pos=j;
max=page_list[j].flag;
page_list[pos].flag=0;
else
if(page_list[j].id==order[i])
page_list[j].flag=0;
continue;
page_list[j].flag++;
intmain()
intselect;
do
printf("
页面置换算法\n"
1.最正确置换算法〔Optimal〕\n2.先进先出算法〔FIFO〕\n"
3.最近最久未使用算法〔LRU〕\n4.退出程序\n"
请输入您想要执行的操作:
select);
switch(select)
case1:
Optimal();
display();
case2:
FIFO();
case3:
LRU();
case4:
default:
输入有误,请重新输入!
}while
(1);
结果截图
最正确置换算法
先进先出算法:
最近最久未使用算法:
【小结或讨论】
三种算法的主要区别是确定替换物理块的式不同:
1、对于先进先出置换算法,设置一个指针,循环从block的首元素指到block的尾元素,就是物理块置换顺序
2、对于LRU置换算法,遍历页表中的页号,根据这些页号最近被引用的顺序,找到最久未被引用的页号,即在输入序列中向前查找离当前页最远的页号,将其所在的物理块置换掉。
3、对于LRU置换算法,遍历输入序列中的页号,根据这些页号将来被引用的顺序,找到将来最长时间未被引用的页号,即在输入序列中向后查找离当前页最远的页号,将其所在的物理块置换掉。
4、通过本次实验,我对于虚拟存储中的分页管理有了更加深入的了解。
理解了最正确页面置换算法、先入先出页面置换算法以及最近最久未被使用页面置换算法的中心思想。
同时发现,最正确页面置换算法得到的缺页率最低,但其要求也更加格,必须要求知道未来调用的所有序列。
先进先出算法最为简单,但是缺页率最高。
最近最久未被访问算法居中。