操作系統:用c++實現FIFO(先進先出)和LRU(最近最久未使用)頁面置換


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

隨后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#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM