页面置换算法C语言实现(FIFO、LRU)

网上资源虽多,但是要想把这两个算法的细节理解的透彻,还得是自己写

1.FIFO

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//主要数据结构
#define total_instrucion 15//总的页面访问次数
#define max_block_num 10//最大内存分配

int Access_Series[total_instrucion];//内存访问序列
char Lack[total_instrucion];//记录是否缺页
struct one_block {//一个物理块
    int page_no;//物理块内的页面号
    int cnt;//计数,用于确定最先进入的页面(FIFO)
}blocks[max_block_num];
int table[max_block_num][total_instrucion];//显示矩阵
void FIFO(int block_num){
    int diseffect;//缺页数
    for (int i = 0; i < total_instrucion; i++)
        Lack[i] = 'N';//初始化不缺页
    //数据结构blocks的初始化
    for (int i = 0; i < block_num; i++) {
        blocks[i].page_no = -1;//初始化页号为-1,当前有空闲页面
        blocks[i].cnt = 0;//初始化计数
    }
    //开始访问页面
    for (int i = 0; i < total_instrucion; i++) {
        char full = 'T';//是否内存满
        char hit = 'F';//是否命中
        for (int j = 0; j < block_num; j++) {
            if (blocks[j].page_no == Access_Series[i]) {//命中的情况
                hit = 'T';
                break;
            }else if (blocks[j].page_no == -1) {//未命中,且内存未满的情况
                blocks[j].page_no = Access_Series[i];
                blocks[j].cnt = j + 1;
                Lack[i] = 'Y';//缺页
                diseffect++;
                full = 'F';//内存未满
                break;
            }
        }
        if (full == 'T') {//内存已满
            if (hit == 'F') {//若未命中
                diseffect++;
                Lack[i] = 'Y';
                int target = -1;//选中替换目标
                for (int j = 0; j < block_num; j++) {
                    blocks[j].cnt--;//发生页面置换
                    if (blocks[j].cnt == 0)
                        target = j;
                }
                blocks[target].page_no = Access_Series[i];
                blocks[target].cnt = block_num;
            }
        }
        for (int j = 0; j < block_num; j++)
            table[j][i] = blocks[j].page_no;
    }

    /*输出运行过程及结果*/
    printf("采用FIFO页面置换算法结果如下:");
    printf("\n");
    printf("页号:");
    for (int i = 0; i < total_instrucion; i++)
        printf("%3d", Access_Series[i]);
    printf("\n");
    printf("-----------------------------------------------------\n");
    for (int i = 0; i < block_num; i++) {
        printf("块%2d:", i+1);
        for (int j = 0; j < total_instrucion; j++)
            printf("%3d", table[i][j]);
        printf("\n");
    }
    printf("-----------------------------------------------------\n");
    printf("缺页:");
    for (int i = 0; i < total_instrucion; i++)
        printf("%3c", Lack[i]);
    printf("\n");
    printf("-----------------------------------------------------\n");
    printf("\t缺页次数:%d\t缺页率:%d/%d\n", diseffect, diseffect, total_instrucion);
    printf("-----------------------------------------------------\n");
}
int main(){
    //初始化
    //父进程随机产生内存访问页面序列,存于数组Acess_Series[total_instruction]中
    srand((unsigned)time(NULL));
    for (int i = 0; i < total_instrucion; i++)
        Access_Series[i] = rand() % total_instrucion;
    int block_num;
    while(1){
        printf("请输入分配的物理块数(-1退出):");
        scanf("%d",&block_num);
        if(block_num==-1) break;
        FIFO(block_num);
    }
    return 0;
}

2.LRU

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//主要数据结构
#define total_instrucion 15//总的页面访问次数
#define max_block_num 10//最大内存分配

int Access_Series[total_instrucion];//内存访问序列
char Lack[total_instrucion];//记录是否缺页
struct one_block {//一个物理块
    int page_no;//物理块内的页面号
    int tim;//计时,用于确定最近最久未使用的页面(LRU)
}blocks[max_block_num];
int table[max_block_num][total_instrucion];//显示矩阵
void LRU(int block_num){
    int diseffect;//缺页数
    for (int i = 0; i < total_instrucion; i++)
        Lack[i] = 'N';//初始化不缺页
    //数据结构blocks的初始化
    for (int i = 0; i < block_num; i++) {
        blocks[i].page_no = -1;//初始化页号为-1,当前有空闲页面
        blocks[i].tim = 0;//初始化计时
    }
    //开始访问页面
    for (int i = 0; i < total_instrucion; i++) {
        char full = 'T';//是否内存满
        char hit = 'F';//是否命中
        for (int j = 0; j < block_num; j++)
            blocks[j].tim++;//计时器加1
        for (int j = 0; j < block_num; j++) {
            if (blocks[j].page_no == Access_Series[i]) {//命中的情况
                hit = 'T';
                blocks[j].tim=0;//刚刚访问,值变为0
                break;
            }else if (blocks[j].page_no == -1) {//未命中,且内存未满的情况
                blocks[j].page_no = Access_Series[i];
                blocks[j].tim=0;//刚刚访问,值变为0
                Lack[i] = 'Y';//缺页
                diseffect++;
                full = 'F';//内存未满
                break;
            }
        }
        if (full == 'T') {//内存已满
            if (hit == 'F') {//若未命中
                diseffect++;
                Lack[i] = 'Y';
                int target = 0;//选中替换目标
                for (int j = 1; j < block_num; j++) {
                    if (blocks[j].tim>blocks[target].tim)
                        target = j;
                }
                blocks[target].page_no = Access_Series[i];
                blocks[target].tim=0;//刚刚访问,值变为0
            }
        }
        for (int j = 0; j < block_num; j++)
            table[j][i] = blocks[j].page_no;
    }

    /*输出运行过程及结果*/
    printf("采用LRU页面置换算法结果如下:");
    printf("\n");
    printf("页号:");
    for (int i = 0; i < total_instrucion; i++)
        printf("%3d", Access_Series[i]);
    printf("\n");
    printf("-----------------------------------------------------\n");
    for (int i = 0; i < block_num; i++) {
        printf("块%2d:", i+1);
        for (int j = 0; j < total_instrucion; j++)
            printf("%3d", table[i][j]);
        printf("\n");
    }
    printf("-----------------------------------------------------\n");
    printf("缺页:");
    for (int i = 0; i < total_instrucion; i++)
        printf("%3c", Lack[i]);
    printf("\n");
    printf("-----------------------------------------------------\n");
    printf("\t缺页次数:%d\t缺页率:%d/%d\n", diseffect, diseffect, total_instrucion);
    printf("-----------------------------------------------------\n");
}
int main(){
    //初始化
    //父进程随机产生内存访问页面序列,存于数组Acess_Series[total_instruction]中
    srand((unsigned)time(NULL));
    for (int i = 0; i < total_instrucion; i++)
        Access_Series[i] = rand() % total_instrucion;
    int block_num;
    while(1){
        printf("请输入分配的物理块数(-1退出):");
        scanf("%d",&block_num);
        if(block_num==-1) break;
        LRU(block_num);
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值