操作系统:FIFO算法详解及代码演示

FIFO算法

FIFO算法是最简单的页面置换算法。FIFO算法为每个页面记录了调到内存的时间。当必须置换页面的时候,选择最旧的页面。
在这里插入图片描述
通俗来说,每次进入主存的时候

  • 如果主存中不存在这个页面,那么最先进入的页面出队。
  • 如果主存存在这个页面,那么内存不动。

下面是C++面向对象写法代码。
这个说明一下为什么不用容器Queue。是因为queue并没有迭代器,所以无法去寻找里面是否含有某块页面。
直接使用线性表即可,方便简单且快速。

// 在分页式虚拟存储管理中,要求通过键盘输入分配给一个作业的物理块数和作业依次访问的10个页面号,
// 采用先进先出(FIFO)页面置换后
// ,顺序输出缺页中断时所淘汰的页面号,并计算缺页中断率。
#include <iostream>

using namespace std;
#define MAX 20
class Work
{
public:
    void seta()
    {
        int c, i = 1;
        cout << "输入10个页面号,以任意符号结尾" << endl;
        cin >> c;
        a[0] = c;
        while (cin >> c)
        {

            a[i] = c;
            i++;
        }
    }
    void geta()
    {
        cout << "10个页面号分别为:  ";
        for (int i = 0; i < 10; i++)
        {
            cout << a[i] << " ";
        }
        cout << endl;
    }
    int index(int i)
    {
        return a[i];
    }
~Work(){
    cout<<"work 已被释放"<<endl;
}
private:
    int a[10];
};

class space
{
public:    
    // 初始化构造函数,把除了物理块大小的其他空间都设置成其他值
    // 将初始化空间设置成-1
    space(int i)
    {
        size=i;
        for (int j = 0; j < i; j++)
        {
            s[j] = -1;
        }
        s[i] = -999;
    }

    // 显示物理块现在的状态
    void getSpace(){
        int i=0;
        cout<<"-------------物理块现在的状态是-------------"<<endl;
        
        while(s[i]!=-999){
            if(s[i]==-1){
                cout<<"NaN"<<"     -||-      ";
                i++;
                continue;
            }
            cout<<s[i]<<"     -||-      ";
            i++;
        }
        cout<<endl;
        cout<<"------------------------------------------"<<endl;
    }
    int find(int n){
        for(int i=0;i<size;i++){
            if(s[i]==n){
                return i;
            }
        }
        return -1;
    }

    // 先进先出,去掉第一个物理块,改变最后一个物理块。
    void change(int n){
        for(int i=0;i<size;i++){
            s[i]=s[i+1];
        }
        s[size-1]=n;

    }

    ~space(){
        cout<<"space 已被释放"<<endl;
    }
private:
    int s[MAX];
    int size;
};


void FIFO(Work &a,space &s){
    int i=0;
    int local;
    int count=0;
    while(i<10){
        if(s.find(a.index(i))==-1){
            // 如果在物理块里面找不到作业
            s.change(a.index(i));
            // 那么就将物理块改变
            s.getSpace();
            count+=1;
        }else{
            s.getSpace();
        }
        i++;
    }
    double q;
    q=(double)count/10;
    cout<<"----------------------------------"<<endl;
    cout<<"缺页中断的次数为: "<<count<<endl;
    cout<<"缺页终端率为: "<<q<<endl;
    cout<<"----------------------------------"<<endl;

}

int main()
{
    Work a;
    int num=0;
    cout<<"输入物理块数的个数"<<endl;
    cin>>num;  
    space s(num);  
    a.seta();
    a.geta();
    FIFO(a,s);
 

    return 0;
}

在这里插入图片描述

posted @ 2021-05-16 15:01  Zeker62  阅读(2332)  评论(0编辑  收藏  举报