欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

操作系统实验--页面置换算法(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;
		}
	}	
}
相关标签: 算法