Linux系统下C语言实现FIFO页面置换算法

FIFO页面置换算法,即 先进先出的页面置换。

主要思想

其设计思想主要是:在请求页式管理中,当发生缺页中断且主存没有空闲页面时,总是淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面被淘汰。

算法实现原理

把一个进程已调入主存的页面按先后次序链接成一个FIFO队列,并设置一个指针即可。

算法特点

①该算法是一种最直观但性能较差的页面置换算法,并可能会有 BELADY 异常现象,即分配的页面数增加时,缺页中断次数反而增加。

②内存利用率不高,是基于CPU按线性顺序访问地址空间的假设;但许多时候CPU不是按线性顺序访问地址空间;在内存中停留时间最长的页也是经常被访问的页。

具体实现

假设某个进程 P有6个页,标号分别为1~6,在内存中分配给该进程4个页面,假设进程访问页的顺序为

1    2    3   4   5    6   1   3   2   4   6    5   4   1   3   5   6   2    3    5    6   2    1   4

预测结果为:

缺页次数为:17

#include <stdio.h>
void main()
{
    int i,j,k = 0;//i是页面调度顺序,一共调度24个页面;j是当前调度页面;k统计缺页次数
    char cc[25]; //Y 表示产生缺页中断,N 表示未产生缺页中断
    int a[24] = {1,2,3,4,5,6,1,3,2,4,6,5,4,1,3,5,6,2,3,5,6,2,1,4}; //页面调度顺序
    int b[4][25];		//模拟内存中的页面情况
    int c[25];          //用于记录页面淘汰情况
    int p = 0;          //用于记录缺页
    b[0][0] = 0; //C 语言定义数组,其初值是不确定的;此处模拟的是初始状态内存中没有页面
    b[1][0] = 0;
    b[2][0] = 0;
    b[3][0] = 0;

    //打印页面调度顺序
    printf("page");
    for(i = 0;i < 24;i++)
        printf("%3d",a[i]);
        printf("\n=====================================
        =======================================\n");

    //页面替换
    for(i = 0;i < 24;i++)
    {
        if(a[i]==b[0][i]||a[i]==b[1][i]||a[i]==b[2][i]|a[i]==b[3][i])
        {//判断是否在内存;在的话,直接将当前内存中物理页情况传递,没有发生缺页中断和页面替换
        b[0][i+1]=b[0][i];
        b[1][i+1]=b[1][i];
        b[2][i+1]=b[2][i];
        b[3][i+1]=b[3][i];
        cc[i]='N';
         }

    else{
        //调度页面不在内存中,实现fifo替换
        if(i > 3)
           {
            c[p]=b[3][i];
            p++;
           }
        b[0][i+1]=a[i];
        b[1][i+1]=b[0][i];
        b[2][i+1]=b[1][i];
        b[3][i+1]=b[2][i];
        cc[i]='Y';
         k=k+1;//缺页  计数
        }
    }

    //打印内存中第一页的情况
    for(j=0;j<25;j++)
        printf("%3d",b[0][j]);
    printf("\n ------------------------------------------------------------------------------\n");
    //打印内存中第二页的情况
    for(j=0;j<25;j++)
         printf("%3d",b[1][j]);
    printf("\n ------------------------------------------------------------------------------\n");
    //打印内存中第三页的情况
    for(j=0;j<25;j++)
        printf("%3d",b[2][j]);
    printf("\n -----------------------------------------------------------------------------\n");
     printf(" ");
    //打印内存中第四页的情况
     for(j=0;j<25;j++)
        printf("%3d",b[3][j]);
    printf("\n -----------------------------------------------------------------------------\n");
     printf("   ");
    
    //打印是否缺页中断
     for(j=0;j<25;j++)
     {
        printf(" ");
        putchar(cc[j]);
        printf(" ");
    }
    printf("\n 缺页中断次数:%3d\n",k);
    printf("页面淘汰顺序:");
    for(j=0;j<p;j++)
    printf("%3d",c[j]);
    printf("\n\n");
}
程序运行结果

可能有不完善之处,欢迎各位批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值