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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!

文章目录一、等价类划分法1、定义2、等价类划分法步骤3、设计测试用例步骤4、案例&#xff1a;学生选修课程二、边界值分析法1、边界值分析法概述2、设计测试用例3、边界值设计原则三、错误推测法1、错误推测法概述2、错误推测法基本思想四、因果图设计法1、因果图设计法概述2、…

使用Jenkins来发布和代理.NetCore项目

Back toStudy!注&#xff1a;书接上文&#xff0c;上回《【CI/CD系列】使用Docker安装Jenkins》咱们说到了使用Docker镜像的方式&#xff0c;来建立Jenkins服务&#xff0c;用来持续集成和持续发布项目&#xff0c;但是上一篇文章有两个问题&#xff1a;01创建的容器不能操作和…

数据库课设(足球联赛管理系统)

一&#xff1a;前言 如果有关注博主的粉丝&#xff0c;可能会发现贴心杰又缺更好几天了&#xff0c;但是我是宠粉杰啊&#xff0c;怎么可能会忘了我的宝贝粉丝呢&#xff0c;只不过是临近期末&#xff0c;各种大作业课设如期而至&#xff0c;这几天我在写数据库课设&#xff0…

.NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中

前言笔者最近在开发和维护一个.NET Core 项目&#xff0c;其中使用几个非常有意思的.NET Core 相关的扩展&#xff0c;在此总结整理一下。EF Core 性能调优如果你的项目中使用了 EF Core, 且正在处于性能调优阶段&#xff0c;那么了解 EF Core 生成的 SQL 语句是非常关键的。那…

695.岛屿的最大面积(026)BFS

二:思路 1.这里的遍历数据方式为BFS广度遍历 2.当我们遇到一个‘1’的时候,我们就遍历他的左右上下&#xff08;邻接点&#xff09;&#xff0c;如果是1那就入队&#xff0c;直到队列 为空为止。 3.我们记录每个岛屿的面积是采用 我们设置初始值为1&#xff0c;当每遇到一个邻…

『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径

