页面置换算法的模拟与比较

news2024/11/19 23:30:48

前言

在计算机操作系统中,页面置换算法是虚拟存储管理中的重要环节。通过对页面置换算法的模拟实验,我们可以更深入地理解虚拟存储技术,并比较不同算法在请求页式虚拟存储管理中的优劣。
随着计算机系统和应用程序的日益复杂,内存的管理成为一项关键任务。虚拟存储技术通过将程序的地址空间分成若干固定大小的页面,将物理内存和磁盘空间结合起来,提供了更大的可用内存空间。然而,由于内存空间有限,当程序需要访问一个不在内存中的页面时,就需要使用页面置换算法将某些页面从内存中换出,以便为新的页面腾出空间。这时候算法的重要性就凸显出来了.

代码实现

接下来就我们使用c来模拟这几种算法:

#include <stdio.h>

int const InsideCount = 3;
int count = 0;
int Inside[InsideCount]; // 分配的物理块数
int const PageCount = 12;
int Page[PageCount]; // 总的页面数
double lost = 0.0; // 缺页次数初值为8

// isInside函数用于检测页号num是否在内存的物理块中,
// 返回值为布尔类型,若在则返回true,否则返回false
bool isInside(int num) {
	for (int i = 0; i < InsideCount; i++) {
		if (Inside[i] == Page[num])
			return true;
	}
	return false;
}

void OPT(int num) {
	// 最佳置换算法(OPT)
	int max = 0;
	int maxchange; // 用max表示内存中的页号下一次出现的距离
	// 用maxchange表示内存中下次出现距离最大的页号要装在内存物理中的位置
	int k;

	if (isInside(num)) { // 判断内存中是否有该页面
		printf("命中\n");
	} else if (count == InsideCount) { // 如果内存的物理块已满
		lost++;
		for (int j = 0; j < InsideCount; j++) {
			for (k = num; k < PageCount; k++) {
				if (Inside[j] == Page[k])
					break;
			}
			if (k > max) { // k表示在这个地方会再次出现给定页面,max是记录下来最远的位置
				max = k;
				maxchange = j; // 表示把内存中第1个Inside中的页面从内存拿出,把新的页面放入
			}
		}
		Inside[maxchange] = Page[num]; // 在该位置置换装入新的页面
	} else {
		lost++;
		Inside[count] = Page[num];
		count++;
	}

	for (int i = 0; i < InsideCount; i++) {
		printf("块[%d]中内容为:%d\n", i + 1, Inside[i]);
	}
}

void FIFO(int num) {
	// 先进先出置换算法(FIFO)
	int insert = 0;

	if (isInside(num)) {
		printf("命中\n");
	} else if (count == InsideCount) { // 如果内存的物理块已满
		lost++;
		Inside[insert] = Page[num];
		insert++; // 每放入一个页面后物理块号向后一个位置
		insert = insert % InsideCount; // 保证循环加1
	} else { // 不满,直接放入空闲物理块中
		lost++;
		Inside[count] = Page[num];
		count++;
	}

	for (int i = 0; i < InsideCount; i++) {
		printf("块[%d]中内容为:%d\n", i + 1, Inside[i]);
	}
}

void LRU(int num) {
	// 最近最久未使用置换算法(LRU)
	int max = 8; // nax表示内存中的页号,在之前出现的距离
	int maxchange; // maxchange表示内存中最长时间没有使用的页号在内存物理块中的位置
	int k;
	if (isInside(num)) {
		printf("命中\n");
	} else if (count == InsideCount) { // 如果内存的物理块已满
		lost++;
		for (int j = 0; j < InsideCount; j++) {
			for (k = num - 1; k >= 0; k--) {
				if (Inside[j] == Page[k])
					break;
			}
			if (num - k > max) {
				max = num - k;
				maxchange = j;
			}
		}
		Inside[maxchange] = Page[num];
	} else {
		lost++;
		Inside[count] = Page[num];
		count++;
	}

	for (int i = 0; i < InsideCount; i++) {
		printf("块[%d]中内容为:%d\n", i + 1, Inside[i]);
	}
}

