【操作系统】操作系统实验03-页面置换算法

news2025/1/18 21:05:59

题目要求:

先读懂实验文档中的两个页面置换算法,参考文档中程序,实现以下要求:

假设某个进程P有6个页面,进程访问页的顺序自拟(不少于20个),在内存中分配给该进程4个页面,编写程序,给出缺页中断次数和页面的淘汰顺序。

一、FIFO 页面置换算法

1. 程序代码(注意程序格式)

1.#include <stdio.h>
2.
3.void main(){
4.	int num = 0;//缺页中断数量 
5.	char Y_N[26];//进程访问页有25个,Y表示产生缺页中断,N表示未产生缺页中断
6.	int a[25]={ 1,2,3,4,1,
7.				2,5,1,2,3,
8.				4,5,6,1,2,
9.				4,6,3,2,5,
10.				4,6,3,2,1};//页面的调度顺序
11.	int b[4][26],c[26],p = 0;//在内存中分配给该进程4个页面,b中存放3个页面的25次页面调度的页面情况。c数组中存放页面的淘汰顺序,p为c数组的指针
12.	for(int i = 0; i <= 3; i++){//C语言定义数组,其初值是不确定的
13.		b[i][0] = 0;
14.	}
15.	
16.	printf("   ");
17.	for(int i = 0; i < 25; i++)
18.		printf("%3d",a[i]);
19.	printf("\n ==========================================================================================\n");
20.	
21.	for(int i = 0;i < 25; i++){ 
22.		if(a[i] == b[0][i] || a[i] == b[1][i] || a[i] == b[2][i] || a[i]==b[3][i]){
23.			for(int j = 0; j <= 3; j++){
24.				b[j][i + 1] = b[j][i];
25.			}
26.			Y_N[i] = 'N';
27.		}
28.		else{
29.			if(i > 3){
30.				c[p] = b[3][i];
31.				p++; 
32.			}
33.			b[0][i+1] = a[i];
34.			for(int j = 0; j <= 2; j++){
35.				b[j + 1][i + 1] = b[j][i];
36.			}
37.			Y_N[i]='Y';
38.			num++;
39.		} 
40.	}
41. 
42.	
43.	for(int i = 0; i <=3; i++){
44.		for(int j = 0; j < 26; j++){
45.			printf("%3d", b[i][j]);
46.		}
47.		printf("\n ------------------------------------------------------------------------------------------\n");
48.	}
49.	
50.	printf("   ");
51.	for(int i = 0; i < 26; i++){//打印是否产生缺页中断
52.		printf("  ");
53.		putchar(Y_N[i]);
54.	}
55.	
56.	printf("\n Number of page breaks: %3d\n",num);
57.	printf(" Page elimination order: ");
58.	for(int i = 0;i < p;i++)
59.		printf("%3d",c[i]);
60.	printf("\n\n");
}

2. 运行结果截图

3. 总结

在FIFO 算法的请求页式管理中,当发生缺页中断且主存没有空闲页面时,总是淘汰最先进入主存的页面,即选择在主存中驻留时间最久的页面被淘汰。

算法思路:假设进程访问页有m个,在内存中分配给该进程n个页面,开辟一个大小为m*n的数组空间,存储每次访问页的内存情况。遍历进程访问页序列,若当前页不在内存中且内存中有空闲页面(前n个进入的页),则记为缺页中断一次,并将内存中后(n-1)个页面前移一位,并将最新的页放入其中;若当前页不在内存中且内存中无空闲页面,则额外将移出的一位存至队列中;若当前页在内存中,则页面不进行移动,原样复制。

FIFO 算法是一种直观但性能较差的页面置换算法,可能会有BELADY现象,即分配的页面数增加时,缺页中断次数反而增加。

二、LRU 页面置换算法

1. 程序代码(注意程序格式)

