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

#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
    评论
好的,我了解你的问题了。首先,我可以为您解释一下虚拟存储内存工作的概念。 虚拟存储计算机系统用于管理磁盘存储器和主存储器之间的数据传输的技术。它允许计算机系统能够处理比主存储器容量更大的数据集。内存工作则是指在内存中为某个进程分配的一块空间,用于存储该进程正在使用的数据。 对于您的问题,我们需要设计一个虚拟存储内存工作,并使用先进先出算法(FIFO)计算访问命中率。具体步骤如下: 1. 设计虚拟存储。假设虚拟存储大小为1000个页面,页面大小为4KB,因此虚拟存储大小为4MB。每个页面都有一个唯一的页面号。 2. 设计内存工作。假设内存工作大小为100个页面,页面大小为4KB,因此内存工作大小为400KB。每个页面都有一个唯一的页面号。 3. 初始化内存工作。在开始时,将内存工作中的所有页面都标记为“未使用”。 4. 模拟访问页面序列。假设访问页面序列为:1, 3, 5, 2, 1, 4, 6, 2, 8, 7。这意味着进程首先访问页面1,然后是页面3,以此类推。 5. 计算访问命中率。使用FIFO算法来模拟页面置换。如果当前访问的页面已经在内存工作中,则称为“命中”;否则称为“缺页”。如果发生缺页,则需要从虚拟存储中选择一个页面将其换入内存工作,并将被替换的页面换出到虚拟存储中。 下面是使用FIFO算法进行页面置换的具体步骤: 1. 当访问页面1时,由于内存工作为空,需要将页面1从虚拟存储中换入内存工作。此时内存工作为{1}。 2. 当访问页面3时,由于内存工作中没有页面3,需要将页面3从虚拟存储中换入内存工作。此时内存工作为{1, 3}。 3. 当访问页面5时,由于内存工作中没有页面5,需要将页面5从虚拟存储中换入内存工作。此时内存工作为{1, 3, 5}。 4. 当访问页面2时,由于内存工作中没有页面2,需要将页面2从虚拟存储中换入内存工作,并将页面1换出到虚拟存储中。此时内存工作为{2, 3, 5}。 5. 当访问页面1时,由于页面1已经在内存工作中,称为“命中”。此时内存工作为{2, 3, 5}。 6. 当访问页面4时,由于内存工作中没有页面4,需要将页面4从虚拟存储中换入内存工作,并将页面3换出到虚拟存储中。此时内存工作为{2, 4, 5}。 7. 当访问页面6时,由于内存工作中没有页面6,需要将页面6从虚拟存储中换入内存工作,并将页面2换出到虚拟存储中。此时内存工作为{4, 5, 6}。 8. 当访问页面2时,由于页面2已经在内存工作中,称为“命中”。此时内存工作为{4, 5, 6}。 9. 当访问页面8时,由于内存工作中没有页面8,需要将页面8从虚拟存储中换入内存工作,并将页面5换出到虚拟存储中。此时内存工作为{4, 6, 8}。 10. 当访问页面7时,由于内存工作中没有页面7,需要将页面7从虚拟存储中换入内存工作,并将页面4换出到虚拟存储中。此时内存工作为{6, 8, 7}。 11. 访问序列结束,总共发生了7次缺页。因此,访问命中率为3/11=27.27%。 希望上述解释能够帮助您理解如何设计虚拟存储内存工作,并使用先进先出算法计算访问命中率。如果您还有其他问题,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

niu fu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值