设计一个虚拟存储区和内存工作区,并使用最佳置换算法计算访问缺页率

#include <stdio.h>

//初始化队列

void initializeList(int list[],int number){

    for (int i = 0; i < number; i ++) {

        list[i] = -1;

    }

}

//展示队列状态

void showList(int list[], int number){

    for (int i = 0; i < number; i ++) {

        printf("%2d",list[i]);

    }

    printf("\n");

}

//展示当前内存状态

void showMemoryList(int list[],int phyBlockNum){

    for (int i = 0; i < phyBlockNum; i ++) {

        if (list[i] == -1) {

            break;

        }

        printf(" |%d|",list[i]);

    }

    printf("\n");

}

void informationCount(int missingCount,int replaceCount,int pageNum){

    printf("缺页次数:%d 缺页率:%d/%d ",missingCount,missingCount,pageNum);

    printf("置换次数:%d \n",replaceCount);

}

//找到该页面下次要访问的位置

int getNextPosition(int currentPage,int currentPosition,int strList[],int pageNum){

    

    for (int i = currentPosition+1; i < pageNum; i ++) {

        if (strList[i] == currentPage) {

            return i;

        }

    }

    

    return 100;

}

//最佳置换算法

void replacePageByOPT(int memoryList[],int phyNum,int strList[],int pageNum){

    //置换次数

    int replaceCount = 0;

    //缺页次数

    int missingCount = 0;

    //记录在内存的物理块的下一次访问位置

    int nextPosition[phyNum];

    //初始化

    initializeList(nextPosition, phyNum);

    //记录当前页面的访问情况: 0 未访问

    int isVisited;

    

    for (int i = 0; i < pageNum; i ++) {

        isVisited = 0;

        //判断是否需要置换->内存已满且需要访问的页面不在内存中

for (int j = 0; j < phyNum; j ++) {

            if (memoryList[j] == strList[i]) {

                //该页面已经存在内存中

                //记录下一次访问它的位置

                nextPosition[j] = getNextPosition(memoryList[j], i, strList, pageNum);

                

                //修改访问情况

                isVisited = 1;

                

                //展示

                printf("%d\n",strList[i]);

                break;

            }

            if (memoryList[j] == -1) {

                //页面不在内存中且内存未满->直接存入

                memoryList[j] = strList[i];

                nextPosition[j] = getNextPosition(memoryList[j], i, strList, pageNum);

                

 missingCount ++;  

                //修改访问情况

                isVisited = 1;

                //展示

                printf("%d\n",strList[i]);

                showMemoryList(memoryList, phyNum);

                break;

            }

        }      

        if (!isVisited) {

            //当前页面还没访问过,内存已满且当前访问不在内存中->进行置换

            //1.寻找到最晚才被访问到的页面

            int max = 0;

            for (int k = 1; k < phyNum; k ++) {

                if (nextPosition[max] < nextPosition[k]) {

                    max = k;

                }

            }        

//2.将该位置的页面换出

            memoryList[max] = strList[i];

            nextPosition[max] = getNextPosition(memoryList[max], i, strList, pageNum);

            

            missingCount ++;

            replaceCount ++;

            

            //展示

            printf("%d\n",strList[i]);

            showMemoryList(memoryList, phyNum);

        }

    }

    informationCount(missingCount, replaceCount,pageNum);

}

int main(int argc, const char * argv[]) {

    //物理块的数量

    int phyBlockNum;

    printf("请输入物理块数量:\n");

    scanf("%d",&phyBlockNum);

    //生成内存队列

    int memoryList[phyBlockNum];

    //初始化内存状态

    initializeList(memoryList, phyBlockNum);

    //页面数量

    int pageNum;

    printf("请输入要访问的页面总数:\n");

    scanf("%d",&pageNum);

    //保存页面号引用串

    int pageNumStrList[pageNum];

    printf("请输入要访问的页面号:\n");

    for (int i = 0; i < pageNum; i ++) {

        scanf("%d",&pageNumStrList[i]);

    }

    printf("采用最佳置换算法的结果如下:\n\n"); 

    replacePageByOPT(memoryList, phyBlockNum, pageNumStrList, pageNum);

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

niu fu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值