1.#include <stdio.h>
2.
3.void max_value(int x, int cc[][2]);
4.int r_algorithm(int cc[][2]);
5.char cc[26];//进程访问页有25个
6.int max = 0;
7.
8.void main(){ 
9.	int page, row = 0, col = 1; //b[row][col],行/列指针
10.	int k = 0; //记录缺页中断次数
11.	int a[25]={ 1,2,3,4,1,
12.				2,5,1,2,3,
13.				4,5,6,1,2,
14.				4,6,3,2,5,
15.				4,6,3,2,1}; //存放页的调度顺序
16.	int b[4][26] = {0}; //模拟内存(分配四个页面)
17.	int c[6][2] = {{1,0},{2,0},{3,0},{4,0},{5,0},{6,0}}; //定义页表并赋初值
18.	int d[26], p = 0; //存放页面淘汰顺序,p页面淘汰数组 d的指针 
19.
20.	//*************************页面调度处理************************
21.	for(int i = 0; i < 25; i++){ 
22.		if(a[i] == b[0][i] || a[i] == b[1][i] || a[i] == b[2][i] || a[i] == b[3][i]){ 
23.			for(int j = 0; j <= 3; j++){//将前一列数据复制到下一列
24.				b[j][i + 1] = b[j][i];
25.			}
26.
27.			max_value(a[i],c); //将页面置为最新访问的页面
28.			cc[i]='F';
29.			col++;
30.		}
31.		else{//页面不在内存
32.			if(row > 3){//内存已没有空闲页面
33.				page = r_algorithm(c); //返回淘汰的页面 page
34.				d[p] = page; //d[]存放被淘汰的页面
35.				p++;
36.				k++; //缺页中断次数
37.				for(int j = 0; j <= 3; j++){//将前一列数据复制到下一列
38.					b[j][i + 1] = b[j][i];
39.				}
40.				cc[i]='Y';
41.				
42.				for(int j = 0; j <= 3; j++){
43.					if(b[j][i + 1] == page){
44.						b[j][i + 1] = a[i];
45.						break;
46.					}
47.				} 
48.				max_value(a[i],c); //将页面置为最新访问的页面
49.			}
50.			else{
51.				for(int j = 0; j <= 3; j++){//将前一列数据复制到下一列
52.					b[j][i + 1] = b[j][i];
53.				}
54.				cc[i]='Y';
55.				k++; //缺页中断次数
56.				
57.				b[row][col] = a[i]; //a[i]页面进入内存
58.				col++;
59.				row++;
60.				
61.				max_value(a[i],c); //将页面置为最新访问的页面
62.			}
63.		}
64.	} 
65.	//======================显示处理结果=====================
66.	printf("\n   ");
67.	for(int i = 0; i < 25; i++)
68.		printf("%3d",a[i]); //显示页面调度顺序
69.	printf("\n ===============================================================================\n");
70.	
71.	for(int i = 0; i <= 3; i++){
72.		for(int j = 0; j < 26; j++){
73.			printf("%3d", b[i][j]);
74.		}
75.		printf("\n -------------------------------------------------------------------------------\n");
76.	}
77.
78.	printf("   ");
79.	for(int i = 0; i < 26; i++){//打印是否产生缺页中断
80.		printf("  ");
81.		putchar(cc[i]);
82.	}
83.	printf("\n Number of page breaks: %3d",k);
84.	printf("\n Page elimination order: ");
85.	for(int i = 0; i < p; i++)
86.		printf("%3d",d[i]); //显示页面淘汰顺序
87.	printf("\n\n"); 
88.}
89.//============访问的页面在内存的处理(页表处理)===============
90.void max_value(int x, int c[][2]){//将页面置为最新访问的页面
91.	max++;
92.	for(int i = 0; i < 6; i++)
93.		if(c[i][0] == x){
94.			c[i][1] = max;
95.			break;
96.		}		
97.} 
98.//=============选择被淘汰的页面(页表处理)==================
99.int r_algorithm(int c[][2]){
100.	int i, min, row, p; 
101.	for(i = 0; i < 6; i++) //查询第一个计数为非 0 的页面的计数值
102.		if(c[i][1] != 0){
103.			min = c[i][1]; 
104.			p = c[i][0];
105.			row = i;
106.			break;
107.		}
108.	for(i = 0; i < 6; i++){ //寻找计数值最小的数页面
109.		if(min > c[i][1] && c[i][1] != 0){
110.			min = c[i][1];
111.			p = c[i][0]; //最小数所对应的页号被淘汰
112.			row = i; //记录最小数所在的行
113.		}
114.	}
115.	c[row][1] = 0; //在页表中被淘汰的页面计数清零
116.	return(p); //返回被淘汰的页面--P
}

2. 运行结果截图

3. 总结

在LRU 页面置换算法中,当某进程发生缺页中断且主存没有空闲页面时,选择离当前时间最近的一段时间内最久没有使用过的页被淘汰。

算法思路:

