页面置换算法LRU

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;

//测试页面走向 7 0 1 2 0 3 0 4 2 7 1
//测试页面走向 0 1 2 3 0 1 4 0 1 2 3 4

//初始化队列
void initializeList(int list[],int number){
    for (int i = 0; i < number; i ++) {
        list[i] = -1;
    }
}
//展示队列状态
void showList(int list[], int number){
    printf("队列状态:");
    for (int i = 0; i < number; i ++) {
        printf("%2d",list[i]);
    }
    printf("\n");
}

//展示当前内存状态
void showMemoryList(int list[],int phyBlockNum){
    printf("当前物理页状态:");
    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\n",missingCount,missingCount,pageNum);
    double result = (double)(pageNum - missingCount)/(double)pageNum;
    printf("置换次数:%d  命中率:%.2f\n",replaceCount,result);
}

//最近最久未使用置换算法
void replacePageByLRU(int memoryList[],int phyNum,int strList[],int pageNum){
    int isVisited = 0;
    //置换次数
    int replaceCount = 0;
    //缺页次数
    int missingCount = 0;

    //记录已经在内存中的页面数量
    int pageCount = 0;
    for (int i = 0; i < pageNum; i ++) {
        isVisited = 0;
        //判断内存是否需要换页
        for (int j = 0; j < phyNum; j ++) {
            if (memoryList[j] == strList[i]) {
                //已经存在于内存中,把它换到队列尾部
                int temp = memoryList[j];
                for (int k = j; k < pageCount-1; k ++) {
                    memoryList[k] = memoryList[k+1];
                }
                memoryList[pageCount-1] = temp;

                //修改访问情况
                isVisited = 1;
                //展示
                printf("调入页面:%d\n",strList[i]);
                showMemoryList(memoryList, phyNum);
                break;
            }

            if (memoryList[j] == -1) {
                //页面不在内存中且内存未满->直接存入
                memoryList[j] = strList[i];
                //修改访问情况
                isVisited = 1;

                pageCount ++;
                //未命中
                missingCount++;
                //展示
                printf("调入页面:%d\n",strList[i]);
                showMemoryList(memoryList, phyNum);
                break;
            }
        }

        if (!isVisited) {
            //需要换页
            //1.直接将数组整体往前移一位
            for (int k = 0; k < phyNum; k ++) {
                memoryList[k] = memoryList[k+1];
            }
            //2.将当前页面加到队尾
            memoryList[phyNum-1] = strList[i];
            //未命中
            missingCount++;
            //置换数+1
            replaceCount++;
            //展示
            printf("调入页面:%d\n",strList[i]);
            showMemoryList(memoryList, phyNum);
        }
    }
    informationCount(missingCount, replaceCount, pageNum);
}


int main(int argc, const char * argv[]) {
    //物理块的数量
	int phyBlockNum = 0;
    printf("请输入物理块数量:\n");
    scanf("%d",&phyBlockNum);
    
    //生成内存队列
    int memoryList[100];
    //初始化内存状态
    initializeList(memoryList, phyBlockNum);
    
    //页面数量
    int pageNum;
    printf("请输入要访问的页面总数:\n");
    scanf("%d",&pageNum);
    
    //保存页面号引用串
    int pageNumStrList[100];
    printf("请输入要访问的页面号:\n");
    for (int i = 0; i < pageNum; i ++) {
        scanf("%d",&pageNumStrList[i]);
    }
    
    showList(pageNumStrList, pageNum);
    //lru置换算法
    replacePageByLRU(memoryList, phyBlockNum, pageNumStrList, pageNum);
    //重新初始化内存
    initializeList(memoryList, phyBlockNum);

	system("pause");

    return 0;
}


1.测试数据一

测试页面走向 0 1 2 3 0 1 4 0 1 2 3 4

程序执行结果

请输入物理块数量:

3

请输入要访问的页面总数:

11

请输入要访问的页面号:

7 0 1 2 0 3 0 4 2 7 1

队列状态: 7 0 1 2 0 3 0 4 2 7 1

调入页面:7

当前物理页状态: |7|

调入页面:0

当前物理页状态: |7| |0|

调入页面:1

当前物理页状态: |7| |0| |1|

调入页面:2

当前物理页状态: |0| |1| |2|

调入页面:0

当前物理页状态: |1| |2| |0|

调入页面:3

当前物理页状态: |2| |0| |3|

调入页面:0

当前物理页状态: |2| |3| |0|

调入页面:4

当前物理页状态: |3| |0| |4|

调入页面:2

当前物理页状态: |0| |4| |2|

调入页面:7

当前物理页状态: |4| |2| |7|

调入页面:1

当前物理页状态: |2| |7| |1|

缺页次数:9   缺页率:9/11

置换次数:6  命中率:0.18

2.测试数据二

测试页面走向 7 0 1 2 0 3 0 4 2 7 1

程序执行结果

请输入物理块数量:

3

请输入要访问的页面总数:

11

请输入要访问的页面号:

0 1 2 3 0 1 4 0 1 2 3 4

队列状态: 0 1 2 3 0 1 4 0 1 2 3

调入页面:0

当前物理页状态: |0|

调入页面:1

当前物理页状态: |0| |1|

调入页面:2

当前物理页状态: |0| |1| |2|

调入页面:3

当前物理页状态: |1| |2| |3|

调入页面:0

当前物理页状态: |2| |3| |0|

调入页面:1

当前物理页状态: |3| |0| |1|

调入页面:4

当前物理页状态: |0| |1| |4|

调入页面:0

当前物理页状态: |1| |4| |0|

调入页面:1

当前物理页状态: |4| |0| |1|

调入页面:2

当前物理页状态: |0| |1| |2|

调入页面:3

当前物理页状态: |1| |2| |3|

缺页次数:9   缺页率:9/11

置换次数:6  命中率:0.18

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值