操作系统 实验三 虚拟页式存储管理(FIFO算法、LRU算法)

使用FIFO算法和LRU算法模拟虚拟页式存储管理

#include 
#include 
#include
using namespace std; 
const int MAXSIZE=1000;//定义最大页面数 
const int NUM=3;//定义页框数(物理块数)

typedef struct node{ 
	int loaded;   //记录该物理块存储的页面
	int time;     //记录该物理块没有被使用的时间
}page;

page pages[NUM]; //定义页框表 (物理块表)
int queue[MAXSIZE]; 
int quantity;

//初始化结构函数 
void initial(){ 
	int i; 
	for(i=0;i<NUM;i++){ 
		pages[i].loaded=-1; 
	} 
	for(i=0;i<MAXSIZE;i++){ 
		queue[i]=-1;
	} 
	quantity=0;
}

//读入页面流
void readData(){ 
	FILE *fp; 
	char fname[20];
	int i;
	cout<<"请输入页面流文件名:"; 
	cin>>fname;
	if((fp=fopen(fname,"r"))==NULL){ 
		cout<<"错误,文件打不开,请检查文件名"; 
	}else{ 
		while(!feof(fp)){ 
			fscanf(fp,"%d ",&queue[quantity]);
			quantity++; 
		} 
	} 
	cout<<"读入的页面流:"; 
	for(i=0;i<quantity;i++){
		cout<<queue[i]<<" ";
	} 
}

//FIFO调度算法
void FIFO() { 
	int i,j,p,flag;
	int absence=0;  //记录缺页次数
	p=0;
	cout<<endl<<"----------------------------------------------------"<<endl; 
	cout<<"先进先出调度算法(FIFO)页面调出流:"; 
	
	for(i=0;i<NUM;i++){  //前3个进入内存的页面
		int flag_f = 0;					//记录内存中是否存在页面 
		for(int j = 0; j < NUM; j++){			//执行检查操作 
			if(queue[i] == pages[j].loaded){			//如果内存中存在该页面 
				flag_f = 1;				//记录 
				break;							//跳出检查操作 
			}else{
				continue;						//否则继续检查 
			}
		}
		if(flag_f){				//如果内存中存在该页面,进入下一个页面 
			continue;
		}
		pages[p].loaded=queue[i];
		cout<<pages[p].loaded<<" ";			//前三个"缺页"输出 
		p=(p+1)%NUM;					//循环增1 	
	}
	if(p == 0){
		absence = 3;
	}else if(p == 2){
		absence = 2;
	}else if(p == 1){
		absence = 1; 
	}
	
	for(i=NUM;i<quantity;i++){ 
		flag=0; 
		for(j=0;j<NUM;j++){  //判断当前需求的页面是否在内存 
			if(pages[j].loaded==queue[i])	
				flag=1;  
		} 
		if(flag==0){ 
			if(pages[p].loaded == -1){				//如果内存中存在空位 
				cout << queue[i] << " ";
				pages[p].loaded = queue[i];
				p=(p + 1) % NUM;
				absence++;
			}else{ 								//内存中不存在空位,需要进行替换 
				cout<<pages[p].loaded<<" ";
				pages[p].loaded=queue[i]; 
				p=(p+1)%NUM; 
				absence++; 
			}
			
		}
	} 
	cout<<endl<<"总缺页数:"<<absence<<endl; 
}

//最近最少使用调度算法(LRU)
void LRU(){ 
	
	//请补充LRU算法的代码
	int i,j,k,p,flag;
	int absence=0;  //记录缺页次数
	p=0;
	cout<<endl<<"----------------------------------------------------"<<endl; 
	cout<<"最近最少使用调度算法(LRU)页面调出流:"; 
	for(i=0;i<NUM;i++){  //前3个进入内存的页面
		int flag_l = 0;						//记录内存中是否存在页面 
		for(j = 0; j < NUM; j++){			//检查 
			if(queue[i] == pages[j].loaded){
				flag_l = 1;
				pages[j].time = 0;
				break;
			}else{
				continue;
			}
		}
		if(flag_l){
			continue;
		}
		pages[p].loaded=queue[i];			//进入页面 
		cout<<pages[p].loaded<<" ";			//输出缺页 
		for(j=0;j<=p;j++){
			pages[j].time++;				//闲置时间增加 
		}
		p=(p+1)%NUM;		//循环增1 
	}
	if(p == 0){
		absence = 3;
	}else if(p == 2){
		absence = 2;
		pages[2].time = 4;				//上调空页面的替换优先级 
	}else if(p == 1){
		absence = 1;
		pages[1].time = 4;				//上调优先级 
		pages[2].time = 3;				//上调优先级 
	}
 
	for(i=NUM;i<quantity;i++){
		flag=0;
		for(j=0;j<NUM;j++){  //判断当前需求的页面是否在内存
			pages[j].time++;
			if(pages[j].loaded==queue[i]){		//如果存在内存中 
				flag=1; 
				pages[j].time=0;				//闲置时间置零 
			}
		}
		if(flag==0){ 					//如果不在内存中 
			int max=0;
			for(k=1;k<NUM;k++){			//比较闲置时间大小 
				if(pages[max].time<pages[k].time){ 
					max=k;
				} 
			}
			if(pages[max].loaded == -1){				//如果内存中存在空位 
				cout << queue[i] << " ";
				pages[max].loaded = queue[i];
				pages[max].time = 0;
				absence++;
			}else{
				cout<<pages[max].loaded<<" ";			//输出被替换掉的页面 
				pages[max].loaded=queue[i]; 			//替换页面 
				pages[max].time=0;						//最近被使用 
				absence++; 								//缺页数增加 
			}
		}
	}
	cout<<endl<<"总缺页数:"<<absence<<endl;
}


int main(){ 
	cout<<"     /**********虚拟存储管理器的页面调度**************/"<<endl;
	initial();
	readData();
	//FIFO();   
	LRU();
	return 0;
}

你可能感兴趣的:(操作系统,操作系统,操作系统实验,虚拟页式存储管理)