三种页面置换算法-(FIFO-LRU-OPT)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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<
{ c++;
cout<
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<
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<
{ 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;
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<
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<
{ 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<<"页面序列为:"<
cout<}
cout<
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. 退出"<
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<<"请输入页面序列:"<
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);
}
}
}