完成LRU页面调度算法的模拟

目录

1.上代码

2.实现思路 


1.上代码

#include<iostream>
using namespace std;
//内存块类
class memory
{
public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(memory *My_Memory, int ans, int a);friend void show(memory *My_Memory, int ans);
private:int page;int time;
};
//为了多次初始化
void memory::init()
{page = 0;time = 0;
}
//修改内存块保存的页和时间
void memory::alter(int a, int b)
{page = a;time = b;
}
//检查该块是否已被占用
int memory::check_full()
{if (page == 0 && time == 0){return 1;}else{return 0;}
}
//检查该块的驻留时间
int memory::check_old()
{return time;
}
//检查该块中是否保存了页a
int memory::check_exist(int a)
{if (page == a){return 1;}else{return 0;}
}
//时间++
void memory::run()
{if (page != 0){time++;}
}
//时间置0
void memory::refresh()
{time = 0;
}
//调度作业
int manage(memory *My_Memory, int ans, int a)
{//检查内存块是否已经保存了页面afor (int i = 0; i < ans; i++){if (My_Memory[i].check_exist(a)){cout << "不发生中断,页面" << a << "已在内存块" << i << "中" << endl;My_Memory[i].refresh();return 1;}}//检查内存块是否有空闲页面for (int i = 0; i < ans; i++){if (My_Memory[i].check_full()){cout << "发生中断," << "内存块" << i << "空闲中,页面" << a << "装入" << endl;My_Memory[i].alter(a, 0);return 0;}}//找到驻留时间最大的块,进行替换int max_time = 0;int num = -1;for (int i = 0; i < ans; i++){if (My_Memory[i].check_old()>max_time){max_time = My_Memory[i].check_old();num = i;}}cout << "发生中断," << "内存块" << num << "中页面" << My_Memory[num].page << "被替换,页面" << a << "装入" << endl;My_Memory[num].alter(a, 0);return 0;
}
//显示内存块当前状态
void show(memory *My_Memory, int ans)
{cout << "...................................." << endl;cout << "内存块号";for (int i = 0; i < ans; i++){cout << "  |" << i;}cout << "\n页面号  ";for (int i = 0; i < ans; i++){cout << "  |" << My_Memory[i].page;}cout << "\n驻留时间";for (int i = 0; i < ans; i++){cout << "  |" << My_Memory[i].time;}cout << "\n....................................\n" << endl;
}
int main()
{cout << "***************************" << endl;cout << "***   页面置换算法LRU   ***" << endl;cout << "*** 1.设置存储区块数    ***" << endl;cout << "*** 2.页面调度模拟      ***" << endl;cout << "*** 3.缺页率统计        ***" << endl;cout << "*** 4.退出模拟器        ***" << endl;cout << "***************************" << endl;int ans, aans = 0, nohit = 0;memory My_Memory[100];int flag;while (true){cout << "\n请选择功能:";cin >> flag;if (flag == 1){//设置存储区块数cout << "请输入存储区块数:";cin >> ans;for (int i = 0; i < ans; i++){My_Memory[i].init();  }nohit = 0;aans = 0;}else if (flag == 2){//页面调度模拟while (true){for (int i = 0; i < ans; i++){My_Memory[i].run();}cout << "请输入要调入的页面(输入0结束):";int a;cin >> a;if (a == 0){break;}aans++;if (!manage(My_Memory, ans, a)){nohit++;}show(My_Memory, ans);}}else if (flag == 3){//缺页率统计cout << "*****************" << endl;cout << "调度作业 " << aans << "次\n中断     " << nohit << "次\n缺页率   " << double(nohit) / aans * 100.00 << "%" << endl;cout << "*****************" << endl;}else if (flag == 4){//退出cout << "成功退出!\n" << endl;break;}}return 0;
}

运行ok的放心 =w=

2.实现思路 

LRU页面调度算法的代码实现思路

1. 定义了一个memory类,表示内存块,包含了一些成员函数和变量用于处理内存块的操作。

  1. init():初始化内存块的页和时间。
  2. alter(int a, int b):修改内存块保存的页和时间。
  3. check_full():检查内存块是否已被占用。
  4. check_old():返回内存块的驻留时间。
  5. check_exist(int a):检查内存块中是否保存了特定页。
  6. run():时间增加1。
  7. refresh():将时间置为0。
  1. manage()函数:用于调度作业,实现LRU页面置换算法的核心逻辑。
  1. 检查内存块是否已保存了页面a,如果是则不发生中断。
  2. 检查是否有空闲内存块,若有则将页面a装入,否则找到驻留时间最长的内存块进行替换。
  3. 返回0表示发生中断,返回1表示不发生中断。

3. show()函数:用于显示内存块的当前状态,包括内存块号、页面号和驻留时间。

4. main()函数:主程序,包含了整个模拟器的交互逻辑。

  1. 提供了四个功能选项:设置存储区块数、页面调度模拟、缺页统计以及退出模拟器。
  2. 用户选择不同功能并输入相应数据,程序会执行相应的操作并显示结果。

5. 模拟过程:

  1. 用户可以设置存储区块数,然后模拟页面调度过程,输入要调入的页面来模拟LRU页面置换算法。

设置存储区块数为4,依次调入1、2、3、4号页面:

调入第五块时,最久未被使用的页面1被替换掉:

  1. 可以统计调度作业次数、中断次数和缺页率。

接着,依次访问页面3、页面4、页面3后,计算缺页率:

访问8次,中断5次,缺页率计算为62.5%:

6. 代码通过类的方式封装了内存块的操作,提高了代码的可读性和可维护性。用户可以交互式地进行页面置换算法的模拟和统计。

  • 小总结与进一步改进设想

小总结:

以上代码实现了LRU页面置换算法的模拟器,可以帮助用户理解LRU算法的工作原理和在操作系统中的应用。代码结构清晰,逻辑比较简单,可以通过用户输入进行模拟页面调度,并统计缺页率等信息。

进一步改进设想:

1. 引入更多的页面置换算法:除了LRU算法,可以考虑实现其他常用的页面置换算法,如FIFO算法、LFU算法等。这样用户可以选择不同的算法进行比较和分析。

2. 添加可视化界面:可以考虑将模拟器的操作界面进行可视化设计,包括图形化展示内存状态、页面调度过程等,让用户更直观地了解算法的工作过程。

3. 支持更复杂的内存管理方案:目前代码只实现了简单的内存块分配和页面替换,可以考虑添加更复杂的内存管理机制,如页表、地址转换等,使模拟器更贴近实际操作系统的内存管理情景。

4. 增加性能优化:优化代码逻辑、数据结构和算法,提高模拟器的性能和稳定性,使其能够处理更大规模的页面调度模拟。

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

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

相关文章

Three.js 直线拐角自动圆角化(圆弧转弯)

目录 前言 计算圆心坐标 计算两条直线的角平分线 计算dir1 dir2的夹角 计算圆心到直线交点的距离 计算圆心 计算从正X轴算起曲线开始、终止的角度 计算垂足与两直线交点距离 计算垂足 计算垂线 计算两垂线与x轴的夹角 ​编辑 计算圆弧是否按照顺时针方向来绘制 成功…

【MYSQL】mysql单表亿级数据查询优化处理

1、实践表明mysql单表数据超过一亿后&#xff0c;数据进行交并差效率会非常慢&#xff0c;所以这时候就要进行表的优化。 我这里主要是使用索引。 2、表字段精量精简 查索引&#xff0c;建索引&#xff0c;删索引语法 --查看索引 -- SHOW INDEX FROM 表名; -- 删除索引 --AL…

C++基础:模拟实现vector(有存在深层次的浅拷贝问题)

目录 引言 一、vector的基本框架 二、尾插push_back、reserve扩容、任意位置插入insert&#xff08;增&#xff09; 1.reserve扩容 2.push_back尾插 3.深层次的浅拷贝问题 4. 任意位置插入数据insert(会使迭代器失效) 三、构造、析构、拷贝构造函数 1.构造函数 1.1无…

【力扣】关于链表索引

怎么才能走到目标节点呢&#xff1f; 从9走到2&#xff0c;需要2步&#xff0c;他们的索引分别是&#xff1a;0&#xff0c;2 在for循环里&#xff1a;int i 0; i < 2; i i的范围是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果从虚拟头节点开始走到2&#x…

C++ ODB框架详解:现代C++对象关系映射解决方案

目录 框架简介安装与配置基础概念实体映射数据库操作查询操作高级功能性能优化最佳实践 框架简介 ODB&#xff08;Object-Relational Database&#xff09;是一个专为C设计的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司开发。它提供了一种…

Ai书签管理工具开发全记录(一):项目总览与技术蓝图

文章目录 Ai书签管理工具开发全记录&#xff08;一&#xff09;&#xff1a;项目总览与技术蓝图 ✨1. 项目背景与核心价值 &#x1f4a1;1.1. 核心特点 2. 技术架构分析 &#x1f3d7;️功能架构全景图典型工作流 3. 核心技术栈选择 &#x1f6e0;️4. 预期使用功能说明 &#…

GUI 编程——python

GUI 编程核心概念 GUI&#xff08;图形用户界面&#xff0c;Graphical User Interface&#xff09; 是一种通过图形元素&#xff08;窗口、按钮、菜单等&#xff09;与用户交互的应用程序形式&#xff0c;相比命令行界面更直观易用。以下是学习 GUI 编程的基础概念和流程&…

【Doris基础】Apache Doris 基本架构深度解析:从存储到查询的完整技术演进

目录 1 引言 2 Doris 架构全景图 2 核心组件技术解析 2.1 Frontend 层&#xff08;FE&#xff09; 2.2 Backend 层&#xff08;BE&#xff09; 3 数据存储与复制机制 3.1 存储架构演进 3.2 副本复制策略 4 查询处理全流程解析 4.1 查询生命周期 5 高可用设计 5.1 F…

光电赋能低空场景,灵途科技助力无人机持续升级

2025 UASE 主题为“步入低空经济新时代”的“2025第九届世界无人机大会暨国际低空经济与无人系统博览会/第十届深圳国际无人机展览会”5月23日在深圳会展中心隆重开幕。本届展会汇聚了全球800余家企业参展&#xff0c;展示5000多款无人机及系统设备&#xff0c;全面呈现低空经…

iOS QQ抽屉式导航的实现

QQ个人中心的侧滑功能(通常称为"抽屉式导航")可以通过以下几种方式在iOS中实现&#xff1a; 主要实现方案 使用第三方库 最快速的方式是使用成熟的第三方库&#xff1a; SWRevealViewController&#xff1a;最流行的侧滑菜单库MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行标签或列标签前添加指定前缀的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行标签或列标签后添加指定后缀的方法DataFram…

长短期记忆网络 (LSTM) 详解:从原理到应用

一、引言&#xff1a;序列数据处理的挑战​ 在自然语言处理、语音识别、时间序列分析等领域&#xff0c;数据通常以序列形式存在&#xff0c;前后数据点之间存在依赖关系。传统循环神经网络 (RNN) 虽然能捕捉序列依赖&#xff0c;但存在严重的梯度消失 / 爆炸问题&#xff0c;…

三天掌握PyTorch精髓:从感知机到ResNet的快速进阶方法论

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 一、分析式AI基础与深度学习核心概念 1.1 深度学习三要素 数学基础&#xff1a; f(x;W,b)σ(Wxb)(单层感知机) 1.2 PyTorch核心组件 张量操作示例…

Linux操作系统概述

一、操作系统的作用 1、五大基本功能 &#xff08;1&#xff09;进程和线程的管理&#xff1a;进程线程的状态、控制、同步互斥、通信调度等 (2&#xff09;存储管理&#xff1a;分配/回收、地址转换、存储保护等 (3&#xff09;文件管理&#xff1a;文件目录、文件操作、磁盘…

Python爬虫第22节- 结合Selenium识别滑动验证码实战

目录 一、引言 二、滑动验证码原理与反爬机制 2.1 验证码原理 2.2 反爬机制 三、工程实战&#xff1a;滑动验证码识别全流程 3.1 工程准备 3.1.1 环境依赖 3.1.2 目标网站与验证码识别案例 3.2 核心破解流程 3.2.1 自动化打开网页与登录 3.2.2 获取验证码图片&#…

NSSCTF-[NISACTF 2022]huaji?

下载附件得到文件 放到kali里面看看 发现是一张图片 用binwalk命令对其进行分离 发现需要密码 用010打开图片进行查看 对其进行解密 分别得到 ctf_NISA_2022 nisa_2022 发现ctf_NISA_2022是密码 得到flag NSSCTF{Nls_FumYEnnOjy}

nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb

第一部分&#xff1a;MmMapViewInSystemCache函数返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …

Uniapp+UView+Uni-star打包小程序极简方案

一、减少主包体积 主包污染源&#xff08;全局文件依赖&#xff09;劲量独立导入 componentsstaticmain.jsApp.vueuni.css 分包配置缺陷&#xff0c;未配置manifest.json中mp-weixin节点 "usingComponents" : true,"lazyCodeLoading" : "requiredC…

Teigha应用——解析CAD文件(DWG格式)Teigha在CAD C#二次开发中的基本应用

Teigha是一款专为开发者设计的工具&#xff0c;其核心技术在于强大的API和丰富的功能集&#xff0c;提供了一系列工具和方法&#xff0c;使开发者能够轻松地读取、解析和操作DWG文件。它支持多种操作系统&#xff0c;能在处理大型DWG文件时保持高效性能&#xff0c;还可用于构建…

JavaWeb:SpringBoot Bean管理

获取Bean Bean作用域 解决循环依赖方式 1.粗暴删除依赖 2.打破依赖配置 3.使用lazy注解 引入第三方Bean