项目进度安排与跟踪一、项目进度安排的定义及原则1、进度安排的定义2、进度安排的基本原则二、通信开销1、通信开销的定义2、通信路径计算3、案例分析三、工作量分配1、40-20-40规则2、工作量分配图例3、工作量分布推荐四、项目进度安排方法1、关键路径方法(CPM,Critical Path …

await,async 我要把它翻个底朝天,这回你总该明白了吧

一&#xff1a;背景1. 讲故事await&#xff0c;async 这玩意的知识点已经被人说的烂的不能再烂了&#xff0c;看似没什么好说的&#xff0c;但我发现有不少文章还是从理论上讲述了这两个语法糖的用法&#xff0c;懂得还是懂&#xff0c;不懂的看似懂了过几天又不懂了&#xff0…

栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!

详解栈在前端中的应用一、栈是什么二、栈的应用场景三、前端与栈&#xff1a;深拷贝与浅拷贝1、JS数据类型&#xff08;1&#xff09;js数据类型的分类&#xff08;2&#xff09;js数据类型的定义和存储方式&#xff08;3&#xff09;js数据类型的判断方式2、深究浅拷贝和深拷贝…

计网课设 模拟实验拓扑

一:前言 幸福的是考完两科了&#xff0c;抽出时间赶紧赶赶课设&#xff0c;两周遇到了好多事&#xff0c;开心的&#xff0c;烦心的&#xff0c;一堆堆的压过来&#xff0c;但庆幸自己迷失不太久&#xff0c;又能继续学习了 二&#xff1a;实验概览 1:实验拓扑图 2:实验要求…

快醒醒,C# 9 中又来了一堆关键词 init,record,with

一&#xff1a;背景1. 讲故事.NET5 终于在 2020-08-25 也就是前天发布了第八个预览版&#xff0c;这么多的预览版搞得我都麻木了&#xff0c;接踵而来的就是更多的新特性加入到了 C# 9 中&#xff0c;既然还想呆在这条船上&#xff0c;得继续硬着头皮学习哈&#xff0c;这一篇跟…

7-1 字母统计图 (10 分)(思路+详解)

一&#xff1a;题目 摆放在面前的是一小段英文文章。 afeng希望你能帮他统计一下每个小写字母出现的次数。 最后再以柱状图的形式(参照输出样例)输出出来。 输入格式: 输入第一行为一个正整数N(N<100)&#xff0c;表示文章的行数。 随后为N行文本。 输出格式: 由若干行组…

了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

js基础知识中的作用域和闭包一、作用域1、作用域、自由变量简介&#xff08;1&#xff09;作用域定义&#xff08;2&#xff09;作用域实例演示&#xff08;3&#xff09;自由变量定义&#xff08;4&#xff09;自由变量实例演示2、作用域链简介&#xff08;1&#xff09;作用域…

张朝阳一天只睡4小时?不知道,反正我每天都睡足7小时

这是头哥侃码的第213篇原创周末&#xff0c;一个很久没联系过的朋友突然在微信上发给我一个链接。我打开一看&#xff0c;原来是搜狐老板张朝阳近日发表的一个有关睡眠的神论&#xff0c;大致是说他每天只睡四小时&#xff0c;白天状态还特别好&#xff0c;每天员工到公司的时候…

Istio 1.7——进击的追风少年

2020 年 8 月 21 日&#xff0c;Istio 发布了 1.7 版本。除了介绍新版本的主要更新内容外&#xff0c;本文会重点分析 Istio 团队在产品更新策略上的激进态度和举措。是稳扎稳打做好向后兼容&#xff0c;带给用户所承诺的易用性&#xff1b;还是快刀斩乱麻&#xff0c;做进击的…

7-2 港口审查 (15 分)

一:题目 afeng是一个港口的海关工作人员&#xff0c;每天都有许多船只到达港口&#xff0c;船上通常有很多来自不同国家的乘客。 afeng对这些到达港口的船只非常感兴趣&#xff0c;他按照时间记录下了到达港口的每一艘船只情况&#xff1b;对于第i艘到达的船&#xff0c;他记…

【BCVP更新】StackExchange.Redis 的异步开发方式

有哪些习惯坚持LESS IS MORE,SIMPLER IS BETTER THAN MORE你一定会有很大的收获各种小问题&#xff1f;如果你之前用过Redis的话&#xff0c;肯定会使用过StackExchange.Redis&#xff0c;我之前很久就用过&#xff0c;在.netfw的时候&#xff0c;当时并发还比较小&#xff0c;…

map容器实现一对多

一&#xff1a;需求描述 我们希望一个数字或则其他字符串可以对应 一串数&#xff0c; #include<iostream> #include<map> #include<vector> using namespace std; int main(){map<int,vector<int> > m;map<int,vector<int> >:: i…

解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!

解决异步问题——promise、async/await一、单线程和异步1、单线程是什么2、为什么需要异步3、使用异步的场景二、promise1、promise的三种状态2、三种状态的表现和变化&#xff08;1&#xff09;状态的变化&#xff08;2&#xff09;状态的表现3、then和catch对状态的影响&…

使用 Visual Studio 2019 批量添加代码文件头

应用场景介绍在我们使用一些开源项目时&#xff0c;基本上都会在每个源代码文件的头部看到一段版权声明。一个项目或解决方案中源代码文件的个数少则几十&#xff0c;多则几千甚至更多&#xff0c;那么怎么才能给这么多文件方便地批量添加或者修改一致的文件头呢&#xff1f;在…

7-3 模板题 (10 分)(思路+详解)

一:题目 二&#xff1a;思路 1.读题读不懂&#xff0c;那就分析给出的示例&#xff0c;本题意思就是给出一串数&#xff0c;然后找出找出该元素之后&#xff0c;第一个大于 该元素的下标&#xff08;这一串数的下标是从一开始的&#xff09;如果找不到比起大的&#xff0c;那就…