操作系统页面置换算法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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值