void Menu() {
	printf("\n");
	printf("o 最佳置换算法(OPT) (理想置换算法)\n");
	printf("F 先进先出置换算法(FIFO)\n");
	printf("L 最近最久未使用(LRU)算法\n");
	printf("T 或 t 退出\n");
	printf("**\n");
	printf("请选择:");
}

void reset() {
// reset()函数用来置所有物理块为空,回到初始状态
	for (int j = 0; j < InsideCount; j++) {
		lost = 0;
		count = 0;
		Inside[j] = -1; // 页面可能是号,所以用-1表示该物理块中未装入页面
	}
}

int main() {
	char ch; // 选择使用哪种算法
	printf("输入页面走向:");
	for (int i = 0; i < PageCount; i++) {
		scanf("%d", &Page[i]);
	}
	while (1) {
		getchar();
		Menu();
		scanf("%c", &ch);

		switch (ch) {
			case '0':{
				break;
			}
			case 'o': {
				reset();
				for (int i = 0; i < PageCount; i++) {
					printf("读入 Page[%d]=%d\n", i, Page[i]);
					OPT(i);
				}

				printf("共%d次,缺页%.0f次,缺页率为%f\n", PageCount, lost, lost / PageCount);
				break;
			}
			// 请在此处补充有关FIFO和LRU算法调用的相关代码

			case 'f':{
				break;
			}
			case 'F': {
				reset();
				for (int i = 0; i < PageCount; i++) {
					printf("读入 Page[%d]=%d\n", i, Page[i]);
					FIFO(i);
				}

				printf("共%d次,缺页%.0f次,缺页率为%f\n", PageCount, lost, lost / PageCount);

			}


			case 'l':{
				break;
			}
			case 'L': {
				reset();
				for (int i = 0; i < PageCount; i++) {
					printf("读入 Page[%d]=%d\n", i, Page[i]);
					LRU(i);
				}

				printf("共%d次,缺页%.0f次,缺页率为%f\n", PageCount, lost, lost / PageCount);
				break;
			}



			if (ch == 'T' || ch == 't') {
				break;
			}
			return 8;
		}
	}
}

代码主要由以下几个部分组成:

  1. 全局变量声明部分:声明了一些常量和变量,包括物理块数、页面数、内存中的页面数组等。
  2. isInside 函数:用于检测给定的页号是否在内存的物理块中。遍历内存中的页面数组,如果找到相同的页面,则返回 true,否则返回 false。
  3. OPT 函数:最佳置换算法的实现。根据页面是否在内存中进行不同的操作,如果在内存中则打印 “命中”,否则根据内存是否已满选择页面置换策略。如果内存已满,则根据未来页面访问的距离选择要置换的页面,将给定页面放入合适的位置。如果内存未满,则直接将给定页面放入空闲的物理块。
  4. FIFO 函数:先进先出置换算法的实现。与 OPT 函数类似,根据页面是否在内存中进行不同的操作。如果在内存中则打印 “命中”,否则根据内存是否已满选择页面置换策略。如果内存已满,则按照先进先出的原则将给定页面放入物理块中,将最早进入内存的页面置换出去。如果内存未满,则直接将给定页面放入空闲的物理块。
  5. LRU 函数:最近最久未使用置换算法的实现。与前两个函数类似,根据页面是否在内存中进行不同的操作。如果在内存中则打印 “命中”,否则根据内存是否已满选择页面置换策略。如果内存已满,则根据页面最近的使用情况选择要置换的页面,将给定页面放入合适的位置。如果内存未满,则直接将给定页面放入空闲的物理块。
  6. Menu 函数:打印菜单供用户选择不同的算法。
  7. reset 函数:重置内存的物理块为空,回到初始状态。
  8. main 函数:主函数用于程序的执行流程控制。用户可以输入页面走向,然后根据菜单选择不同的置换算法进行模拟。根据用户的选择,调用对应的算法函数进行页面置换,并输出结果。

在这里插入图片描述

运行截图

image.png

image.png

image.png

image.png

image.png

image.png

