操作系统实验--页面置换算法(OPT/FIFO/LRU/LFU)cpp

前言
学习笔记

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;
		}
	}	
}
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loafer_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值