关于下列算法:首先类似于书本中先将各物理块中初始化为空,这里空物理块用#代替,因为在物理块数的限度内,所有的页面都可以进入内存,所以一开始不需要使用算法,直接全部投入。
随后FIFO中:直接定义一个y值,每放入一个页面,y++,并且mod(物理块总数),这里的y类似于一个循环指针。
在LRU中:也定义一个y值,但是y不再是循环指针,而是每检测一个页面时,当出现缺页状态,便先算出最近最久未使用的页面是哪个物理块,然后将物理块的下标赋给y值,最后将下标所在的物理块里的页面置换出来。
#include<iostream>
#include<string>
using namespace std;
void FIFO(int b,string a);
void LRU(int b,string a);
int main()
{
string a;
int b;
cout<<"请输入物理块数:";
cin>>b;
cout<<"请输入页面号引用串:";
cin>>a;
cout<<"采用FIFO页面置换算法的置换过程如下表:"<<endl;
FIFO(b,a);
cout<<"*********************************************"<<endl;
cout<<"采用LRU页面置换算法的置换过程如下表:"<<endl;
LRU(b,a);
return 0;
}
void FIFO(int b,string a)
{
char m[10]={'#','#','#','#','#','#','#','#','#','#'};//将物理块数内容初始化
int i=0,j,x,y=0,count1=0;//y为置换标记,count1为缺页标记
do{
if(i<b)
{
m[y]=a[i];//缺页后将页面写入
i++;
count1++;//缺页标记++
y=(y+1)%b;//置换标记++
cout<<a[i-1]<<" ";
for(j=0;j<b;j++)//打印
cout<<m[j];
cout<<endl;
continue;
}
for(j=0;j<b;j++)//判断是否缺页
{
if(a[i]==m[j])//未缺页则将x赋值1
{
x=1;
break;
}
}
if(x==1)//未缺页处理
{
i++;
x=0;
cout<<a[i-1]<<" "<<endl;
continue;
}
else//缺页处理
{
m[y]=a[i];
i++;
y=(y+1)%b;
cout<<a[i-1]<<" ";
for(j=0;j<b;j++)//打印
cout<<m[j];
cout<<endl;
count1++;
}
}while(a[i]!='#');
cout<<"页面缺页次数"<<" "<<"页面置换次数"<<endl;
cout<<" "<<count1<<" "<<count1-b<<endl;;
/*打印置换次数和缺页次数*/
}
void LRU(int b,string a)
{
char m[10]={'#','#','#','#','#','#','#','#','#','#'};
int i=0,j,x,y=0,count1=0,min=10000;//min为最久未使用的初始值
cout<<"置换过程如下表"<<endl;
do{
if(i<b)
{
m[y]=a[i];//缺页后将页面写入
i++;
count1++;//缺页标记++
y=y+1;//置换标记++
cout<<a[i-1]<<" ";
for(j=0;j<b;j++)//打印
cout<<m[j];
cout<<endl;
continue;
}
for(j=0;j<b;j++)//判断是否缺页
{
if(a[i]==m[j])
{
x=1;
break;
}
}
if(x==1)//未缺页才处理
{
i++;
x=0;
cout<<a[i-1]<<" "<<endl;
continue;
}
else//缺页处理
{
for(j=0;j<b;j++)//查找最久未使用的页面
{
for(int t=i-1;t>=0;t--)
{
if(m[j]==a[t])
break;
}
if(t<min)
{
min=t;
y=j;
}
}
m[y]=a[i];//置换最久未使用的页面
min=10000;//将min初始化
i++;
cout<<a[i-1]<<" ";
for(j=0;j<b;j++)//打印
cout<<m[j];
cout<<endl;
count1++;
}
}while(a[i]!='#');
cout<<"页面缺页次数"<<" "<<"页面置换次数"<<endl;
cout<<" "<<count1<<" "<<count1-b<<endl;
/*打印页面缺页次数和页面置换次数*/
}
//测试数据70120304230321201701#