7-2 页面置换算法--LRU (50 分)

一:题目(思路+详解+运行时错误解决)

先初始化页面大小,和物理块数。连续输入页面的逻辑地址,以“-1”作为结束标志,采用LRU页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移,若该页不在内存,并且还有剩余的物理块,将该页调入内存,输出“该页不在内存中,调入!”输出当前在内存的物理块号和对应的页号(若当前物理块为空,则输出void);若该页不在内存,并且没有剩余的物理块,按照FIFO算法选择一页调出后将该页调入内存,输出“已无空闲物理块,置换!”并输出当前在内存的物理块号和对应的页号(若当前物理块为空,则输出void)。

输入格式:
输入页面大小和物理块数,连续输入页面的逻辑地址,以“-1”作为结束标志。

输出格式:
第一行输出页号和页内偏移,第二行若不在内存,按照要求输出提示,若在内存则什么都不输出,随后输出“物理块号 页号”,再连续输出每个逻辑地址页面的物理块号和页内位移,以及当前内存的物理块号和页号的对应关系。请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例1:
在这里给出一组输入。例如:

1024 3
1
-1

结尾无空行
输出样例1:
在这里给出相应的输出。例如:

页号:0 页内偏移:1
该页不在内存中,调入!
物理块号 页号
0 0
1 void
2 void
结尾无空行

输入样例2:
在这里给出一组输入。例如:

1024 3
1
1056
2096
3175
-1

结尾无空行
输出样例2:
在这里给出相应的输出。例如:

页号:0 页内偏移:1

该页不在内存中,调入!
物理块号 页号
0 0
1 void
2 void
页号:1 页内偏移:32
该页不在内存中,调入!
物理块号 页号
0 0
1 1
2 void
页号:2 页内偏移:48
该页不在内存中,调入!
物理块号 页号
0 0
1 1
2 2
页号:3 页内偏移:103
已无空闲物理块,置换!
物理块号 页号
0 3
1 1
2 2

二:思路

思路:
1.基本和上道题一样,但是我们在处理这个页面置换算法的时候用的是 LRU
最近最久未使用的思想进行置换页面
2.这个算法每次处理的置换页面号,我们依然用队列进行处理,但是我们要注意的是我们在结构体数组当中加入了新的变量来记录优先级,而且我们在给这个优先级进行赋值的时候,我们是设置的一个全局变量,让其逐级递增,只要是后面出现过的元素,那么他们的优先级就越高

debug:解决运行时错误
1.将int类型转换成string类型没问题
2.[178781373];非结构体数组范围问题
3.最后一行有空行无问题
4.将优先队列换成其他方法

三:上码(重写sort方法 PTA 通过版 )

/**
 	思路: 
 		1.基本和上道题一样,但是我们在处理这个页面置换算法的时候用的是 LRU 
		  最近最久未使用的思想进行置换页面  
		2.这个算法每次处理的置换页面号,我们依然用队列进行处理,但是我们要注意的是
		  我们在如果这个页号已经在内存中存在,那么就要就要将其
		
		debug:解决运行时错误 
		  1.将int类型转换成string类型没问题
		  2.[178781373];非结构体数组范围问题
		  3.最后一行有空行无问题                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        z 
*/ 



#include<bits/stdc++.h>
using namespace std;

int N,M;//N代表页面大小 M代表物理块数
int cnt = 0;

struct Node{
	int block;  //块 
	string page; //页 
	int priority;//优先级 
}node[100];

bool sort_priority(Node a,Node b){
	return a.priority < b.priority;
} 

void printSate(){
	cout << "物理块号 页号" << endl;
	
	for(int i = 0; i < M; i++){  
	
		for(int j = 0;  j < M; j++){
			if(i == node[j].block){
				cout << node[j].block << ' ';
				cout << node[j].page << endl;	
			}	
		}
	}	 
} 

