操作系统实验--页面置换算法(OPT/FIFO/LRU/LFU)cpp
程序员文章站
2022-07-05 08:05:54
...
前言
学习笔记
void IntoPage(int m);//将第m条指令转化为对应的页数
int isInside(int number,int Msize);//判断页号是否在内存中
void OPT(int num,int Msize);//最佳置换算法(OPT)
void FIFO(int num,int Msize);//先进现出置换算法(FIFO)
void LRU(int num,int Msize);//最近最久未使用置换算法(LRU)
void LFU(int num,int Msize);//最不经常使用置换算法(LFU)
void OPT(int num,int Msize){//最佳置换算法(OPT)
int max=0; // 表示内存中的页号,下一次出现的距离,初始为0
int maxchange; //表示内存中下次出现距离最大的页号在内存中的位置
int k;
if(isInside(num,Msize)==1){
/*cout<<"命中!"<<endl;
cout<<"内存Inside中内容为:"; //如果命中则打印当前内存页面,为简化程序输出而注释取消
for(int i=0;i<Msize;i++)
cout<<Inside [i]<<" ";
cout<<endl;*/
}
else //未命中
lost++; //未命中次数加1
for(int j=0;j<Msize;j++){
for(k=num;k<MMM;k++){//找到当前内存中的页面,在随后的页地址流中再次被调用时的位置
if(Inside[j]==page[k])
break;
}
if(k>max){
max=k; //k表示在这个地方会再次出现给定页面
maxchange=j;//j 表示把内存中第j个Inside中的页面从内存拿出,把新的页面放入
}
}
//cout<<"置换内存中Inside["<<maxchange<<"]处的页面\n";
Inside[maxchange] = page[num];//将此页写入内存中最晚再被调度的页面的位置
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++) //打印按本算法置换页面后内存中的页面序列,为简化程序输出而注释取消
cout<<Inside [i]<<" ";
cout<<endl;
}
void FIFO(int num,int Msize){//先进现出置换算法(FIFO)
if(isInside(num,Msize)){
/*cout<<"命中!"<<endl; //如果命中则打印当前内存页面,为简化程序输出而注释取消
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++)
cout<<Inside [i]<<" ";
cout<<endl;*/
}
else{
lost++;
Inside[insert]=page[num];//insert始终指向最老的页面,即最先进入的页面
insert++;//insert指向下一个最早进入的页面
insert=insert%Msize;//当insert指针指向内存中最后一个页面时,返回第一个页面继续循环
cout<<"内存Inside中内容为:"; //打印按本算法置换页面后内存中的页面序列,为简化程序输出而注释取消
for(int i=0;i<Msize;i++)
cout<<Inside [i]<<" ";
cout<<endl;
}
}
void LRU(int num,int Msize){//最近最久未使用置换算法(LRU)
int max=0; // 表示内存中的页号,上一次出现的距离
int maxchange; //表示内存中上一次出现距离最大的页号在内存中的位置
int k;
if(isInside(num,Msize)){
/*cout<<"命中!"<<endl; //如果命中则打印当前内存页面,为简化程序输出而注释取消
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++)
cout<<Inside [i]<<" ";
cout<<endl;*/
}
else{
lost++;
for(int j=0;j<Msize;j++){
for(k=num;k>=0;k--){ //从当前的页号向前看,发现页号与内存中的页号相同则break
if(Inside[j]==page[k])
break;
}
if((num-k)>max){ //比较内存中页号在页地址流中的位置
max=num-k; //将距离最大的存入max
maxchange=j; //j表示把内存中第j个Inside中的页面从内存拿出,把新的页面放入
}
}
Inside[maxchange]=page[num];
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++) //打印按本算法置换页面后内存中的页面序列,为简化程序输出而注释取消
cout<<Inside [i]<<" ";
cout<<endl;
}
}
void LFU(int num,int Msize){//最不经常使用置换算法(LFU)
int Min=MMM; //表示最小次数,初始化为MMM(最大)
int minchange=0; //表示内存中最小频率的页面所在的位置
int k;
int *frequent=new int[32];//frequent数组记录目前为止每个页面已出现的频率
for(int i=0;i<=31;i++)
frequent[i]=0;
if(isInside(num,Msize)){
/*cout<<"命中!"<<endl; //如果命中则打印当前内存页面,为简化程序输出而注释取消
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++)
cout<<Inside [i]<<" ";
cout<<endl;*/
}
else{
if(num<Msize){//若当前内存的页面没装满
lost++;
Inside[num]=page[num];//依次将页地址流的前Msize个页面装入内存
}
else{ //内存中页面已经装满
lost++;
for(int j=0;j<Msize;j++){
for(k=num;k>=0;k--){ //从当前的页号向前看
if(Inside[j]==page[k])//若发现页号与内存中的页号相同则将已访问频率加1
frequent[Inside[j]]++;
}
if(frequent[Inside[j]]<Min){ //比较内存中页号出现的频率
Min=frequent[Inside[j]]; //将频率最小的存入min
minchange=j; //j表示把内存中第j个Inside中的页面从内存拿出,把新的页面放入
}
}
Inside[minchange]=page[num];
cout<<"内存Inside中内容为:";
for(int i=0;i<Msize;i++) //打印按本算法置换页面后内存中的页面序列,为简化程序输出而注释取消
cout<<Inside [i]<<" ";
cout<<endl;
}
}
}
上一篇: elasticsearch 增删改查
下一篇: 操作系统页面置换算法之FIFO,LRU