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

文章目录

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

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

一、实验目的

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

二、实验内容

页面淘汰算法可采用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]; // 循环队列实现 FIFOint 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;elseexitSig = 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";// 利用循环队列找出将被换出的页号 outNumint 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,主存块号置 0page[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.mzph.cn/news/857885.shtml

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

相关文章

从理论到实践掌握UML

统一建模语言&#xff08;UML&#xff09;是软件工程师用来设计软件系统的一种工具&#xff0c;就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统&#xff0c;比起用文字来描述&#xff0c;更加直观易懂。本文通过UML实例化的理论和实践相…

ROS | 常见故障排查

1.开启后发出一个WIFI WIFI名字&#xff1a;WHEELTEC接数字 安全密钥&#xff1a;dongguan 2.显示屏接口 USB接口接键鼠 3.远程登录命令 ssh -Y wheeltec192.168.0.100 是小车发出的WIFI的一个IP地址 4. 登录后确保IP地址 ip a 看一下 当前ip地址 倒数第四行-当前ip地址 1…

django学习入门系列之第三点《CSS基础样式介绍3》

文章目录 浮动什么是浮动浮动的特性清除浮动 往期回顾 浮动 什么是浮动 float属性用于创建浮动框&#xff0c;将其移动到一边&#xff0c;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 浮动的特性 浮动元素会脱离标准流(脱标) 浮动的元素会一行内显示并且元素顶部对…

51单片机STC89C52RC——6.3 定时器/计数器 实现计时功能(定时器+中断系统+LCD1602液晶显示器)

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;定时器 中断系统LCD1602显示 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 ​ 目的/效果 用定时器实现系统中断&#xff0c;计时信息显示在LCD1602上。效果如下 …

springAI(一)

目录 一、spring AI 目的 二、spring AI 来源 三、sprig AI 是什么&#xff1f; 四、spring AI中的 概念 4.1、模型&#xff08;Models&#xff09; 4.2、提示&#xff08;Prompts&#xff09; 4.3、提示模板&#xff08;Prompt Templates&#xff09; 4.4、令 牌&#…

Axios-入门

介绍 Axios对原生Ajax进行了封装&#xff0c;简化书写&#xff0c;快速开发 官网&#xff1a;Axios中文文档 | Axios中文网 (axios-http.cn) 入门 1引入Axios的js文件 <script src"js/axios.js"></script> 2使用Axios发送请求&#xff0c;并获取响应…

系统架构师考点--嵌入式技术

​大家好。今天来总结一下嵌入式技术的考点。该考点分值3-5分&#xff0c;上午场选择题和下午场案例题都可能会考&#xff0c;但不是每年都考。 一、嵌入式微处理体系结构 冯诺依曼结构&#xff1a;传统计算机采用冯诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构是一…

【代码随想录】【算法训练营】【第45天】 [198]打家劫舍 [213]打家劫舍II [337]打家劫舍III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 45&#xff0c;周五&#xff0c;坚持不了一点~ 题目详情 [198] 打家劫舍 题目描述 198 打家劫舍 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 虚拟头…

中国科学院西北生态环境资源研究院联合多单位在《PNAS》发文:气候变暖对多年冻土区地上与地下生物量分布的影响

文章简介 论文名称&#xff1a;Changes in above-versus belowground biomass distribution in permafrost regions in response to climate warming&#xff08;气候变暖对多年冻土区地上与地下生物量分布的影响&#xff09; 第一作者及单位&#xff1a;贠汉伯&#xff08;研…

SCI一区TOP|双曲正弦余弦优化算法(SCHO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年&#xff0c;J Bai受到双曲正弦余弦函数启发&#xff0c;提出了双曲正弦余弦优化算法&#xff08;Sinh Cosh optimizer, SCHO&#xff09;。 2.算法原理 2.1算法思想 SCHO灵感来源…

1panel + Pbootcms 设置伪静态规则

这里确保我们引用的样式路径是否是这样的&#xff0c;&#xff08;不然可能会设置了伪静态无法加载样式&#xff09; //这种格式在不开起伪静态是可以引入的&#xff0c;一旦开启就不行了,一定要在static 前面加上反斜杠 /<link rel"stylesheet" href"{pbo…

【数据分享】《中国法律年鉴》1987-2022

而今天要免费分享的数据就是1987-2022年间出版的《中国法律年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1987年起&#xff0c;《中国法律年鉴》作为一部全面记录中国法律发展进程的重要文献&#xff0c;见证了中国法治建设的每…

Linux服务升级:Almalinux 升级 WebCatlog桌面程序

目录 一、实验 1.环境 2.Almalinux 升级 WebCatlog桌面程序 二、问题 1.Ubuntu如何升级 WebCatlog桌面程序 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本软件IP备注Almalinux9.4 WebCatlog 192.168.204.150 &#xff08;2&#xff09;Termi…

odoo17 小变更4

odoo17 小变更4 1、代码中去除了访问私人地址权限,但翻译中均还有,怪不 model:res.groups,name:base.group_private_addresses msgid "Access to Private Addresses" msgstr "" 代码也查看了,的确没有了此权限组 --><record model="res.g…

大聪明教你学Java | 深入浅出聊 Kafka

前言 &#x1f34a;作者简介&#xff1a; 不肯过江东丶&#xff0c;一个来自二线城市的程序员&#xff0c;致力于用“猥琐”办法解决繁琐问题&#xff0c;让复杂的问题变得通俗易懂。 &#x1f34a;支持作者&#xff1a; 点赞&#x1f44d;、关注&#x1f496;、留言&#x1f4…

35 - 最后一个能进入巴士的人(高频 SQL 50 题基础版)

35 - 最后一个能进入巴士的人 -- sum(weight) over(order by turn) as total,根据turn升序&#xff0c;再求前面数的和 selectperson_name from(selectperson_name,sum(weight) over(order by turn) as totalfromQueue) new_Queue wheretotal<1000 order by total desc lim…

34 - 指定日期的产品价格(高频 SQL 50 题基础版)

34 - 指定日期的产品价格 -- row_number(行号) 生成连续的序号&#xff0c;不考虑分数相同 -- 在2019-08-16之前改的价格&#xff0c;使用最近一期的日期&#xff0c;没有在2019-08-16之前改的价格&#xff0c;默认价格为10 select t.product_id, t.new_price as price from (s…

Idea安装插件刷Leetcode

一、下载插件 idea版本2022以下两个插件都可以用来刷Leetcode 二、登录Leetcode 获取token 登录 三、配置 配置1 配置2 Code FileName C$!velocityTool.leftPadZeros($!{question.frontendQuestionId},4)$!velocityTool.replace(${question.title}," ","&qu…

Redis进阶 - 朝生暮死之Redis过期策略

概述 Redis 是一种常用的内存数据库&#xff0c;其所有的数据结构都可以设置过期时间&#xff0c;时间一到&#xff0c;就会自动删除。你可以想象 Redis 内部有一个死神&#xff0c;时刻盯着所有设置了过期时间的 key&#xff0c;寿命一到就会立即收割。 你还可以进一步站在死神…

MSPM0G3507 ——GPIO例程讲解2——simultaneous_interrupts

主函数&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();/* Enable Interrupt for both GPIOA and GPIOB ports */NVIC_EnableIRQ(GPIO_SWITCHES_GPIOA_INT_IRQN); //启用SWITCHES——A的中断 NVIC_EnableIRQ(GPIO_S…