void outResult(int address){
	
	int pageNumber = address/N;    //页号 
	int pageMigration = address%N; //页内偏移	
	stringstream st; //这是为了将int类型转换成  string 类型 
	st << pageNumber;
	string str = st.str(); 
	int temp1 = 0,temp2 = 0;
	
	cout << "页号:"<< pageNumber <<" 页内偏移:" << pageMigration << endl;
	
	//遍历内存的物理块中是否有该页号
	for(int i = 0; i < M; i++){
		if(node[i].page == str){
			temp1 = 1;		
		}
		if(node[i].page == "void"){ //统计有空闲的位置 
			temp2++;	
		}
	}  
	
	//在内存的时候 
	if(temp1 == 1){
		
		cnt++;
		
		//这个时候因为块中已有该页  我们遍历整个结构体数组 找到  该页号  将新的优先级赋值给它
		for(int i = 0; i < M; i++){
			if(node[i].page == str){
				node[i].priority = cnt;
			}
		}
				
		sort(node,node+M,sort_priority);//按照优先级重新排序 				
		printSate();	
	}
	
	//不在内存的时候 ,且内存中还有空间 
	if(temp1 == 0 && temp2 > 0){
		cout << "该页不在内存中,调入!" << endl;
		
		//更新物理块中的页号状态 
		for(int i = 0; i < M; i++){
			if(node[i].page == "void"){			
				node[i].page = str;	
				cnt++;
				node[i].priority = cnt;
				
				break;
			}		
		} 	
		
		sort(node,node+M,sort_priority);//按照优先级重新排序 
		printSate();	
	}	
	
	//当不在内存的时候,内存中没有空间
	if(temp1 == 0 && temp2 == 0){	
	
		cout << "已无空闲物理块,置换!" << endl;	
			
		cnt++; 
		
		//这个时候就覆盖结构体数组当中的首个元素的  页号
		node[0].page = str;
		node[0].priority = cnt; 
		 
		sort(node,node+M,sort_priority);//按照优先级重新排序 		
	
		printSate();
	} 	 
}

int main(){

	int logicAddress;
	
	cin >> N >> M;
	for(int i = 0; i < M; i++){
		node[i].block = i;
		node[i].page = "void";		
	}
	
	while(1){		
		cin >> logicAddress;
		if(logicAddress != -1){
		 outResult(logicAddress);
		}else{
			break;
		}		
	}
	
} 

//1024 3
//1
//1056
//2096
//3175
//-1




在这里插入图片描述

四:PTA显示运行时错误(但算法没问题)

这个是显示运行时错误,我在其中用了优先队列,如果你看过我前面几篇博客的话,我在分支限界当中,用的也是优先队列,所以在做这道题的时候,考虑到优先级的问题,我就自然而然想到了用优先队列来做,但是我是万万没想到,用优先队列会出现运行时错误,查阅资料显示 优先队列有时会抛出异常,我觉得可能是这个原因。但还是记录错误码 毕竟也是劳动成果!!

/**
 	思路: 
 		1.基本和上道题一样,但是我们在处理这个页面置换算法的时候用的是 LRU 
		  最近最久未使用的思想进行置换页面  
		2.这个算法每次处理的置换页面号,我们依然用队列进行处理,但是我们要注意的是
		  我们在如果这个页号已经在内存中存在,那么就要就要将其
		
		debug:解决运行时错误 
		  1.将int类型转换成string类型没问题
		  2.[178781373];非结构体数组范围问题
		  3.最后一行有空行无问题                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        z 
*/ 



#include<bits/stdc++.h>
using namespace std;

int N,M;//N代表页面大小 M代表物理块数
int cnt = 0;

struct Node{
	int block;  //块 
	string page; //页 
	int priority;//优先级 
}node[100];

bool operator<(const Node& a,const Node& b){
	return a.priority > b.priority;
} 

priority_queue<Node>q;

