操作系统:用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#

 

转载于:https://www.cnblogs.com/RiverChen/p/10963122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值