操作系统页面置换算法.docx
《操作系统页面置换算法.docx》由会员分享,可在线阅读,更多相关《操作系统页面置换算法.docx(12页珍藏版)》请在冰豆网上搜索。
![操作系统页面置换算法.docx](https://file1.bdocx.com/fileroot1/2023-1/9/43c4fa20-6dba-43ae-a16b-4cf3f1db7615/43c4fa20-6dba-43ae-a16b-4cf3f1db76151.gif)
操作系统页面置换算法
操作系统上机测试页面置换算法
利用C语言或Pascal语言编写程序,完成虚拟存储管理的页面淘汰过程。
要求:
从键盘上输入允许进程占有的页架数及一个访问串,输出淘汰过程,并给出共发生的缺页次数。
例如:
从键盘上输入允许进程占有的页架数为:
3
从键盘上输入一个访问串为:
7012030423032120170
1.模拟“先进先出(FIFO)”算法,输出:
FIFO
7
0
1
2
0
3
0
4
2
3
0
3
2
1
2
0
1
7
0
7
0
1
2
2
3
0
4
2
3
0
0
0
1
2
2
2
7
0
7
0
1
1
2
3
0
4
2
3
3
3
0
1
1
1
2
7
7
0
0
1
2
3
0
4
2
2
2
3
0
0
0
1
2
7
0
1
2
3
0
4
2
3
0
1
共14次缺页
2.模拟“最近最少用(LRU)”算法
输出:
LRU
7
0
1
2
0
3
0
4
2
3
0
3
2
1
2
0
1
7
0
7
0
1
2
2
3
3
4
2
3
0
0
0
1
1
2
2
7
7
7
0
1
1
2
2
0
4
2
3
3
3
2
2
1
1
0
0
7
0
0
0
0
3
0
4
2
2
2
3
3
0
0
1
1
7
1
2
3
0
4
0
3
2
共12次缺页
3.模拟“最佳更换(OPT)”算法,
输出:
OPT
7
0
1
2
0
3
0
4
2
3
0
3
2
1
2
0
1
7
0
7
7
7
2
2
2
2
2
7
0
0
0
0
4
0
0
0
1
1
3
3
3
1
1
7
1
0
4
3
2
共9次缺页
注:
输入/输出的格式任意,只要能反映淘汰过程即可。
1、FIFO(先进先出)
源代码:
/*
从键盘上输入允许进程占有的页架数为:
3
从键盘上输入一个访问串为:
70120304230321201701
共15次缺页
*/
#include
usingnamespacestd;
intmain()
{
cout<<"请输入内存块数:
";
intmemoryNum;//内存块数
cin>>memoryNum;
//intmemoryNum=3;
int*memory=newint[memoryNum];//建内存
inti,j,k;//辅助遍历数组的变量
for(i=0;imemory[i]=-1;
//intpages[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
intpagesLength;
cout<<"请输入页面长度:
";
cin>>pagesLength;
int*pages;//记录页面
pages=newint[pagesLength];
cout<<"请输入页面走向:
";
for(i=0;icin>>pages[i];
cout<cout<<"下面采用先进先出页面置换方法,首列为页号,末列为从内存中替换出的页面:
"<cout<//cout<<"页面号\t内存块内存块内存块替换出的页面"<intcount=0;//计数缺页次数
intpointer=0;//指针指向要插入的位置
intreplacedPage;//被替换出来的页面
boolflag;//标志pointer是否移动位置
for(i=0;i{
cout<"<<"\t";
flag=false;
for(j=0;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{
if(memory[k]==-1)
cout<<""<<"\t";
else
cout<}
if(flag&&(replacedPage!
=-1))
cout<cout<}
cout<<"缺页次数:
"<return0;
}
2、LRU(最近最少使用)
/*
模拟"最近最少用(LRU)"算法
从键盘上输入允许进程占有的页架数为:
3
从键盘上输入一个访问串为:
70120304230321201701
共12次缺页
*/
#include
usingnamespacestd;
structPage
{
intnum;
inttime;//记录最近的访问次数
};
intMax(Page*p,intlen)//返回最老的一页的下标p为内存,len为内存大小
{
intk=0;//k记录最老页面的下标
inti=0;//i为遍历p的辅助变量
while(i{
if(p[i].time==-1)
{
returni;
}
i++;
}
Pagemax=p[0];
i=0;
while(i{
if(max.time
{
max=p[i];
k=i;
}
i++;
}
returnk;
}
intmain()
{
intmemoryLength=3;//内存大小
Page*memory=newPage[memoryLength];//内存
intpagesLength=20;//页面串长度
Page*pages=newPage[pagesLength];//页面串
//Pagereplaced=newPage({-1,-1});//被替换出来的页面
intreplaced;
intcount=0;//缺页数
inti,j,k,l,m;
for(i=0;i{
memory[i].num=-1;
memory[i].time=-1;
}
//cout<<"请输入页面走向:
"<inttemp[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
for(i=0;i{
//cin>>pages[i].num;
pages[i].num=temp[i];
pages[i].time=0;
}
cout<<"页面走向为:
"<for(i=0;icout<cout<cout<<"下面采用最近最少使用页面置换方法,首列为页号:
"<for(i=0;i{
cout<\t";
for(j=0;j{
if(pages[i].num==memory[j].num)//内存里有这一页
{
for(k=0;kmemory[k].time++;//首先令其他页面的时间记录加一次
memory[j].time=0;//刷新内存中这一页的时间记录,重新计时
break;
}
}
if(j==memoryLength)//内存中没有这一页
{
count++;//缺页次数加一次
l=Max(memory,memoryLength);//取出内存中最老一页的下标
//replaced=memory[k];//最老的一页就是要替换出来的页面
replaced=memory[l].num;
for(k=0;k{
if(memory[k].time!
=-1)
memory[k].time++;//首先令其他页面的时间记录加一次,同时保证本来空的内存仍保持time=-1
}
memory[l]=pages[i];//新页面存入
memory[l].time=0;//刷新内存中这一页的时间记录,重新计时
}
for(m=0;m{
if(memory[m].num==-1)
cout<<""<<"\t";
else
cout<}
cout<}
cout<<"缺页次数为:
"<return0;
}
3、OPT(最佳置换法)
#include
usingnamespacestd;
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;i{
for(intj=0;j{
if(elem[i]==c[j])
break;
}
if(j==count)//内存中不存在该页面
{
if(count==3)//如果已满
{
intmax[3]={20,20,20};//声明一个数组用来记录内存中的页面未来出现的的位置
for(intk=0;k{
for(inte=i+1;e<20;e++)
{
if(elem[e]==c[k])
break;
}
max[k]=e;
}
intmaxc=0;//找出内存页面中最靠后的一个页面
for(inth=1;h{
if(max[h]>max[maxc])
maxc=h;
}
c[maxc]=elem[i];//将目前页面存入内存中
lackcount++;//缺页次数增加一次
}
else//如果未满
{
c[count]=elem[i];
count++;//页数增加
lackcount++;
}
}
for(intk=0;k{
cout<}
cout<}
}
intshowlack()
{
returnlackcount;
}
};
intmain()
{
intelem[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
OPToo;
cout<<"最佳置换算法:
"<oo.run(elem,20);
cout<<"缺页次数为:
"<return0;
}