整理页面置换算法OPT+FIFO+LRU+clock.docx
《整理页面置换算法OPT+FIFO+LRU+clock.docx》由会员分享,可在线阅读,更多相关《整理页面置换算法OPT+FIFO+LRU+clock.docx(12页珍藏版)》请在冰豆网上搜索。
整理页面置换算法OPT+FIFO+LRU+clock
页面置换算法OPT+FIFO+LRU+clock
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(页面置换算法OPT+FIFO+LRU+clock)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为页面置换算法OPT+FIFO+LRU+clock的全部内容。
#include
#include〈fstream〉
usingnamespacestd;
#defineBlockSize10
#definePageSize100
intpage[PageSize];//页面数组存放页面
intblock[BlockSize];//物理块数组
intresult[PageSize][BlockSize];//存放页面和物理块二维数组
intpSize=0;//用户使用页面数
intbSize=0;//用户使用物理块数
intblockFlag[BlockSize];//用于LRU与最佳置换算法中,辅助判断该换出的页面
intnoPageCount=0;//缺页次数
//输入数据
voidinputData()
{
cout〈〈endl〈〈"请输入物理块数(1<=bSize<=”<cin>>bSize;
cout<〈"请输入页面数(1〈=pSize<="〈cin〉〉pSize;
while(bSize<=0||bSize〉BlockSize||pSize<=0||pSize〉PageSize){//判断用户输入是否在范围内
cout<〈"输入范围错误,请重新输入:
”〈cout〈〈”请输入物理块数(1〈=F〈="〈cin>>bSize;
cout<cin>>pSize;
}
cout〈〈”请输入页面走向"〈for(inti=0;i〈pSize;i++)
cin〉>page[i];
}
//初始化page数组
voidinitPage()
{
for(inti=0;i〈PageSize;i++)
page[i]=-1;
}
//初始化block与result数组
voidinitBlockResult()
{
inti=0;
for(i=0;iblock[i]=-1;
for(i=0;i〈PageSize;i++)
for(intj=0;j〈BlockSize;j++)
result[i][j]=-1;
}
//查找物理块中是否存在要调用的页面
intExist(inti)
{
for(intj=0;j〈bSize;j++)
if(block[j]==i)
returnj;
return—1;
}
//显示结果
voiddisplay(intnoPageCount)
{
for(inti=0;i〈pSize;i++)
{
cout〈〈”"<for(intj=0;j〈bSize;j++)
{
if(result[i][j]==—1)break;
elsecout〈〈'[’〈}
cout〈〈endl;
}
cout〈〈"____________________________________"〈cout〈"<〈noPageCount<cout<<”缺页率:
”<<((double)noPageCount/pSize)*100<<’%’〈〈endl;
cout<<"===================================="<}
//最佳置换算法OPT
voidOPT()
{
inti=0,j=0;
intposition=0,noPageCount=0;
intpageFlag=0,resultFlag=0;//页面标记(下标)指向下一个页面,结果标记表示结果的行,即result数组的行标
for(i=0;i〈BlockSize;i++)
blockFlag[i]=0;
while(pageFlag{
if(Exist(page[pageFlag])!
=—1)//判断页面是否已经存在
resultFlag++;
else
{
if(position{//若有则将页面放入空闲块
block[position]=page[pageFlag];
position++;
noPageCount++;
for(i=0;i〈position;i++)
result[resultFlag][i]=block[i];
resultFlag++;
}
else{
for(i=0;i{
for(j=pageFlag+1;j{
if(block[i]==page[j])
{
blockFlag[i]=j;
break;
}
}
if(j==pSize)blockFlag[i]=999;
}
intoptPos=0,max=blockFlag[0];
for(inti=0;iif(max{
max=blockFlag[i];
optPos=i;
}
block[optPos]=page[pageFlag];
noPageCount++;
for(i=0;i〈bSize;i++)
result[resultFlag][i]=block[i];
resultFlag++;
}
}
pageFlag++;
}
cout〈〈endl<<"最佳置换算法:
"<〈endl;
display(noPageCount);
return;
}
//先进先出页面置换算法FIFO
voidFIFO()
{
intblockFlag=0,pageFlag=0,resultFlag=0;//物理块标记,确定该换出的物理块下标
inti=0,j=0,noPageCount=0;
intposition=0;//指示物理块,查找有无空闲
while(pageFlag〈pSize)
{
if(Exist(page[pageFlag])!
=-1)
resultFlag++;
else
{
if(position{
block[position]=page[pageFlag];
position++;
noPageCount++;
for(i=0;i<=position;i++)
result[resultFlag][i]=block[i];
resultFlag++;
}
else
{
block[blockFlag]=page[pageFlag];//blockFlag指示要换出的页面
noPageCount++;
for(i=0;i〈bSize;i++)
result[resultFlag][i]=block[i];
resultFlag++;
blockFlag++;
blockFlag=blockFlag%bSize;
}
}
pageFlag++;
}
cout〈〈endl〈<”先进先出页面置换算法FIFO:
”<〈endl;
display(noPageCount);
return;
}
//最近最久未用算法LRU
voidLRU()
{
inti=0,noPageCount=0;
intpageFlag=0,resultFlag=0,position=0;
for(i=0;i〈BlockSize;i++)//初始化时间记录数组
blockFlag[i]=0;
while(pageFlag{
if(Exist(page[pageFlag])!
=-1)
{//判断页面是否已经在主存中
resultFlag++;
blockFlag[Exist(page[pageFlag])]=0;//若在则将时间记录数组对应位置为0
}
else
{
if(position〈bSize)
{
block[position]=page[pageFlag];
blockFlag[position]=0;
position++;
noPageCount++;
for(i=0;i〈=position;i++)
result[resultFlag][i]=block[i];
resultFlag++;
}
else
{
intlast=0,min=blockFlag[0];
for(inti=0;i〈bSize;i++)
if(min{
min=blockFlag[i];
last=i;
}
block[last]=page[pageFlag];//置换最久未用页面
blockFlag[last]=0;
noPageCount++;
for(i=0;iresult[resultFlag][i]=block[i];
resultFlag++;
}
}
for(i=0;iblockFlag[i]++;
pageFlag++;
}
cout<〈endl<<"最近最久未用算法LRU:
”<〈endl;
display(noPageCount);
return;
}
//时钟(clock)置换算法
voidclock()
{
inti=0,position=0,noPageCount=0;
boolboolBlockFlag[BlockSize];
intflag=0;//访问位循环标记
intpageFlag=0,resultFlag=0;
while(pageFlag{
if(Exist(page[pageFlag])!
=-1)
{
resultFlag++;
boolBlockFlag[Exist(page[pageFlag])]=true;
}
else
{
if(position{
block[position]=page[pageFlag];
noPageCount++;
boolBlockFlag[position]=true;
position++;
for(i=0;i〈position;i++)
result[resultFlag][i]=block[i];
resultFlag++;
}
else
{
while(true)
{//无限循环,找出访问位为false的页面
if(boolBlockFlag[flag]==false)break;
boolBlockFlag[flag]=false;//若为true,置为false
flag++;
flag=flag%bSize;
}
block[flag]=page[pageFlag];
boolBlockFlag[flag]=true;
flag++;
flag=flag%bSize;
noPageCount++;
for(i=0;iresult[resultFlag][i]=block[i];
resultFlag++;
}
}
pageFlag++;
}
cout<”〈display(noPageCount);
return;
}
intmain()
{
initPage();
intfunc;
while(func!
=5)
{
cout〈<”请选择所需要的功能:
”<cout<〈"0。
输入数据”〈cout〈<"1。
最佳(optimal)置换算法"〈cout<〈"2。
先进先出(FIFO)置换算法"<cout<<”3.最近最久未用(LRU)置换算法"〈cout<<"4。
时钟(clock)置换算法"<〈endl;
cout〈〈”5.退出”<〈endl;
switch(func)
{
case0:
inputData();
break;
case1:
initBlockResult();
OPT();
break;
case2:
initBlockResult();
FIFO();
break;
case3:
initBlockResult();
LRU();
break;
case4:
initBlockResult();
clock();
break;
case5:
break;
}
cout〈〈"请选择功能:
";
cin>〉func;
system("cls”);
}
return0;
}