三种页面置换算法-(FIFO-LRU-OPT)

#include
#include
using namespace std;

#define M 9
#define N 20

typedef struct node1/*页面的数据结构*/
{
int num;
int age;
int state;
int blocknum;
}page ;


typedef struct node2/*内存块的数据结构 */
{
int num;
int state;
int pagenum;
int age;
}Block;



void FIFO(Block b[],int n,page p[],int m)/*先进先出页面置换算法*/
{
int i,j,k,mm,mn,flag=0;
int maxage=-1,c=0;
for (j=0;j{
for (mm=0;mm{
if(b[mm].pagenum==p[j].num)
flag=1;
}
if(flag==1) cout<else if (flag==0)
{ c++;
cout<for(i=0;i{
if(b[i].state==0)
{
p[j].blocknum=b[i].num;
p[j].state=1;
b[i].pagenum=p[j].num;
b[i].state=1;
b[i].age=p[j].age;
break;
}
}
if(i>=n)
{
for(k=0;k{
if(maxage{
maxage=b[k].age;
mn=k;
}
}
for (mm=j-1;mm>=0;mm--)
{
if (p[mm].num==b[mn].pagenum)
{
k=mn;
break;
}
}
b[mn].pagenum=p[j].num;
b[mn].age=0;
p[j].blocknum=b[mn].num;
p[j].state=1;
p[k].state=0;
p[k].blocknum=-1;
}
}
for(mm=0;mm{
if(b[mm].pagenum!=-1)
b[mm].age++;
}
cout<<"页面调序列为:";
for (mm=0;mm{
cout<}
cout<flag=0;
maxage=-1;
}
cout<<"缺页总次数:"<}
void LRU(Block b[],int n,page p[],int m)/*最近最少使用页面置换算法 */
{
int i,j,j1,k,mm,mn,flag=0;
int num=0,c=0;
for (j=0;j{
for (mm=0;mm{
if(b[mm].pagenum==p[j].num)
flag=1;
}
if(flag==1) cout<else if (flag==0)
{ c++;
cout<if (p[j].state==0)
{
for(i=0;i{
if(b[i].state==0)
{
p[j].blocknum=b[i].num;
p[j].state=1;
b[i].pagenum=p[j].num;
b[i].state=1;
break;
}

}
if(i>=n)
{
for (mn=j-1;mn>=0;mn--)
{

if(num{
num++;
for (j1=mn+1;j1<=j-1;j1++)
{
if(p[mn].num==p[j1].num)
{
num--;
}
}
}
if (num==n)
{
break;
}

}

for (mm=0;mm{
if (p[mn].num==b[mm].pagenum)
{
k=mm;
break;
}
}
b[k].pagenum=p[j].num;
b[k].age=0;
p[j].blocknum=b[mm].num;
p[j].state=1;
}
}
}
cout<<"页面调序列为:";
for (mm=0;mm{
cout<}
cout<flag=0;
num=0;
}
cout<<"缺

页总次数:"<}

void OPT(Block b[],int n,page p[],int m)/*最优页面置换算法 */
{
int i,j,k,mm,mn,flag=0;
int maxage=-1,c=0;
for (j=0;j{
for (mm=0;mm{
if(b[mm].pagenum==p[j].num)
flag=1;
}
if(flag==1) cout<else if (flag==0)
{ c++;
cout<
if (p[j].state==0)
{
for(i=0;i{
if(b[i].state==0)
{
p[j].blocknum=b[i].num;
p[j].state=1;
b[i].pagenum=p[j].num;
b[i].state=1;
break;
}

}
if(i>=n)
{
for (mm=0;mm{
for (mn=j+1;mn{
if (b[mm].pagenum==p[mn].num)
{
b[mm].age=mn;
break;
}
}
if(mn>=m)
{
b[mm].age=100;
}
}
for(k=0;k{
if(maxage{
maxage=b[k].age;
mm=k;
}

}
b[mm].pagenum=p[j].num;
b[mm].age=0;
p[j].blocknum=b[mm].num;
p[j].state=1;
}
}
}
cout<<"页面序列为:"<for (mm=0;mm{
cout<}
cout<flag=0;
maxage=-1;
}
cout<<"缺页总次数:"<}

int display(Block b[],int m,page pag[], int n)
{

int chose;
for(int i=0;i{
pag[i].age=0;
pag[i].state=0;
pag[i].blocknum=-1;
}
for(i=0;i{
b[i].num=i;
b[i].state=0;
b[i].pagenum=-1;
b[i].age=0;
}
cout<<"1. FIFO替换算法\n"<<"2. LRU替换算法\n"<<"3. OPT替换算法\n"<<"0. 退出"<cout<<"请输入您的选择:";
cin>>chose;
return (chose);
}
void main()
{
Block b[M];
page pag[N];
int chose;
int m,n;
cout<<"请输入内存块个数(<=5):";
cin>>m;
cout<<"请输入页面个数(<15):";
cin>>n;
cout<<"请输入页面序列:"<for(int i=0;i{
cin>>pag[i].num;
}
while(1){
chose=display(b,m,pag,n);
if(chose==1)
{
FIFO(b,m,pag,n);
cout<}
else if(chose==2)
{
LRU(b,m,pag,n);
cout<}
else if(chose==3)
{
OPT(b,m,pag,n);
cout<}
else if(chose==0)
{
exit(0);
}
}
}

相关文档
最新文档