设计一种数据结构c[6][2]用于表示每个页面的调用时间。设max值为0,每进行一次页面调用,就将max的值加一并赋给当前调用的页面,此时每个页面数值的大小就代表了它们的调用时间。

遍历进程访问页序列,若当前页不在内存中且内存中有空闲页面(前n个进入的页),则记为缺页中断一次,并将前一列数据复制到下一列,然后将最新的页放入当前指针指向的内存中,并将页面置为最新访问的页面;若当前页不在内存中且内存中无空闲页面,则记为缺页中断一次,并将前一列数据复制到下一列,然后淘汰并替换数组c中对应数值最小的页面为新访问的一页,将移出的一页存至队列中,并将页面置为最新访问的页面;若当前页在内存中,则页面不进行移动,原样复制,然后将页面置为最新访问的页面。

实验中遇到的问题与解决方法:

问题1:一开始输出的模拟内存有问题,它的初始值并不为0:

解决方法:最终发现是因为存放模拟内存的数组b少申请了一个空间(要比调度的页的个数多一),将其改正后输出得以正常。

问题2:程序运行结果并不美观,虚拟机并不支持中文输出,并且代码存在着大量冗余。

解决方法:重新调整输出格式;修改精简思路:例如,将max变量修改为全局变量并赋初值0,这样一来,它的数值变化大小便可以直接反映页面调度时间,无需每次找出max的值再进行变化并赋值了。

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

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

相关文章

Blazor 中基于角色的授权

介绍 Blazor用于使用 .NET 代码库创建交互式客户端 Web UI。Microsoft 默认在 Blazor 应用程序中提供了一个用于身份验证和授权的身份框架。请注意&#xff0c;他们目前使用 MVC Core Razor 页面作为身份验证 UI。使用“Microsoft.AspNetCore.Identity.UI”包库来实现这一点。…

数据库大作业——音乐平台数据库管理系统

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; 《数据库系统》课程设计 &#xff1a;流行音乐管理平台数据库系统&#xff08;本数据库大作业使用软件sql server、dreamweaver、power designer&#xff09; 目录 系统需求设计 数据库概念结构设计 实体分析 属性分…

白酒:中国的酒文化的传承与发扬

中国&#xff0c;一个拥有五千年文明史的国度&#xff0c;其深厚的文化底蕴孕育出了丰富多彩的酒文化。在这片广袤的土地上&#xff0c;酒不仅仅是一种产品&#xff0c;更是一种情感的寄托&#xff0c;一种文化的传承。云仓酒庄的豪迈白酒&#xff0c;正是这一文化脉络中的一颗…

低代码专题 | 低代码开发平台怎么收费,价格多少?一文揭秘!

低代码开发平台近几年真的火得一塌糊涂&#xff0c;不少企业都开始关注并尝试这种新的开发方式。 然而&#xff0c;关于低代码开发平台的收费问题&#xff0c;却是众说纷纭、信息零散。为了帮助大家更清晰地了解低代码开发平台的收费情况&#xff0c;这篇文章将进行全面的解读…

leetcode498 对角线遍历

题目 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 解析 本题目主要考察的就是模拟法&#xff0c;首…

【深度学习驱动流体力学】VTK创建、处理和可视化流体数据

Visualization Toolkit&#xff08;VTK&#xff09;是一个强大的开源软件系统&#xff0c;用于处理和可视化三维数据。它提供了丰富的工具和算法&#xff0c;可以处理从简单的网格数据到复杂的流体动力学模拟数据等各种类型的数据。本文将完整介绍如何使用 VTK 创建、处理和可视…

教育与学习助手:Kompas AI革新学习体验

一、引言 在个性化学习需求日益增长的今天&#xff0c;教育领域正经历着一场技术革命。Kompas AI&#xff0c;作为一款先进的人工智能助手&#xff0c;正以其独特的功能和应用&#xff0c;为学习者提供个性化的学习支持&#xff0c;满足不同背景和需求的学生。 二、功能介绍 Ko…

通过编辑器工具改变Inspector锁定状态

是在看一系列视频的时候&#xff0c;看到的&#xff0c;感觉挺有用&#xff0c;就记录下来。 就是这个小锁的按钮&#xff0c;后续可以通过快捷键&#xff0c;快速锁定和解锁。代码里没有加入快捷键控制&#xff0c;有需要用到的可以自己加一下&#xff0c;比较简单 using Uni…

大模型学习路线,存下吧很难找全的

