1. 程式人生 > >作業系統頁面置換演算法LRU_FIFO

作業系統頁面置換演算法LRU_FIFO

#include "iostream.h"
#include "stdlib.h"
#define MN  3  //記憶體塊數量(可變化)
#define KK  10//time-j*KK的比例係數 0:LRU 10:FIFO 1:平均
//#define TT  MN-1//NUR滿足的要求

struct Memory{
 int number;
 int time;
 int fifo;
}Mem1[MN],Mem2[MN],Mem3[MN];

//int Test[20]={1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6};
int Test[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
//int Test[20]={1,2,3,4,3,1,5,3,7,1,2,3,7,6,3,2,6,2,3,8};

int i=0,j=0,k=0,location=0,temp=0,lost1=0,lost2=0,lost3=0,TIME12=0,FIFO12=0;
bool result=0;

/***************************"LRU"置換演算法******************************/
int LRU(void)
{   
 for(i=0;i++;i<MN)//所有記憶體塊初始化
 {
  Mem1[i].number=0;
  Mem1[i].time=0;
 }
 for(i=0;i<20;i++)
  {
   result=0;
   for(j=0;j<MN;j++)//檢視所有記憶體塊中是否已包含要訪問的頁面
   {
             if(Mem1[j].number==Test[i])
    {
                 result=1;
     location=j;
     break;
    } 
   }
   if(result)//MN個記憶體塊中某塊已經包含了此頁,使此頁計數清零
   {
    for(j=0;j<MN;j++)
    {
     if(j==location)
      Mem1[j].time=0;
     else
      Mem1[j].time++;
    }
   }
   else//找到最近最久未使用的頁面所在的位置,並替換為新的頁面
   {  
    for(j=0;j<MN;j++)//檢視是否有記憶體塊未分配頁面(起始階段)
    {
     if(Mem1[j].number==0)
      break;
    }
    if(j<MN)//如果有記憶體塊未分配頁面,把頁面放入最低記憶體塊
    {
     Mem1[j].number=Test[i];
        Mem1[j].time=0;
     for(k=0;k<j;k++)
      Mem1[k].time++;
    }
    else//找出計數量最大的頁面所在的記憶體塊
    {
     temp=0;
     for(j=1;j<MN;j++)
     {
      if(Mem1[j].time>Mem1[temp].time)
       temp=j;            
     }
     Mem1[temp].number=Test[i];//替換掉計數量最大的記憶體塊,並清零
     Mem1[temp].time=0;

                 for(k=0;k<MN;k++)//使其餘記憶體塊中頁面計數各自+1
      if(k!=temp)
       Mem1[k].time++;     
    }
    lost1++;//缺頁數加1
   }  
  }
  return lost1;//返回缺頁總頁面數
}

int FIFO(void)
{   
 for(i=0;i++;i<MN)//所有記憶體塊初始化
 {
  Mem2[i].number=0;
  Mem2[i].fifo=0;
 }
 for(i=0;i<20;i++)
  {
   result=0;
   for(j=0;j<MN;j++)//檢視所有記憶體塊中是否已包含要訪問的頁面
   {
             if(Mem2[j].number==Test[i])
    {
                 result=1;
     break;
    } 
   }
   if(!result)//MN個記憶體塊中都未包含此頁  
   {  
    for(j=0;j<MN;j++)//檢視是否有記憶體塊未分配頁面(起始階段)
    {
     if(Mem2[j].number==0)
      break;
    }
    if(j<MN)//如果有記憶體塊未分配頁面,把頁面放入最低記憶體塊
    {
     Mem2[j].number=Test[i];
        Mem2[j].fifo=i;
    }
    else//找出最先進的頁面所在的記憶體塊並替換
    {
     temp=0;
     for(j=1;j<MN;j++)
     {
      if(Mem2[j].fifo<Mem2[temp].fifo)
       temp=j;            
     }
     Mem2[temp].number=Test[i];//替換掉計數量最大的記憶體塊,並清零
     Mem2[temp].fifo=i;     
    }
    lost2++;//缺頁數加1
   }  
  }
  return lost2;//返回缺頁總頁面數
}

/***************************"LRU-NUR-FIFO"置換演算法******************************/
int SPRING(void)
{   
 for(i=0;i<MN;i++)//所有記憶體塊初始化
 {
  Mem3[i].number=0;
  Mem3[i].time=0;
  Mem3[i].fifo=0;
 }
 for(i=0;i<20;i++)
  {
   result=0;
   for(j=0;j<MN;j++)//檢視所有記憶體塊中是否已包含要訪問的頁面
   {
             if(Mem3[j].number==Test[i])
    {
                 result=1;
     location=j;
     break;
    } 
   }
   if(result)//MN個記憶體塊中某塊已經包含了此頁,使此頁計數清零
   {
    for(j=0;j<MN;j++)
    {
     if(j==location)
      Mem3[j].time=0;
     else
      Mem3[j].time++;
    }
   }
   else//找到我的最優演算法使用的頁面所在的位置,並替換為新的頁面
   {  
    for(j=0;j<MN;j++)//檢視是否有記憶體塊未分配頁面(起始階段)
    {
     if(Mem3[j].number==0)
      break;
    }
    if(j<MN)//如果有記憶體塊未分配頁面,把頁面放入最低記憶體塊
    {
     Mem3[j].number=Test[i];
        Mem3[j].time=0;
     Mem3[j].fifo=i;

     for(k=0;k<j;k++)
      Mem3[k].time++;
    }
    else//找出綜合LRU-NUR-FIFO最優的頁面所在的記憶體塊
    {
     temp=0;
     for(j=1;j<MN;j++)//找出滿足NUR並且最先進入的滿足FIFO最優解
     {     
       TIME12=Mem3[j].time-Mem3[temp].time;
       FIFO12=Mem3[j].fifo-Mem3[temp].fifo;
       if((TIME12-FIFO12*KK)>=0)
       temp=j;
     }
     Mem3[temp].number=Test[i];
     Mem3[temp].fifo=i;
     /*FIFO*/


                 for(k=0;k<MN;k++)//檢視所有記憶體塊中是否已包含要訪問的頁面
      if(k!=temp)
       Mem3[k].time++;     
    }
    lost3++;
   }  
  }
  return lost3;
}

 
void main()
{
 int LRUOUT,FIFOOUT,NURFIFO; 

// LRUOUT=LRU();
 FIFOOUT=FIFO();
// NURFIFO=SPRING(); 

 cout<<endl<<endl<<endl<<endl<<endl;
 cout<<"           LRU-NUR-FIFO 綜合 NUR與 FIFO 兩個頁面置換演算法,取最優解。"<<endl<<endl;
 cout<<"           既滿足類似 LUR 的 NUR,又考慮到FIFO,兩方面相綜合、協調。"<<endl;
 cout<<                                  endl<<endl<<endl<<endl;
 cout<<"                        當前需要置換的頁面數目為  "<<20<<endl<<endl;
 cout<<"                        您目前配置的記憶體塊數目為  "<<MN<<endl<<endl;
 cout<<"                        LRU   演算法得到的缺頁數為  "<<LRUOUT<<endl<<endl;
 cout<<"                        FIFO  演算法得到的缺頁數為  "<<FIFOOUT<<endl<<endl;
 cout<<"                        SPRING演算法得到的缺頁數為  "<<NURFIFO<<endl<<endl; 
 cin.get();
}