2024-06-23 操作系统实验5——模拟页式存储管理

news2024/11/26 18:24:20

文章目录

    • 一、实验目的
    • 二、实验内容
    • 三、实验过程
    • 四、结果测试
    • 五、实验总结和说明

补录与分享本科实验,以示纪念。

一、实验目的

通过编写和调试请求页式存储管理的模拟程序以加深对请求页式存储管理方案的理解。

二、实验内容

页面淘汰算法可采用FIFO置换算法(或者其他置换算法),在淘汰一页时,判断它是否被改写过,如果被修改过,将它写回到外存上。

数据结构:

(1)虚地址结构

(2)页表结构

#define N 64 // 最大页数 64
#define PAGE_SIZE 1024  // 每页大小 1024
// 页表结构
struct {
	int lNumber; // 页号
	int pNumber; // 物理块号
	int dNumber; // 在磁盘上的位置
	int write;   // 修改标志
	int flag;    // 存在标志
} page[N];

(3)存放页号的队列 p[m]m 为分配给进程的内存块数。当装入一个新的页面时,将其页号存入数组。在模拟试验中,采用页面预置的方法。
请求页式存储管理算法的流程图如下:

图1:请求页式存储管理模拟程序的完整流程图
图2:一条指令执行的模拟流程图

三、实验过程

实验采用C++语言进行编写。

1、代码结构

int main() {
    // 创建页表,记录长度
    int len = createTable();

    // 打印页表
    printTable(len);

    // 获取内存块数
     int memoryBlocks = getMemoryBlocks(len);

    printTable(len);

    // 执行用户指令
    runUserCommand(len, memoryBlocks);

    return 0;
}

一共分为3个部分:创建页表、获取内存块、执行用户指令。

2、createTable():创建页表

/**
 * 创建页表
 * @return 页表长度
 */
int createTable() {
	cout << "输入页表的信息,创建页表(输入 -1 则结束)\n";
	int input;
	int i = 0;
	while (true) {
		cout << "输入第 " << i << " 页的辅存地址:";
		cin >> input;
		if (input == -1) break;
		page[i].lNumber = i;
		page[i].pNumber = 0;
		page[i].dNumber = input;
		page[i].write = 0;
		page[i].flag = 0;
		i++;
	}
	return i;
}

3、getMemoryBlocks():获取内存块

/**
 * 获取主存块号
 * @param len 页表长度,作为主存块数上限
 * @return 主存块数
 */
int getMemoryBlocks(int len) {
	cout << "输入主存块号,总数需小于 " << len << ",(-1 则结束):\n";
	int input;
	int i = 0;
	while (i < len) {
		cout << "第 " << i << " 个主存块号:";
		cin >> input;
		if (input == -1) break;
		page[i].pNumber = input;
		page[i].flag = 1;
		i++;
	}
	return i;
}

4、runUserCommand():执行用户指令

/**
 * 执行用户指令
 * @param tableLen 页表长度
 * @param blockNum 主存块数
 */
void runUserCommand(int tableLen, int blockNum) {
	int modify = 0;        // 用户第一个输入,是否修改
	int exitSig = 0;       // 退出标记
	int input;             // 接受用户输入
	int replace[blockNum]; // 循环队列实现 FIFO
	int in = 0;            // 进队列的位置
	int out = 0;           // 出队列的位置

	// 初始化循环队列
	for (int i = 0; i < blockNum; i++) {
		replace[i] = i;
		in++;
		in = in % blockNum;
	}

	// 进入操作循环
	while (true) {
		cout << "输入指令性质(1-修改,0-不修改,其他-结束运行)和逻辑地址:\n";
		cin >> input;

		// 第一个输入
		if (input == 1)
			modify = 1;
		else if (input == 0)
			modify = 0;
		else
			exitSig = 1;

		// 输入逻辑地址
		int addr = 0;
		cin >> addr;

		// 求逻辑地址最大值
		int maxAddr = tableLen * PAGE_SIZE - 1;

		// 页不存在
		if (addr > maxAddr || input < 0) {
			cout << "不存在该页\n";
			continue;
		}

		// 得到逻辑地址所在页号
		int pageIndex = addr / PAGE_SIZE;

		// 记录页内偏移量,用于计算物理地址
		int left = addr % PAGE_SIZE;

		// 命中
		if (page[pageIndex].flag) {
			// 物理地址计算
			int physic = page[pageIndex].pNumber * PAGE_SIZE + left;
			cout << "逻辑地址是: " << addr << " 对应物理地址是:" << physic << "\n";

			// modify 为 1 时置写标记
			if (modify == 1)
				page[pageIndex].write = 1;
		}

		// 未命中
		else {
			// 打印用户要访问的页
			cout << "访问第 " << pageIndex << " 页不在内存,发生缺页中断\n";

			// 利用循环队列找出将被换出的页号 outNum
			int outNum = replace[out];

			// 出指针前进一位
			out++;
			out = out % blockNum;

			// 考虑将被换出的页有没有修改过,如果有须写回
			if (page[outNum].write == 1) {
				cout << "将 " << outNum << " 页写回磁盘第 " << page[outNum].dNumber << " 块\n";
				page[outNum].write = 0;
			}

			cout << "淘汰主存块 " << page[outNum].pNumber << " 中的页 " << outNum << ",从磁盘第 " << page[pageIndex].dNumber
			     << " 块中调入页 " << pageIndex << "\n";

			// 换入
			// 存在标记置 1,主存块号就是即将被换出的主存块号,如果有写标记则置写标记
			page[pageIndex].flag = 1;
			page[pageIndex].pNumber = page[outNum].pNumber;
			page[pageIndex].write = modify;

			// 刚换进的页面要进入循环队列
			replace[in] = pageIndex;

			in++;
			in = in % blockNum;

			// 换出
			// 标记位置 0,主存块号置 0
			page[outNum].flag = 0;
			page[outNum].pNumber = 0;

			// 计算物理地址
			int physic = page[pageIndex].pNumber * PAGE_SIZE + left;
			cout << "逻辑地址是:" << addr << " 对应物理地址是:" << physic << endl;
		}

		// 退出标记为 1,退出循环结束程序
		if (exitSig == 1) break;

		printTable(tableLen);
	}
}

