7-1 页面置换算法--FIFO (50 分)(思路详解)

一:题目

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

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

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

输入样例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.为什么分页? 我们之前学的连续分配方式中,对内存的空间利用并不合理,所以我们采用
分页这种离散的方式分配内存(离散体现在页表的地址映射当中)

2.分页:分页储存管理将进程的逻辑地址空间分为若干的页,并为每页加以编号,从0开始
如,第0页,第1页
物理块:把内存的物理地址空间分为若干个块,也为他们加以编号,在为进程分配内存的时候
以块为单位,将进程中的若干页分别加入到多个可以不相链接的的物理块中

3.页号:逻辑地址对页面大小 取整
页内地址也就是业内偏移:逻辑地址对页面大小取余
4.进程的运行当中,若其发现所要访问的页面不在内存中,则产生缺页中断。
当发生缺页中断时,
<1>:如果内存中还有剩余的物理块,那就将该页调入内存
<2>:如果内存中没有剩余的物理块, 那就采用页面置换算法
即操作系统必须在内存选择一个页面将其移出内存,将其移到外存对换区上,
以便为即将调入的页面让出空间,而用来选择淘汰哪一页的规则叫做页面置换算法

5.如果刚移出的页面,内存马上又要用了,这时又需要页面置换,那么这是我们最不想要的
结果,所以我们在移除页面的时候,就需要一种算法来选择移除的页面

写码构思:
1.那么我们该如何写码呢? ,通过分析数据我们可以得出,除了第一行的初始化,下面的每一行
输入,我们都要进行相应的判断和输出,那么就说明我们得创建一个函数专门处理这些,同时
很明显,函数的参数就是我们每次输入的逻辑地址
2.这里该如何初始化我们的数据结构呢?我选择的是结构体数组,可以存多组数组!

三:上码

/**	算法思路: 1.为什么分页? 我们之前学的连续分配方式中,对内存的空间利用并不合理,所以我们采用分页这种离散的方式分配内存(离散体现在页表的地址映射当中) 2.分页:分页储存管理将进程的逻辑地址空间分为若干的页,并为每页加以编号,从0开始如,第0页,第1页物理块:把内存的物理地址空间分为若干个块,也为他们加以编号,在为进程分配内存的时候以块为单位,将进程中的若干页分别加入到多个可以不相链接的的物理块中3.页号:逻辑地址对页面大小 取整页内地址也就是业内偏移:逻辑地址对页面大小取余4.进程的运行当中,若其发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,<1>:如果内存中还有剩余的物理块,那就将该页调入内存 <2>:如果内存中没有剩余的物理块, 那就采用页面置换算法 即操作系统必须在内存选择一个页面将其移出内存,将其移到外存对换区上,以便为即将调入的页面让出空间,而用来选择淘汰哪一页的规则叫做页面置换算法5.如果刚移出的页面,内存马上又要用了,这时又需要页面置换,那么这是我们最不想要的结果,所以我们在移除页面的时候,就需要一种算法来选择移除的页面写码构思:1.那么我们该如何写码呢? ,通过分析数据我们可以得出,除了第一行的初始化,下面的每一行输入,我们都要进行相应的判断和输出,那么就说明我们得创建一个函数专门处理这些,同时很明显,函数的参数就是我们每次输入的逻辑地址2.这里该如何初始化我们的数据结构呢?我选择的是结构体数组,可以存多组数组!   */#include<bits/stdc++.h>
using namespace std;struct Node{int block;  //块 string page; //页 
}node[100];int N,M;//N代表页面大小 M代表物理块数
queue<int>q1;
queue<string>q2;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){printSate();	}//不在内存的时候 ,且内存中还有空间 if(temp1 == 0 && temp2 > 0){cout << "该页不在内存中,调入!" << endl;//更新物理块中的页号状态 for(int i = 0; i < M; i++){if(node[i].page == "void"){			node[i].page = str;	q1.push(node[i].block);q2.push(node[i].page); break;}		} 	printSate();	}	//当不在内存的时候,内存中没有空间if(temp1 == 0 && temp2 == 0){	cout << "已无空闲物理块,置换!" << endl;	int bk = q1.front();  q1.pop();string page = q2.front(); q2.pop(); //将队列当中的首个元素移除 q2.push(str);//将新的页号入队q1.push(bk);//其物理块号是固定不变的 for(int i = 0; i < M; i++){if(node[i].block == bk) {//这里就是我们根据物理块号更新 页号状态 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/308059.shtml

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

相关文章

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

一:题目(思路详解运行时错误解决) 先初始化页面大小&#xff0c;和物理块数。连续输入页面的逻辑地址&#xff0c;以“-1”作为结束标志&#xff0c;采用LRU页面置换算法、固定分配局部置换分配策略。输出该页面的页号和页内位移&#xff0c;若该页不在内存&#xff0c;并且还…

『软件测试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;在…