OS基础之最·佳置换算法与最近最久未使用置换算法

题目:给定一个进程执行时的访问页面数N,进程拥有的内存块个数M,以及进程执行时页面访问次序数组page。采用最佳淘汰算法OPT和最近最久未使用淘汰算法LRU,通过编程,计算这两种方法的缺页次数以及缺页率。

代码示意:

PS:本人是初学者,如有错误和优化的地方还请大佬斧正!

#include<iostream>
using namespace std;
int page[100];
/*给定一个进程执行时的访问页面数N,进程拥有的内存块个数M,以及进程执行时页面访问次序数组page。
采用最佳淘汰算法OPT和最近最久未使用淘汰算法LRU,通过编程,
计算这两种方法的缺页次数以及缺页率。
*/ 
int replace_OPT(int memory[],int M,int page[],int N,int n){
	int position=0;
	int max=0;
	//找到最佳置换的位置 
	for(int i=0;i<M;i++){
		int j;
		for(j=n+1;j<N;j++){
			if(memory[i]==page[j]){
				break;
			}
		}
		if(j>max){
			max=j;
			position=i;
		}
	}
//	cout<<"position:"<<position<<endl;
	return position; 
}
int replace_LRU(int memory_time[],int M){
		int position=0;
		int max=0;
		for(int i=0;i<M;i++){
			if(memory_time[i]>max){
				max=memory_time[i];
				position=i;
			}
		}
		return position;
}
//采用最佳淘汰算法OPT
void OPT(int page[],int N,int M,int memory[]){
	int lose=0;
	int i,j;
	for(i=0;i<N;i++){
		//先让页面进入内存
		 if(i<=M-1){
		 	memory[i]=page[i];
		 }
		 else{
		 	//先找有没有在内存里 
		for(j=0;j<M;j++){
			if(page[i]==memory[j])
			break;
		}
		if(j<M){
			continue;
		}
		else{
			//没有在内存里,产生缺页
			lose++;
		//	cout<<"lose:"<<lose<<endl;
		//	cout<<"page["<<i<<"]:"<<page[i]<<endl;
			memory[replace_OPT(memory,M,page,N,i)]=page[i];	
		//	cout<<"memory:"<<endl;
		// for(int k=0;k<M;k++)
		// cout<<memory[k]<<" ";
		// cout<<endl;
		}
		 }
		
	}
	cout<<"利用最佳置换算法得到的缺页次数为:"<<lose<<" "<<"缺页率为:"<<((double)lose/(N-M))*100<<"%"<<endl;
}
//采用最近最久未使用淘汰算法LRU 
void LRU(int page[],int N,int M,int memory[]){
	int lose=0;
	int i,j;
	int memory_time[100]={0}; 
	for(i=0;i<N;i++){
		//先让页面进入内存
		 if(i<=M-1){
		 	memory[i]=page[i];
		 	memory_time[i]++;
		 }
		 else{
		 	//先找有没有在内存里 
		for(j=0;j<M;j++){
			if(page[i]==memory[j])
			break;
		}
		if(j<M){
			for(int l=0;l<M;l++){
				if(l==j)
				memory_time[j]=0;
				else
				memory_time[l]++;
			}
			
			continue;
		}
		else{
			//没有在内存里,产生缺页
			lose++;
			int position=replace_LRU(memory_time,M);
			memory[position]=page[i];
			for(int l=0;l<M;l++){
				if(l==position)
				memory_time[position]=0;
				else
				memory_time[l]++;
			}		
		}
		 }
		
	}
	cout<<"利用最近最久未使用算法得到的缺页次数为:"<<lose<<" "<<"缺页率为:"<<((double)lose/(N-M))*100<<"%"<<endl;                                                                                                                                    	
}
int main(){
	//给定一个进程执行时的页面数N,进程拥有的内存块个数M
	 int N,M;
	 cout<<"请输入进程执行时的页面数:"<<endl;
	 cin>>N;
	 cout<<"请输入进程拥有的内存块个数:"<<endl;
	 cin>>M;
	 cout<<"请输入进程执行时页面访问的次序数组:"<<endl;
	 for(int i=0;i<N;i++)
	 cin>>page[i];
	 int memory[100];
	 OPT(page,N,M,memory);
	 LRU(page,N,M,memory);
	return 0;
} 

おすすめ

転載: blog.csdn.net/weixin_54438368/article/details/121742483