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
7-2 页面置换算法--LRU (50 分)相关推荐
- 7-1 页面置换算法--FIFO (50 分)(思路详解)
一:题目 先初始化页面大小,和物理块数.连续输入页面的逻辑地址,以"-1"作为结束标志,采用FIFO页面置换算法.固定分配局部置换分配策略.输出该页面的页号和页内位移,若该页不在内 ...
- 页面置换算法-LRU
页面置换算法-LRU实验报告 目录 原创性声明 1 项目描述 2 系统结构分析 3 系统详细设计 4 系统主要算法 5 系统程序实现 6课程设计总结 附录:源程序 原创性声明 参考文献 <面向对 ...
- 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法
操作系统之虚拟存储管理 实验内容:模拟请求分页虚拟存器管理技术中的硬件地址变换.缺页中断以及页式淘汰算法,处理缺页中断. 实验目的:清楚认识请求分页管理. 最佳(Optimal)置换算法 其所选择的被 ...
- 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
一,LRU算法介绍 LRU是内存分配中"离散分配方式"之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中, ...
- 操作系统页面置换算法(最佳置换算法,FIFO,LRU,Clock)
页面置换算法 为什么要页面置换 最佳置换算法 先进先出页面置换算法 LRU置换算法 Clock置换算法 为什么要页面置换 缺页中断: 在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断 ...
- OS- -内存之页面置换算法
OS- -内存之页面置换算法 文章目录 OS- -内存之页面置换算法 一.内存之页面置换算法 1.最优页面置换算法 2.最近未使用页面置换算法 3.先进先出页面置换算法 4.第二次机会页面置换算法 5 ...
- 操作系统实验2—页面置换算法模拟程序设计
一.实验目的 对页面置换做进一步的理解. 了解页面置换的任务. 通过编程掌握页面置换算法及缺页率计算. 了解Belady现象和抖动现象. 二.实验内容 输入给出一组页面访问顺序(如页面走向是1.2.5 ...
- 内存管理之页面置换算法
前面我们提到了关于内存管理的一些知识,交换技术和虚拟内存是两种常用的处理内存过载的办法.对于虚拟内存,进行换入换出的基本单位是页面.当进程访问的页面没有被映射到内存时,操作系统必须在内存中选择一个页面 ...
- 操作系统 页面置换算法模拟
据实验作业挑选了几种页面置换算法进行实验.(仅个人理解 1.先进先出页面置换算法(FIFO). 2.最近最久未被使用页面置换算法(LRU). 3.最佳页面置换算法(OPT). 4.最少使用页面置换算法 ...
最新文章
- 2018-10:自考总结
- 用Spring的BeanUtils前,建议你先了解这几个坑!
- Windows和Linux系统下,虚拟环境安装的全面说明和详细步骤
- 【leetcode】 算法题1 两数之和
- 给数据中心来个例行“体检”——动力系统
- mysql查询 伪列_Mysql数据库查询到的数据设置伪列显示
- mysql 存储过程乱码的问题
- C语言再学习 -- 循环语句
- pearsonr() python_十分钟搞懂“Python数据分析”
- [vue] 如果现在让你从vue/react/angularjs三个中选择一个,你会选哪个?说说你的理由
- android删除键监听,「React Native」Android返回键监听
- Keras——用Keras搭建自编码神经网络(AutoEncoder)
- 人脸方向学习(九):Face Detection-MTCNN解读
- 下载论文的tex模板
- android 糖果条纹进度条,小破站别出心裁,咒术回战进度条是高专纽扣,堀与宫村是糖果...
- 阳历转阴历,阳历转中国农历
- 科技爱好者周刊:第 72 期
- Python利用adb命令操作安卓手机批量打电话
- 01.基于Irises的springboot项目框架(简版)
- 用canvas画了个多啦A梦
热门文章
- 7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据
- [转]Xdebug----Failed loading
- [转]再见 NoSQL!
- [转]分布式事务之TCC服务设计和实现注意事项
- Python3.6学习笔记(五)
- ArcGIS10.6中,在3D分析工具中创建视线之后,怎么将其删除?
- 【空间数据库技术】ArcSDE 10.1安装配置与企业级地理空间数据库的建立及连接
- 谷歌浏览器之如何快速找到js、css等文件
- ubuntu下amd超频工具_Ubuntu16.04 版预装AMD GPU驱动【最新版】_Linux_Ubuntu-云市场-阿里云...
- 外圆内方与外方内圆的奇妙变换!