随着人工智能技术的飞速发展&#xff0c;大模型在自然语言处理、计算机视觉、推荐系统等领域取得了显著成果。越来越多的学者和开发者开始关注并投身于大模型的研究与应用。本文将以大模型学习路线为核心&#xff0c;为您介绍从入门到精通所需掌握的知识和技能。 一、入门篇 …

简单好用的C++日志库spdlog使用示例

文章目录 前言一、spdlog的日志风格fmt风格printf风格 二、日志格式pattern三、sink&#xff0c;多端写入四、异步写入五、注意事项六、自己封装了的代码usespdlog.h封装代码解释使用示例 前言 C日志库有很多&#xff0c;glog&#xff0c;log4cpp&#xff0c;easylogging, eas…

[Java基础揉碎]QQ聊天项目

多用户系统演示 项目开发流程 多用户通讯需求 通讯系统整体分析 用户登录 新建项目 在建一个项目 user类 加上序列化, 加上UID增加兼容性 message类 消息类型 新建一个接口 客户端也拷贝过来 新建包和菜单界面类 工具类 新建一个类 新建一个类 回到这个类 写成这个名…

【论文精读】树环水印Tree-Ring Watermarks:隐形且稳健的扩散图像的指纹

文章目录 一、文章概览&#xff08;一&#xff09;主要工作&#xff08;二&#xff09;相关工作 二、具体方法&#xff08;一&#xff09;威胁模型&#xff08;二&#xff09;树轮水印概述&#xff08;三&#xff09;构造树轮水印键&#xff08;四&#xff09;提取用于水印检测…

【unity笔记】四、Enviro- Sky and Weather插件使用

一、 简介 Enviro内置 RP、URP、HDRP&#xff0c;开箱即用。 动态天空 随附的天空系统经过精心设计&#xff0c;以实现最佳性能和灵活性。使用多种颜色渐变&#xff0c;而不是调整人工数字。为您的项目创建独特且非常逼真的天空非常简单&#xff01; 灯光 由 Enviro 控制的逼…

APMCM亚太地区大学生数学建模竞赛奖励细则

APMCM亚太地区大学生数学建模竞赛&#xff08;以下简称竞赛&#xff09;是由北京图象图形学学会、亚太地区大学生数学建模竞赛组委会主办的面向全日制普通高等院校在校学生的学科竞赛活动。根据竞赛的宗旨&#xff0c;为了切实提供有价值的奖励政策&#xff0c;鼓励广大师生参与…

6.深度卷积神经网络

目录 1.深度卷积神经网络ALexNet 2012AlexNetAlexNet架构AlexNet与LeNet复杂度对比总结代码实现2.使用块的网络VGG 2014 image竞猜第二VGG架构进度总结代码实现3.网络中的网络NiN全连接层的问题NiN块NiN架构总结代码实现4.含并行连结的网络(GoogLeNet)2014 image竞猜第一最好…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考&#xff1a; https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低&#xff0c;按照下面的步骤进行操作&#xff1a; 使用的硬件平台为Xavier NX&#xff0c;系统环境如下图&#xff1a; 搭建docker环境需求跟实际环境一致如下…

逻辑地址 线性地址 物理地址 Linux kernel 内存管理设计

linux kernel 2.6以后的MM&#xff0c;受到了兼容 risc arch cpu 的 MM 的启发&#xff0c;新的 MM 架构对 x86 上任务切换的效率上也有明显提高。 新的MM架构&#xff0c;GDT 不再随着进程的创建与结束而创建和删除 新的表项。 TSS段 也只有一个&#xff0c;进程切换时&…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

STM32 JTAG 模式和 SWD 模式的区别详解

在调试和编程 STM32 微控制器时&#xff0c;使用 JTAG&#xff08;Joint Test Action Group&#xff09;模式和 SWD&#xff08;Serial Wire Debug&#xff09;模式是两种常见的方法。它们在接口需求、调试能力、引脚数量、通信速度等方面各有特点。我们一般采用的的下载器如ST…

Window常用的脚本有哪些?快来看看有哪些是你正在用的!(欢迎评论补充~)

前言 在日常开发中&#xff0c;如果能熟练掌握以下这些使用频率很高的脚本&#xff0c;那工作起来真的是手拿把攥&#xff0c;事半功倍&#xff0c;接下来给大家介绍一些我们日常使用率很高的一些脚本&#xff01; 常用脚本(Batchfile & VBScript) 1.一键启动.bat 一次…