页面置换算法C语言.docx
《页面置换算法C语言.docx》由会员分享,可在线阅读,更多相关《页面置换算法C语言.docx(9页珍藏版)》请在冰豆网上搜索。
![页面置换算法C语言.docx](https://file1.bdocx.com/fileroot1/2022-12/16/a9ac8bcb-998f-4a58-ade4-b33d89055c7c/a9ac8bcb-998f-4a58-ade4-b33d89055c7c1.gif)
页面置换算法C语言
《操作系统》实验报告
题目:
页面置换算法
班级:
网络工程
姓名:
朱锦涛
学号:
E31314037
一、实验目的
用代码实现页面置换算法,通过代码的具体实现,加深对两个页面置换算法:
先进先出页面置换算法和最近最久未使用算法的核心的理解。
二、实验原理
1.先进先出页面置换算法:
地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规则叫做页面置换算法。
最简单的页面置换算法是先入先出(FIFO)法。
2.最近最久未使用算法:
LRU算法的提出,是基于这样一个事实:
在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。
这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。
因此,我们只需要在每次调换时,找到最少使用的那个页面调出内存。
这就是LRU算法的全部内容。
三、实验内容
源程序:
#include
#include
#include
#include
#defineL20//页面走向长度最大为20
intM;//内存块
structPro//定义一个结构体
{
intnum,time;
};
voidprint(Pro*page1)//打印当前的页面
{
Pro*page=newPro[M];
page=page1;
for(inti=0;icout<cout<}
intSearch(inte,Pro*page1)//寻找内存块中与e相同的块号
{
Pro*page=newPro[M];
page=page1;
for(inti=0;iif(e==page[i].num)
returni;//返回i值
return-1;
}
intMax(Pro*page1)//寻找最近最长未使用的页面
{
Pro*page=newPro[M];
page=page1;
inte=page[0].time,i=0;
while(i{
if(ei++;
}
for(i=0;ireturn-1;
}
intCount(Pro*page1,inti,intt,Prop[L])//记录当前内存块中页面离下次使用间隔长度
{
Pro*page=newPro[M];
page=page1;
intcount=0;
for(intj=i;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));//随机数发生器
cout<<"输出随机数:
";
for(i=0;i<20;i++)//20个随机数
{
p[i].num=rand()%10+1;//产生1到10之间的随即数放到数组p中
p[i].time=0;
cout<
}
cout<cout<<"请输入可用内存页面数m(3~5):
";
do
{
cin>>M;
if(M>5||M<3)
cout<<"内存块m须在3~5之间,请重新输入m:
";
elsebreak;
}while
(1);
Pro*page=newPro[M];//动态结构体数组
do{
for(inti=0;i{
page[i].num=0;
page[i].time=20-1-i;
}
cout<<"1:
FIFO页面置换"<cout<<"2:
LRU页面置换"<cout<<"按其它键结束程序;"<cin>>c;
system("cls");//清屏
if(c==1)//FIFO页面置换
{
n=0;
cout<<"******************************************"<cout<cout<<"FIFO算法页面置换情况如下:
"<cout<cout<<"******************************************"<while(i<20)
{
if(Search(p[i].num,page)>=0)//当前页面在内存中
{
cout<
cout<<"不缺页"<i++;//i加1
}
else//当前页不在内存中
{
if(t==M)t=0;
else
{
n++;//缺页次数加1
page[t].num=p[i].num;//把当前页面放入内存中
cout<
print(page);//打印当前页面
t++;//下一个内存块
i++;//指向下一个页面
}
}
}
cout<<"缺页次数:
"<"<}
if(c==2)//LRU页面置换
{
n=0;
cout<<"******************************************"<cout<cout<<"LRU算法页面置换情况如下:
"<cout<cout<<"******************************************"<while(i<20)
{
inta;
t=Search(p[i].num,page);
if(t>=0)//如果已在内存块中
{
page[t].time=0;//把与它相同的内存块的时间置0
for(a=0;aif(a!
=t)page[a].time++;//其它的时间加1
cout<
cout<<"不缺页"<}
else//如果不在内存块中
{
n++;//缺页次数加1
t=Max(page);//返回最近最久未使用的块号赋值给t
page[t].num=p[i].num;//进行替换
page[t].time=0;//替换后时间置为0
cout<
print(page);
for(a=0;aif(a!
=t)
page[a].time++;//其它的时间加1
}
i++;
}
cout<<"缺页次数:
"<"<}
}while(c==1||c==2);
return0;
}
实验结果:
FIFO置换算法:
LRU置换算法:
四.实验小结
本次试验,使用顺序表来存储包括内存页面和页面号引用串,structPro{intnum,time;};其中num表示页面号,页面号引用串用随机数循环20次来初始化20个页面号,同时物理块号可由用户自己在3~5之间选择,初始化页面号全为0。
Time为该页面在内存的时间,这只在LRU算法有使用到。
第一个页面进入物理块时初始化为0,以后每有新页面过来询问时,不管有没有替换内存中的页面,都将其值加一。
当新页面进来时,若内存中有该页面号,则将该块号重新置为0,内存中其他页面的时间+1,若没有该页面号,则替换内存中页面时间最长的。
通过本次试验,我加深了对两个页面置换算法:
先进先出页面置换算法和最近最久未使用算法的核心的理解。