5、printTable():打印页表

/**
 * 打印页表
 * @param len 页表长度
 */
void printTable(int len) {
	cout << "页表内容:\n";
	for (int i = 0; i < len; i++) {
		cout << "page[" << i << "].lNumber = " << page[i].lNumber << "    "
		     << "page[" << i << "].pNumber = " << page[i].pNumber << "    "
		     << "page[" << i << "].flag = " << page[i].flag << "\n";
	}
}

四、结果测试

1、创建5个页表的进程,赋予3个内存块:

2、修改逻辑地址为1111的内容,其所在页号为1,页内偏移量为1111-1024=887。对应物理地址应改为3*1024+87:

3、修改逻辑地址为4200的内容,其不在进程的页表中,发生替换。这里因为被替换的第0页没有发生修改,因此不写回。

4、修改逻辑地址为3200的内容,其不在进程的页表中,发生替换。这里因为被替换的第1页发生了修改,因此写回。

5、读取逻辑地址为100的内容,其不在进程的页表中,发生替换。这里因为被替换的第5页没有发生修改,因此不写回。

可以看出,本次实验采用的替换算法为FIFO算法。
实验环境为Windows10中文家庭版,使用的编辑器为Clion。

五、实验总结和说明

实验采用的是最容易实现的FIFO页面替换算法,虽然实际应用中几乎不使用。本次实验的主体部分还是地址变换机构,对于页面替换仅仅是通过打印消息来代替其实现。在完成实验的同时,也巩固了有关方面的知识,大大加深了对请求页式存储管理方案的理解。

以上内容仅代表个人,代码纯属原创,如有错误请自行修改。

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

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

相关文章

React+TS前台项目实战(十五)-- 全局常用组件Table封装

文章目录 前言Table组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 在这篇文章中&#xff0c;我们将对本系列项目中常用的表格组件Table进行自定义封装&#xff0c;以提高性能并适应项目需求。后期也可进行修改和扩展&#xff0c;以满足项目的需求。 Table组…

Windows 11 安装hp 1020 plus 打印机驱动 (Ubuntu 20.04.3 LTS 部署cups局域网共享打印服务器)

1 win11 下载HP laserjet 1020 plus驱动,可以官网下载哦 链接下载 2 手动添加hp laserjet 1020驱动: 控制面板-->查看设备和打印机-->打印机和扫描仪-->添加设备-->我需要的打印机不在列表中-->通过手动添加-->按名称选择共享打印机 如果找不到&#xff0…

论文《Tree Decomposed Graph Neural Network》笔记

【TDGNN】本文提出了一种树分解方法来解决不同层邻域之间的特征平滑问题&#xff0c;增加了网络层配置的灵活性。通过图扩散过程表征了多跳依赖性&#xff08;multi-hop dependency&#xff09;&#xff0c;构建了TDGNN模型&#xff0c;该模型可以灵活地结合大感受场的信息&…

简易部署的设备日志采集工具

永久免费: Gitee下载 最新版本 使用说明: Moretl 企业级采集文件工具 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

OPENCV中0x00007FFE5F35F39C发生异常

原因&#xff1a;读取图片时已经为灰度图像&#xff0c;又进行了一次灰度处理cvtColor 解决方法&#xff1a;如上图所示&#xff0c;将cv::imread的第二个参数改为cv::IMREAD_COLOR&#xff1b;或者保留cv::IMREAD_GRAYSCALE&#xff0c;删去后面的cv::cvtColor