优劣比较:

  1. 最佳置换算法(OPT):

    • 优势:OPT 算法在理论上是最优的置换算法,它能够达到最低的缺页率。OPT 算法根据未来页面访问的距离,选择最久未使用的页面进行置换,保证了未来最长时间不会使用的页面被置换出去。
    • 劣势:OPT 算法需要预先知道未来页面访问序列,这在实际中是不可行的。另外,实现 OPT 算法需要对所有页面进行全局扫描,算法的时间复杂度较高。
  2. 先进先出置换算法(FIFO):

    • 优势:FIFO 算法实现简单,只需维护一个页面队列,按照页面进入内存的顺序进行置换。它保证了最早进入内存的页面最先被置换出去,遵循了公平性原则。
    • 劣势:FIFO 算法存在一种称为"Belady’s anomaly"的现象,即在某些情况下,增加物理块数可能导致缺页率增加。这是因为 FIFO 算法无法根据页面的访问模式进行智能调整,导致有些常被访问的页面被置换出去。
  3. 最近最久未使用置换算法(LRU):

    • 优势:LRU 算法根据页面的使用情况进行置换,最近被访问的页面被认为是最有可能在未来继续访问的页面,因此选择最久未使用的页面进行置换。它较好地反映了程序的局部性原理,通常能够较好地适应程序的访问模式,相对于 FIFO 算法来说能够更好地减少缺页率。
    • 劣势:LRU 算法需要维护一个访问时间的记录表,对每个页面的访问进行实时更新,这增加了算法的实现复杂性和开销。此外,LRU 算法可能受到"时间窗口"效应的影响,即较长时间不被访问的页面可能被错误地保留在内存中。

总结

综合来看,这三种算法各有优劣,适用于不同的场景和需求。OPT 算法是理论上的最优算法,但实际应用受限;FIFO 算法简单但可能导致 Belady’s anomaly;LRU 算法相对较好地平衡了性能和复杂性,常用于实际系统中。在选择算法时,需要考虑内存容量、页面访问模式以及算法的实现复杂性等因素。

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

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

相关文章

技术管理方法论

今天来跟大家分享一下我对于技术管理的理解。先介绍一下对于管理最普遍的认识&#xff0c;我们每一个人在公司里面都有两种类型的角色&#xff0c;一种是通过个人的能力和产出来实现组织利益的最大化&#xff0c;另外一类人就是通过管理使得一群人产出结果最大化。 也就是我们…

阿里P8传授的80K+星的MySQL笔记助我修行,一周快速进阶

MySQL 是最流行的关系型数据库之一&#xff0c;广泛的应用在各个领域。下面这些问题对于程序员的你来说应该很常见&#xff0c;来看看你面对这些问题是否会胆怯? MySQL数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f; …

Linux防火墙学习笔记8

iptables的白名单和黑名单&#xff1a; iptables -t filter -I INPUT -s 192.168.2.20 -p tcp --dport 80 -j DROP 之前内网的机器可以访问到80端口&#xff0c;现在添加了这条规则&#xff0c;那么就192.168.2.10这个用户就不能访问了。 案例&#xff1a;白名单&#xff1a;…

系列二、RuoYi前后端分离(登录密码加密去除公钥)

一、问题描述 系列一虽然实现了登录时密码加密&#xff0c;但是/getPublicKey返回的结果中&#xff0c;把私钥也返回了&#xff0c;这样显然是不合理的&#xff0c;如下&#xff1a; 二、后端代码修改 2.1、RSAUtil package com.tssl.business.utils;import org.apache.comm…

STM32单片机蓝牙APP LORA无线远程火灾报警温度烟雾监控系统

实践制作DIY- GC0145蓝牙APP LORA无线远程火灾报警 基于STM32单片机设计---蓝牙APP LORA无线远程火灾报警 二、功能介绍&#xff1a; 1个主机&#xff1a;STM32F103C系列单片机LCD1602显示器蜂鸣器 LORA无线模块3个按键&#xff08;设置、加、减&#xff09;HC-05蓝牙模块&…

Node包管理工具

包管理工具 package代表了一组特定功能的源码集合。 管理包的应用软件&#xff0c;可以对包进行下载安装&#xff0c;更新&#xff0c;删除&#xff0c;上传等操作 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提高开发效率 前端常用包管理工具 npm Node Pack…

【算法系列 | 3】深入解析排序算法之——选择排序

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

基于Hexo和Butterfly创建个人技术博客,(3) 创建博客文章及文章模板配置