void printSate(){
	cout << "物理块号 页号" << endl;
	
	for(int i = 0; i < M; i++){  
		cout << node[i].block << ' ';
		cout << node[i].page << endl;
	}	 
} 

void outResult(int address){
	
	int pageNumber = address/N;    //页号 
	int pageMigration = address%N; //页内偏移	
	stringstream st; //这是为了将int类型转换成  string 类型 
	st << pageNumber;
	string str = st.str(); 
	int temp1 = 0,temp2 = 0;
	
	cout << "页号:"<< pageNumber <<" 页内偏移:" << pageMigration << endl;
	
	//遍历内存的物理块中是否有该页号
	for(int i = 0; i < M; i++){
		if(node[i].page == str){
			temp1 = 1;		
		}
		if(node[i].page == "void"){ //统计有空闲的位置 
			temp2++;	
		}
	}  
	
	//在内存的时候 
	if(temp1 == 1){
		
		cnt++;
		
		//这个时候因为块中已有该页  我们遍历整个结构体数组 找到  该页号  将新的优先级赋值给它
		for(int i = 0; i < M; i++){
			if(node[i].page == str){
				node[i].priority = cnt;
			}
		}
		
//		cout << "*****************" << endl;
//		for(int i = 0; i < M; i++){
//			cout << node[i].priority << endl;
//		}
//		
		
		//更新node[i]中的优先级,因为这时候,优先队列中的结点的优先级是跟结构体中优先级是不一致的
		for(int i = 0; i < M; i++){
			
			Node node2 = q.top(); q.pop();
			
			int num1 = node2.block; 
			int num2 = node2.priority; 
			
			for(int i = 0; i < M; i++){ //我们更新优先队列中的结点的优先级,同时当出现重复页号的时候,这时就要更新结构体中的块号所对应的优先级 
				if(num1 == node[i].block && node[i].page != str){//我们刚更新的页的优先级是 比不需要用队列中的优先级更新的,因为比队列中的优先级要高 
					   node[i].priority = num2; 
				}
			}
		}
		
		for(int i = 0; i < M; i++){
			q.push(node[i]);
		}
			
//		cout << "********************" << endl; 
//		while(!q.empty()){
//			Node node2 = q.top(); q.pop();
//			cout << node2.block <<' '<< node2.page <<" "<< node2.priority << endl;
//		} 
			
		printSate();	
	}
	
	//不在内存的时候 ,且内存中还有空间 
	if(temp1 == 0 && temp2 > 0){
		cout << "该页不在内存中,调入!" << endl;
		
		//更新物理块中的页号状态 
		for(int i = 0; i < M; i++){
			if(node[i].page == "void"){			
				node[i].page = str;	
				cnt++;
				node[i].priority = cnt;
				q.push(node[i]);
				break;
			}		
		} 	
		printSate();	
	}	
	
	//当不在内存的时候,内存中没有空间
	if(temp1 == 0 && temp2 == 0){	
	
		cout << "已无空闲物理块,置换!" << endl;	
		
		Node newnode = q.top(); 
		q.pop();
		
		cnt++; 
		
		Node node1; 		
		node1.block = newnode.block; //淘汰页面的块号 也是新来页号的块号 
		node1.page = str;//新来页号 
		node1.priority = cnt; //新统计的页号优先级最高 
	
		q.push(node1);
		
		for(int i = 0; i < M; i++){
			if(node1.block == node[i].block){ //根据物理块号更新 新的页号 
				node[i].page = str;
			}
		} 
	
		printSate();
	} 	 
}

int main(){

	int logicAddress;
	
	cin >> N >> M;
	for(int i = 0; i < M; i++){
		node[i].block = i;
		node[i].page = "void";		
	}
	
	while(1){		
		cin >> logicAddress;
		if(logicAddress != -1){
		 outResult(logicAddress);
		}else{
			break;
		}		
	}
	
} 

//1024 3
//1
//1056
//2096
//3175
//-1

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天天向上的菜鸡杰!!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值