高通安卓12-OTA 升级

1.OTA介绍 OTA 英文全称是 Over-the-Air Technology&#xff0c;即空间下载技术的意思。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大&#xff0c;可以无损失升级系统&#xff0c;主 要通过网络[例如 WIFI、3G]自动下载 OTA 升级包、自动升级&#xff0c;但…

仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

, mWidth - mCircleWidth, mHeight - mCircleWidth); canvas.drawRoundRect(rectF, mHintBgRoundValue, mHintBgRoundValue, mHintPaint); //前景文字 mHintPaint.setColor(mHintFgColor); // 计算Baseline绘制的起点X轴坐标 int baseX (int) (mWidth / 2 - mHintPaint.m…

新闻管理与推荐系统Python+Django+协同过滤推荐算法+管理系统

一、介绍 新闻管理与推荐系统。本系统使用Python作为主要开发语言开发的一个新闻管理与推荐的网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后…

mayavi pyqt 实例

目录 安装&#xff1a; 示例代码&#xff1a; 生成3d检测框&#xff1a; 安装&#xff1a; pip install pyqt5 mayavi traits traitsui 示例代码&#xff1a; import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton from …

区块链中nonce是什么,什么作用

目录 区块链中nonce是什么,什么作用 区块链中nonce是什么,什么作用 Nonce在以太坊中是一个用于确保交易顺序性和唯一性的重要参数。以下是对Nonce的详细解释: 定义 Nonce是一个scalar值,它等于从该地址发送的交易数量,或在具有关联代码的账户的情况下,由该账户创建的合…

【Flutter 专题】112 图解自定义 ACEPieWidget 饼状图 (一)

类别选项球&#xff1b;切割绘制饼状图&#xff1b;饼状图中绘制文字&#xff1b; 1. 类别选项球 对于两侧不同颜色类别选项卡&#xff0c;仅需要简单设置一下 Container 的 decoration 装饰器即可&#xff0c;只是方便用户查看饼状图分类而已&#xff1b; return Container…

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

【小沐学AI】Python实现语音识别(Whisper-Web)

文章目录 1、简介2、下载2.1 openai-whisper2.2 whisper-web 结语 1、简介 https://openai.com/index/whisper/ Whisper 是一种自动语音识别 &#xff08;ASR&#xff09; 系统&#xff0c;经过 680,000 小时的多语言和多任务监督数据的训练&#xff0c;从网络上收集。我们表…

【大数据 复习】第8章 Hadoop架构再探讨

一、概念 1.Hadoop1.0的核心组件&#xff08;仅指MapReduce和HDFS&#xff0c;不包括Hadoop生态系统内的Pig、Hive、HBase等其他组件&#xff09;&#xff0c;主要存在以下不足&#xff1a; &#xff08;1&#xff09;抽象层次低&#xff0c;需人工编码 &#xff08;2&#xf…

Docker常用命令与实战示例

docker 1. 安装2. 常用命令3. 存储4. 网络5. redis主从复制示例6. wordpress示例7. DockerFile8. 一键安装超多中间件&#xff08;compose&#xff09; 1. 安装 以centOS系统为例 # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-c…

AI时代的音乐革命:创作更简单,灵魂在哪里?

#AI在创造还是毁掉音乐# 我是李涛&#xff0c;一名音乐创作者&#xff0c;最近一直在思考一个问题&#xff1a;AI到底是在创造音乐&#xff0c;还是在毁掉音乐&#xff1f; 几个月前&#xff0c;我第一次接触到AI音乐创作工具。它让我震惊&#xff0c;只需要输入几个关键词&a…

数据结构7---图

一、定义 对于图的定义&#xff0c;我们需要明确几个注意的地方:一线性表中我们把数据元素叫元素&#xff0c;树中叫结点&#xff0c;在途中数据元素我们则称之为顶点(Vertex)。 对于图的定义&#xff0c;我们需要明确几个注意的地方: 线性表中我们把数据元素叫元素&#xf…

实现文件分片合并功能并使用Github Actions自动编译Release

一、编译IOS镜像 1.1 编译 起因是公司电脑使用的Win11 23H2的预览版&#xff0c;这个预览版系统的生命周期只到2024-09-18&#xff0c;到期后就会强制每两小时重启。这是Windows强制升级系统的一种手段。 虽然公司里的台式电脑目前用不到&#xff0c;但是里面还保留许多旧项…

Jenkins定时构建自动化(一):Jenkins下载安装配置

目录 ​编辑 一、jdk下载安装 1. 已下载安装jdk 2. 未下载安装jdk 二、jenkins安装 1. .war包安装 三、获取IP地址 四、jenkins网页配置 一、jdk下载安装 1. 已下载安装jdk &#xff08;1&#xff09;查询jdk版本命令&#xff1a;java -version &#xff08;2&#xff09;…

[SAP ABAP] 运算符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…