ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

先进先出(FIFO)页面置换算法 C语言实现

2020-12-15 23:57:59  阅读:584  来源: 互联网

标签:10 pageNum FIFO C语言 指令 m1 printf data 先进先出


广东工业大学 操作系统实验

实验内容

假设每个页面中可存放10条指令,分配给作业的内存块数为4。用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

置换算法:采用先进先出(FIFO)页面置换算法。

通过随机数产生一个指令序列,共320条指令:
1)指令的地址按下述原则生成:
① 50%的指令是顺序执行的;
② 25%的指令是均匀分布在前地址部分;
③ 25%的指令是均匀分布在后地址部分;
具体的实施方法是:
① 在[0,319]的指令地址之间随机选取一起点m;
② 顺序执行一条指令,即执行序号为m+1的指令;
③ 在前地址[0,m-1]中随机选取一条指令并执行,该指令的序号为m1;
④ 顺序执行一条指令,其序号为m1+1的指令;
⑤ 在后地址[m1+2,319]中随机选取一条指令并执行,该指令的序号为m2;
⑥ 顺序执行一条指令,其序号为m2+1的指令;
重复上述步骤①~⑥,直到执行320次指令。
2)将指令序列变换为页地址流
设页面大小为1K, 用户虚存容量为32K。在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
……
……
第310条~第319条指令为第31页(对应虚存地址为[310,319])。
按以上方式,用户指令可组成32页。

代码实现

#include <stdio.h>
#include <stdlib.h>

float count = 0; //缺页次数

typedef struct Data //数据域
{
    int pageNum; //装进的用户虚存页号
    int blockNum; //块号
} Data;

typedef struct BlockNode //单向循环链表
{
    Data data;
    struct BlockNode *next;
} Block, *BlockList;

//定义内存块
BlockList block1;
BlockList block2;
BlockList block3;
BlockList block4;
Block *p;

void initialize() //初始化
{
    block1 = (BlockList)malloc(sizeof(Block));
    block2 = (BlockList)malloc(sizeof(Block));
    block3 = (BlockList)malloc(sizeof(Block));
    block4 = (BlockList)malloc(sizeof(Block));
    p = block1;

    block1->data.pageNum = -1;
    block2->data.pageNum = -1;
    block3->data.pageNum = -1;
    block4->data.pageNum = -1;

    block1->data.blockNum = 0;
    block2->data.blockNum = 1;
    block3->data.blockNum = 2;
    block4->data.blockNum = 3;

    block1->next = block2;
    block2->next = block3;
    block3->next = block4;
    block4->next = block1;
}

int FIFO(int pageNum, int virAddr) //先进先出页面置换算法
{
    BlockList q = p; //存储p原来的位置

    for(int i = 0; i < 4; i++) //判断块中内存是否均已加载数据并且指令是否已在内存中
    {
        if(p->data.pageNum == -1) //块为空闲
        {
            p->data.pageNum = pageNum;
            count++; //缺页次数+1
            printf("指令未装入内存!页面置换完成!\n用户指令第%d页第%d条的物理地址为:第%d块第%d条 \n\n", pageNum, (virAddr % 10), p->data.blockNum, (virAddr % 10));
            p = block1; //指向最先被分配的块1;

            return 1;
        }

        if(p->data.pageNum == pageNum)
        {
            printf("指令已在内存中!\n用户指令第%d页第%d条的物理地址为:第%d块第%d条 \n\n", pageNum, (virAddr % 10), p->data.blockNum, (virAddr % 10));
            p = q;//页面没有发生置换,指针指向原最老的页面

            return 1;
        }

        p = p->next;
    }

    p->data.pageNum = pageNum;
    count++;
    printf("指令未装入内存且内存块已满!页面置换完成!\n用户指令第%d页第%d条的物理地址为:第%d块第%d条 \n\n", pageNum, (virAddr % 10), p->data.blockNum, (virAddr % 10));

    p = p->next; //指向最老的页面

    return 1;
}

void calculate() //生成页地址流并计算缺页率
{
    for(int i = 0; i < 320; )
    {
        int m = rand() % 320;
        printf("指令地址为:%d \n", (m + 1));
        FIFO(((m + 1) / 10), m + 1);
        i++;

        int m1 = rand() % (m - 1);
        printf("指令地址为:%d \n", m1);
        FIFO((m1 / 10), m1);
        i++;

        printf("指令地址为:%d \n", (m1 + 1));
        FIFO(((m1 + 1) / 10), m1 + 1);
        i++;

        int m2 = rand() % (319 - m1 - 1) + m1 + 2;
        printf("指令地址为:%d \n", m2);
        FIFO((m2 / 10), m2);
        i++;

        printf("指令地址为:%d \n", (m2 + 1));
        FIFO(((m2 + 1) / 10), m2 + 1);
        i++;
    }

    printf("\n");
    printf("缺页次数:%.0f\n", count);
    printf("计算得到的缺页率为:%.4f \n", count / 320);
}

int main()
{
    printf("----------先进先出页面置换算法----------\n\n");

    initialize();
    calculate();

    return 0;
}

标签:10,pageNum,FIFO,C语言,指令,m1,printf,data,先进先出
来源: https://blog.csdn.net/weixin_45761769/article/details/111243313

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有