操作系统页面置换算法文档格式.docx
《操作系统页面置换算法文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统页面置换算法文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
1、FIFO(先进先出)
源代码:
/*
70120304230321201701
共15次缺页
*/
#include<
iostream>
usingnamespacestd;
intmain()
{
cout<
<
"
请输入内存块数:
;
intmemoryNum;
//内存块数
cin>
>
memoryNum;
//intmemoryNum=3;
int*memory=newint[memoryNum];
//建内存
inti,j,k;
//辅助遍历数组的变量
for(i=0;
i<
i++)
memory[i]=-1;
//intpages[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
intpagesLength;
请输入页面长度:
pagesLength;
int*pages;
//记录页面
pages=newint[pagesLength];
请输入页面走向:
cin>
pages[i];
endl;
下面采用先进先出页面置换方法,首列为页号,末列为从内存中替换出的页面:
//cout<
页面号\t内存块内存块内存块替换出的页面"
intcount=0;
//计数缺页次数
intpointer=0;
//指针指向要插入的位置
intreplacedPage;
//被替换出来的页面
boolflag;
//标志pointer是否移动位置
{
cout<
pages[i]<
:
\t"
flag=false;
for(j=0;
j<
j++)//比较内存块中现有的页面与要进入的页面是否一样
{
if(memory[j]==pages[i])
{
//flag=true;
break;
}
}
if(j==memoryNum)//当前内存块没有这一页
replacedPage=memory[pointer];
memory[pointer]=pages[i];
pointer++;
//pointer后移
flag=true;
if(pointer%memoryNum==0)
pointer=0;
count++;
//缺页,count加一次
for(k=0;
k<
k++)
if(memory[k]==-1)
cout<
"
else
memory[k]<
if(flag&
&
(replacedPage!
=-1))
cout<
replacedPage;
}
缺页次数:
count<
return0;
}
2、LRU(最近最少使用)
模拟"
最近最少用(LRU)"
算法
structPage
intnum;
inttime;
//记录最近的访问次数
};
intMax(Page*p,intlen)//返回最老的一页的下标p为内存,len为内存大小
{
intk=0;
//k记录最老页面的下标
inti=0;
//i为遍历p的辅助变量
while(i<
len)
if(p[i].time==-1)
returni;
i++;
Pagemax=p[0];
i=0;
if(max.time<
p[i].time)
max=p[i];
k=i;
returnk;
intmemoryLength=3;
//内存大小
Page*memory=newPage[memoryLength];
//内存
intpagesLength=20;
//页面串长度
Page*pages=newPage[pagesLength];
//页面串
//Pagereplaced=newPage({-1,-1});
intreplaced;
//缺页数
inti,j,k,l,m;
memoryLength;
i++)//初始化内存为空
memory[i].num=-1;
memory[i].time=-1;
inttemp[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
i++)//初始化页面串
//cin>
pages[i].num;
pages[i].num=temp[i];
pages[i].time=0;
页面走向为:
pages[i].num<
下面采用最近最少使用页面置换方法,首列为页号:
:
j++)
if(pages[i].num==memory[j].num)//内存里有这一页
for(k=0;
memory[k].time++;
//首先令其他页面的时间记录加一次
memory[j].time=0;
//刷新内存中这一页的时间记录,重新计时
if(j==memoryLength)//内存中没有这一页
//缺页次数加一次
l=Max(memory,memoryLength);
//取出内存中最老一页的下标
//replaced=memory[k];
//最老的一页就是要替换出来的页面
replaced=memory[l].num;
for(k=0;
if(memory[k].time!
=-1)
//首先令其他页面的时间记录加一次,同时保证本来空的内存仍保持time=-1
memory[l]=pages[i];
//新页面存入
memory[l].time=0;
for(m=0;
m<
m++)
if(memory[m].num==-1)
memory[m].num<
缺页次数为:
3、OPT(最佳置换法)
classOPT
private:
intc[3];
intlackcount;
intcount;
public:
OPT()
lackcount=0;
count=0;
c[0]=c[1]=c[2]=-1;
voidrun(intelem[],intn)
for(inti=0;
n;
for(intj=0;
count;
if(elem[i]==c[j])
break;
if(j==count)//内存中不存在该页面
if(count==3)//如果已满
{
intmax[3]={20,20,20};
//声明一个数组用来记录内存中的页面未来出现的的位置
for(intk=0;
{
for(inte=i+1;
e<
20;
e++)
{
if(elem[e]==c[k])
break;
}
max[k]=e;
}
intmaxc=0;
//找出内存页面中最靠后的一个页面
for(inth=1;
h<
h++)
if(max[h]>
max[maxc])
maxc=h;
c[maxc]=elem[i];
//将目前页面存入内存中
lackcount++;
//缺页次数增加一次
}
else//如果未满
c[count]=elem[i];
count++;
//页数增加
for(intk=0;
c[k]<
intshowlack()
returnlackcount;
intelem[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
OPToo;
最佳置换算法:
oo.run(elem,20);
oo.showlack()<