#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