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

本文档详细介绍了分页内存管理的概念,包括逻辑地址与物理地址的划分,页号和页内偏移的计算。文章还阐述了物理块与内存分配的关系,并重点讨论了FIFO(先进先出)页面置换算法。当页面不在内存时,根据有无空闲物理块的情况采取不同的处理策略。给出了具体的算法思路和代码实现,包括页面状态的维护和页面调入调出的逻辑。代码中使用了结构体数组和队列数据结构来模拟内存状态。
摘要由CSDN通过智能技术生成

一:题目

先初始化页面大小,和物理块数。连续输入页面的逻辑地址,以“-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








在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天天向上的菜鸡杰!!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值