Hexo官司网查看 这里 笔者个人站查看 这里 特别说明&#xff1a; hexo博客站点发布的文件全是静态文件&#xff0c;没有任何后台服务。博文的发布过程是&#xff1a;1、在本地用hexo new命令创建.md文件----2、经hexo g命令生成.html文件-----3、再通过hexo d命令发布到远程主机…

知网CN期刊《才智》简介及投稿邮箱

《才智》杂志成立于2001年&#xff0c;隶属吉林省人事厅&#xff0c;是经国家新闻出版总署批准的&#xff0c;吉林省人事系统唯一一本面向全国公开发行的杂志。是一本专业发表各类论文评定职称的省级理论性杂志。以挖掘各行各业拔尖人才、促进科教兴国、振兴人才市场为己任&…

python套接字(二):实现一个服务器和多客户端连接

文章目录 前言一、问题二、实现一个服务器连接多个客户端1、问题分析2、代码实现a、服务器端b、客户端 3、运行 前言 在上一篇博客python套接字(一)&#xff1a;socket的使用简单说明了一下套接字的使用&#xff0c;也实现了使用套接字来传输消息&#xff0c;但是也有一个问题…

深度学习应用篇-推荐系统[12]:经典模型-DeepFM模型、DSSM模型召回排序策略以及和其他模型对比

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

JavaWeb笔记(五)

JavaWeb后端 经过前面的学习&#xff0c;现在终于可以正式进入到后端的学习当中&#xff0c;不过&#xff0c;我们还是需要再系统地讲解一下HTTP通信基础知识&#xff0c;它是我们学习JavaWeb的基础知识&#xff0c;我们之前已经学习过TCP通信&#xff0c;而HTTP实际上是基于T…

使用SonarLint在开发阶段提高代码质量

使用SonarLint在开发阶段提高代码质量 SonarLint是什么 SonarLint是一个免费的IDE插件&#xff0c;是一个代码质量工具。 它可以在我们编写代码的时候&#xff0c;就帮我我们发现问题并提醒我们。可以帮助我们养成良好的代码习惯。 它支持5000条规则&#xff0c;可以帮助我…

如何在Microsoft Excel中使用MATCH查找值的位置

当你需要在电子表格中查找值的确切位置时,可以使用 Excel 中的 MATCH 函数。这样可以避免你手动搜索可能需要参考的位置或其他公式。 MATCH 函数通常与 INDEX 函数一起用作高级查找。但在这里,我们将介绍如何单独使用 MATCH 来找到价值所在。 一、Excel中的MATCH函数是什么 …

11. Synchronized与锁升级

11.1 面试题 ● 谈谈你对Synchronized的理解 ● Sychronized的锁升级你聊聊 ● Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#xff1f;或者说这两个操作计算机底层是如何执行的 …

【企业业务架构】LEANIX : 业务能力

业务能力是组织执行核心功能所需的能力、材料和专业知识的表达或发声。企业架构师使用业务能力来说明业务的总体需求&#xff0c;以便更好地制定满足这些业务需求的 IT 解决方案。 目录 介绍业务能力建模您可以通过业务能力映射实现什么&#xff1f;并购管理IT风险管理创新管理…

手把手教你入门 Docker

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

DAY 76 分布式监控平台:zabbix

市场上常用的监控软件&#xff1a; 传统运维&#xff1a;zabbix、 Nagios云原生环境&#xff1a; Prometheus &#xff08;go语言开发的&#xff09; zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去…

国内云服务器全面对比

想要领取优惠券购买云服务可以前往我的云服务器领券购买。 经过疫情三年&#xff0c;大多行业开始复苏&#xff0c;企业开始布局以后得发展&#xff0c;云服务器作为企业发展几乎是必须的&#xff0c;一个企业从无到有&#xff0c;要经历很多&#xff0c;比如企业官网搭建&…

GaussDB云数据库SQL应用系列—索引管理

目录 一、前言 二、注意事项 三、索引创建 1、创建普通索引 2、创建唯一索引 3、创建多字段索引 4、创建部分索引 5、创建表达式索引 四、索引管理 1、查看索引信息 2、删除索引 总结 一、前言 随着互联网的快速发展&#xff0c;数据量呈现爆炸式增长。如何高效地…