FIFO页面置换算法详解

 页面置换算法的基本思想:

FIFO每次置换最先调入内存的页面,即将内存中等待时间最长的页面进行置换。此算法的适用范围是顺序结构程序。

实现过程

比如有下述页面走向:1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6。当内存块数量分别为3时, 我们算一算使有此方法时产生的缺页次情况。 (注意, 所有内存块最初都是空的, 凡第一次用到的页面都产生一次缺页。)
当内存块数量分别为3时, FIFO算法的执行过程如下图所示。
打叉的表示发生了缺页, 共缺页16次。

在这里插入图片描述

 图片来自网络

优点

先进先出页面置换算法的优点是其实现起来比较简单,可以不需要硬件的支持, 因而不需要增加系统的成本。

缺点

先进先出页面置换算法没有考虑到缓存页面被使用的情况。如果一个页面被频繁访问, 我们应该将它保留在缓存中, 这样就能够提高程序的性能。但是使用FIFO算法, 很可能将一个被频繁访问的页面清除出缓存, 所以FIFO算法在实际的应用中是很少被使用到的, 但是这种思想是计算机系统中常常被采用的。
在大数情况下,先进先出页面置换算法缺页率比较低或会产生Belady异常现象。

所谓Belady现象是指:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。 Belady现象可形式化地描述为:一个进程户要访问M个页,OS分配N个内存页面给进程P;对一个访问序列S,发生缺页次数为PE (S,N)。

异常分析:

页面调度算法可分为堆栈式和非堆栈式,LRU,LFU,OPT均为堆栈类算法,FIFO为非堆栈类算法,只有非堆栈类才会出现Belady现象。

FIFO算法将最早调入的页调出,而调出的页在不久可能会被重新使用出现反复调入调出,缺页率反而上升。 

FIFO的实现算法(c)

#include <stdio.h>
#include <stdlib.h>
#define maxpagenum 100
typedef struct page
{
    int pagenum;
    struct page *next;
}Page;
int FIFO(Page *block,int pages[maxpagenum],int pagenum,int blocknum)
{
    int i = 0,j = 0;
    int time = 0;
    Page *old = block,*check = NULL;
    while(i<pagenum){
        check = block;
        j = 0;
        while(j < blocknum){
            if(pages[i]==check->pagenum)// 命中
                break;
            check = check->next;
            j++;
        }
        if(j == blocknum){//没有命中,替换
            old->pagenum = pages[i];
            old = old->next;
            time += 1; //缺页次数+1
        }
        i++;
    }
    return time;
}
Page* creatblock(int blocknum)
{
    int i;
    Page *head = NULL,*cur = NULL,*tail = NULL;
    for(i = 0;i < blocknum;i++){
        if(!head){
            cur = (Page*)malloc(sizeof(Page));
            cur->pagenum = -1;
            cur->next = NULL;
            head = tail = cur;
        }
        else{
            cur = (Page*)malloc(sizeof(Page));
            cur->pagenum = -1;
            tail->next = cur;
            tail = cur;
        }
    }
    tail->next = head;
    return head;
}
int main()
{
    int time;
    int pages[maxpagenum];
    int i,blocknum,pagenum;
    Page *head=NULL;
    printf("请输入块号:\n");
    scanf("%d",&blocknum);
    head = creatblock(blocknum);
    printf("请输入待访问的页面数量:\n");
    scanf("%d",&pagenum);
    printf("请输入待访问的页面号:\n");
    for(i=0;i<pagenum;i++){
        scanf("%d",&pages[i]);
    }
    time = FIFO(head,pages,pagenum,blocknum);
    printf("缺页次数:%d,中断率:%.2f%%\n",time,time*1.0/pagenum*100);
    return 0;
}

---代码来源:

(18条消息) 操作系统FIFO页面置换算法(C语言)_东流-beyond the label的博客-CSDN博客_页面置换算法fifo算法实现

  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值