页面置换算法C语言Word下载.docx
《页面置换算法C语言Word下载.docx》由会员分享,可在线阅读,更多相关《页面置换算法C语言Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
LRU算法的提出,是基于这样一个事实:
在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。
这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。
因此,我们只需要在每次调换时,找到最少使用的那个页面调出内存。
这就是LRU算法的全部内容。
三、实验内容
源程序:
#include<
iostream.h>
#include<
stdlib.h>
time.h>
stdio.h>
#defineL20//页面走向长度最大为20
intM;
//内存块
structPro//定义一个结构体
{
intnum,time;
};
voidprint(Pro*page1)//打印当前的页面
Pro*page=newPro[M];
page=page1;
for(inti=0;
i<
M;
i++)
cout<
<
page[i].num<
"
"
;
endl;
}
intSearch(inte,Pro*page1)//寻找内存块中与e相同的块号
i++)//遍历内存
if(e==page[i].num)
returni;
//返回i值
return-1;
intMax(Pro*page1)//寻找最近最长未使用的页面
inte=page[0].time,i=0;
while(i<
M)//找出离现在时间最长的页面
{
if(e<
page[i].time)e=page[i].time;
i++;
}
for(i=0;
i++)if(e==page[i].time)returni;
//找到离现在时间最长的页面返回其块号
intCount(Pro*page1,inti,intt,Prop[L])//记录当前内存块中页面离下次使用间隔长度
intcount=0;
for(intj=i;
j<
L;
j++)
if(page[t].num==p[j].num)break;
//当前页面再次被访问时循环结束
elsecount++;
//否则count+1
returncount;
//返回count的值
intmain()
{
intc,i;
intt=0;
floatn=0;
Prop[L];
//20个结构体
srand(time(NULL));
//随机数发生器
输出随机数:
for(i=0;
20;
i++)//20个随机数
p[i].num=rand()%10+1;
//产生1到10之间的随即数放到数组p中
p[i].time=0;
cout<
p[i].num<
请输入可用内存页面数m(3~5):
do
{
cin>
>
if(M>
5||M<
3)
内存块m须在3~5之间,请重新输入m:
elsebreak;
}while
(1);
//动态结构体数组
do{
i++)//初试化页面基本情况
page[i].num=0;
page[i].time=20-1-i;
1:
FIFO页面置换"
2:
LRU页面置换"
按其它键结束程序;
cin>
c;
system("
cls"
);
//清屏
if(c==1)//FIFO页面置换
n=0;
******************************************"
cout<
FIFO算法页面置换情况如下:
20)
if(Search(p[i].num,page)>
=0)//当前页面在内存中
{
cout<
//输出当前页p[i].num
不缺页"
i++;
//i加1
}
else//当前页不在内存中
if(t==M)t=0;
else
n++;
//缺页次数加1
page[t].num=p[i].num;
//把当前页面放入内存中
cout<
print(page);
//打印当前页面
t++;
//下一个内存块
i++;
//指向下一个页面
缺页次数:
n<
缺页率:
n/20<
if(c==2)//LRU页面置换
{
LRU算法页面置换情况如下:
while(i<
20)
{
inta;
t=Search(p[i].num,page);
if(t>
=0)//如果已在内存块中
{
page[t].time=0;
//把与它相同的内存块的时间置0
for(a=0;
a<
a++)
if(a!
=t)page[a].time++;
//其它的时间加1
else//如果不在内存块中
n++;
t=Max(page);
//返回最近最久未使用的块号赋值给t
page[t].num=p[i].num;
//进行替换
//替换后时间置为0
print(page);
=t)
page[a].time++;
//其它的时间加1
}
i++;
}
}while(c==1||c==2);
return0;
}
实验结果:
FIFO置换算法:
LRU置换算法:
四.实验小结
本次试验,使用顺序表来存储包括内存页面和页面号引用串,structPro{intnum,time;
其中num表示页面号,页面号引用串用随机数循环20次来初始化20个页面号,同时物理块号可由用户自己在3~5之间选择,初始化页面号全为0。
Time为该页面在内存的时间,这只在LRU算法有使用到。
第一个页面进入物理块时初始化为0,以后每有新页面过来询问时,不管有没有替换内存中的页面,都将其值加一。
当新页面进来时,若内存中有该页面号,则将该块号重新置为0,内存中其他页面的时间+1,若没有该页面号,则替换内存中页面时间最长的。
通过本次试验,我加深了对两个页面置换算法: