页面置换算法-FIFO——设置页框的大小为n个物理块,在输入一个内存块需求序列:如3 2 1 3 2 5 2 3 6 2 1 4 2之后,屏显每次页面调度结果,并屏显置换率。(队列实现版)

#include<iostream>
using namespace std;
class QNode{  //链队结点的类
        int  data;
        QNode *next;
public:
         QNode(int item=100)
   {
            data= item;
            next=NULL;
         }
       friend class LinkQueue;
    }; // QNode
class LinkQueue
{
      QNode *front, *rear;
public:
       LinkQueue()
    {
     rear =front=new QNode();
    }
       void Enter (int item );
       int Leave();    
       int Front();    
       void Clear ()
    {
     front->next = rear->next = NULL;
    }
       bool IsEmpty ()
    {
     return front->next==NULL;
    } 
}; // LinkQueue 
void LinkQueue::Enter ( int item )
{
         rear->next = new QNode ( item);
         rear=rear->next;
}//Enter
int LinkQueue::Leave( )
{
 QNode *p;
        if (!IsEmpty ( ) )
  {//判队不空
           p = front->next;  
           int retvalue = p->data; //保存队头的值
           front->next = p->next;  
           delete p;
           if ( front->next==NULL )  //删除队列中唯一结点后,重新设置rear
                  rear=front;
           return retvalue; 
        }
        else
  {
             cout<<" 队列空!"<<endl;
    return 100;
        }
    }//Leave
int LinkQueue::Front( )
{
        if ( !IsEmpty ( ) )   
            return front->next->data; 
        else
  {
            cout<<"队列空,无队头元素!"<<endl;
            return 100;
        }
}//Front

int main()
{
 LinkQueue A;
 int n;
 int length,length1;
 int c;
 int count=0,count_n=0;
 cout<<"请输入页框大小"<<endl;
 cin>>n;
 cout<<"请输入内存需求序列的长度"<<endl;
 cin>>length;
 length1=length;
 if(n>length1||n==length1)
 {
  cout<<"此时进程数小于页框的大小,不用进行任何的置换"<<endl;
  while(length1)
  {
   length1--;
   cout<<"请输入内存请求块"<<endl;
   cin>>c;
   A.Enter(c);
  }
  length1=length;
  cout<<"页框内的进程是"<<endl;
  while(length1)
  {
   length1--;
   cout<<A.Leave()<<endl;
  }
  cout<<"页面置换率为0"<<endl;
 }
 else
 {
  cout<<"此时进程数大于页框"<<endl;
      while(length1)
  {
   length1--;
   if(count_n<n)//页框是否已满
   {
    cout<<"此时页框还没满,可以进行页框"<<endl;
    cout<<"请输入内存请求块"<<endl;
          cin>>c;
          A.Enter(c);
    count_n++;
   }
   else
   {
    cout<<"此时页框已经满了,需要进行页面置换"<<endl;
    cout<<"请输入内存请求块"<<endl;
    cin>>c;
    int m=n;
    int b;
                LinkQueue B;
    /检查A队列中是否已存在请求的内存块/
    cout<<"检查是不是有相同的"<<endl;
    while(m)
    {     
     b=A.Leave();
     if(b==c)
     {
      count++;
     }
     B.Enter(b);
     m--;
    }
    将A队列恢复
    int nn=n;
    cout<<"将B队列给A队列"<<endl;
    while(nn)
    {     
     A.Enter(B.Leave());
                    nn--;
    }
    nn=n;
    if(!count)//页框中不存在请求内存块
    {
     cout<<"c进入A队列"<<endl;
        A.Leave();
     A.Enter(c);
     cout<<"此时页框内的进程为"<<endl;
     int d;
                    LinkQueue C;
                    while(nn)
     {
      d=A.Leave();
      cout<<d<<endl;
      C.Enter(d);
      nn--;
     }
     nn=n;
     while(nn)
     {
      A.Enter(C.Leave());
      nn--;
     }

    }
                else
     cout<<"页框中已存在该进程,不需要进行置换"<<endl;
   }
  }
  float ha=(length-n-count)/(length*1.0);
  cout<<"页面置换率为"<<ha<<endl;
 }
 return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值