關於下列算法:首先類似於書本中先將各物理塊中初始化為空,這里空物理塊用#代替,因為在物理塊數的限度內,所有的頁面都可以進入內存,所以一開始不需要使用算法,直接全部投入。
隨后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#