实验4 页面置换算法
一、实验目的
理解页面置换算法,实现先进先出(FIFO)置换算法和最久未使用(LRU)置换算法,给出任意的输入流,计算置换次数。
二、实验要求
给出任意的输入流,计算置换次数。物理块大小可定制,0~9数字任意排序的数字流。
三、实验代码-页面置换算法.cpp
1.初始化队列
#include <stdio.h>
void initial(int list[],int number){//初始化队列
for(int i=0;i<number;i++){
list[i]=-1;
}
}
2.FIFO算法
void FIFO(int memorylist[],int phynum,int strlist[],int pagenum){
int replacecount=0;
int earliest=0;//记录当前最早进入内存的下标
int isvisited=0;//记录当前页面访问情况
for(int i=0;i<pagenum;i++){
isvisited=0;
//判断是否需要置换(内存已满且需要访问的页面不在内存中)
for(int j=0;j<phynum;j++){
if(memorylist[j]==strlist[i]){
//页面已经再内存中
isvisited=1;//修改访问情况
break;
}
if(memorylist[j]==-1){
//页面不在内存中且内存未满(直接存入)
memorylist[j]=strlist[i];
isvisited=1;//修改访问情况
break;
}
}
if(!isvisited){
//当前页面未被访问(进行页面置换)
memorylist[earliest]=strlist[i];
//下标指向下一个
earliest++;
//若到了最后一个,下标归零
if(earliest>phynum-1){
earliest=0;
}
replacecount++;
}
}
printf("置换次数:%d\n",replacecount);
}
3.LRU算法
void LRU(int memorylist[],int phynum,int strlist[],int pagenum){
int replacecount=0;//置换次数
//记录内存中最近一次访问至今的时间
int timerecord[phynum];
initial(timerecord,phynum);
//记录当前页面的访问情况
int isvisited=0;
//记录已经在内存中的页面数量
int pagecount=0;
for(int i=0;i<pagenum;i++){
isvisited=0;
//将已经在内存的页面时间加1
for(int p=0;p<pagecount;p++){
if(memorylist[p]!=-1){
timerecord[p]++;
}
}
//是否需要置换
for(int j=0;j<phynum;j++){
if(memorylist[j]!=-1){
timerecord[j]++;
}
if(memorylist[j]==strlist[i]){
//该页面已经在内存中,修改访问情况
isvisited=1;
//重置访问时间
timerecord[j]=-1;
break;
}
if(memorylist[j]==-1){
//页面不在内存中且内存未满(直接存入)
memorylist[j]=strlist[i];
pagecount++;
//修改访问情况
isvisited=1;
//修改访问时间
timerecord[j]++;
break;
}
}
if(!isvisited){
//需要置换,寻找最久未访问的页面所在内存下标
int max=0;
//即找数组最大值
for(int k=0;k<phynum;k++){
if(timerecord[max]<timerecord[k]){
max=k;
}
}
//将该位置的页面换出
memorylist[max]=strlist[i];
timerecord[max]=-1;
replacecount++;
}
}
printf("置换次数:%d\n",replacecount);
}
4.主函数
int main(){
//物理块的数量
int phyblocknum;
printf("请输入物理块的数量:\n");
scanf("%d",&phyblocknum);
//内存队列
int memorylist[phyblocknum];
//初始化内存状态
initial(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]);
}
int choose;//需要选择的置换算法
while(1){
printf("请选择所需的置换算法:\n");
printf("1:FIFO 2.LRU 3.退出 ");
scanf("%d",&choose);
switch(choose){
case 1:
FIFO(memorylist,phyblocknum,pagenumstrlist,pagenum);
initial(memorylist,phyblocknum);
break;
case 2:
LRU(memorylist,phyblocknum,pagenumstrlist,pagenum);
initial(memorylist,phyblocknum);
break;
default:
return 0;
break;
}
}
return 0;
}