操作系统实验三虚拟存储管理C++

您所在的位置:网站首页 请求分页式存储管理实验报告 操作系统实验三虚拟存储管理C++

操作系统实验三虚拟存储管理C++

2024-07-17 04:01| 来源: 网络整理| 查看: 265

操作系统实验三——虚拟存储管理 实验目的实验内容实验说明实现步骤实现中采用了策略者设计模式,如果不清楚也不影响以下抽象基类及其三个子类都存放在my_algorithm.h头文件 实现VSM类,虚拟存储管理 (Virtual Storage Management) 完整代码请注意文件模块的划分由于本人技术有限,代码中不免存在纰漏,还望见谅。💕💕💕

实验目的

存储管理的主要功能之一是合理地分配空间。请求分页存储管理是常用的虚拟存储管理技术。本实验的目的是请求分页存储管理中页面置换算法模拟设计,了解虚拟存储管理技术的特点,掌握请求分页存储管理的页面置换方法。

实验内容

(1). 通过随机数产生一个指令序列,共 320 条指令。指令的地址按下述原则生成: ① 50 %的指令是顺序执行的; ② 25 %的指令是均匀分布在前地址部分; ③ 25 %的指令是均匀分布在后地址部分。

具体的实施方法是: ④ 在[ 0,319 ]的指令地址之间随机选取一起点 m; ⑤ 顺序执行一条指令,即执行地址为 m + 1 的指令; ⑥ 在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’; ⑦ 顺序执行一条指令,其地址为 m’+1; ⑧ 在后地址[m’+ 2,319]中随机选取一条指令并执行; ⑨ 重复上述步骤,直至执行 320 次指令。

(2). 将指令序列变换成页地址流 设: ① 页面大小为1;② 内存容量为4到32KB;③ 用户虚存容量为 32KB (即32页); 在用户虚存中,按每页存放 10 条指令排列虚存地址,即 320 条指令在虚存中的存放方式为: 第 0 条到第 9 条指令存放在 0 号页(对应的虚存地址为[ 0,9]) ; 第10 条到第 19 条指令存放在1号页(对应的虚存地址为([10,19]) ; … 第310条到第319条指令存放在31号页(对应的虚存地址为[310,319]) ; 按以上方式,用户指令可组成 32 页。

实验说明

完成最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU)三个置换算法即可 LFU及NUR置换算法为可选内容。 命中率:1 -(页面失效次数)/(页地址流长度)在本实验中,页地址流的长度为 320 ,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。 随机数生成可以使用rand()函数,但在一些编译器上会有警告,推荐使用C++11给的随机函数生成库,感兴趣可以自行查找,本实验无相关说明。

注意:如果遇到在visual stdio编译报错,报错内容是std::至少需要c++17。请查询如何修改编译器C++编译版本

实现步骤 实现中采用了策略者设计模式,如果不清楚也不影响 以下抽象基类及其三个子类都存放在my_algorithm.h头文件

首先实现一个抽象基类 基类中包含一个page_change(…)纯虚函数,要求子类重写

// 页面置换算法 抽象基类 class algorithm { protected: // 记录页面失页次数 double page_invalid_number = 0; public: algorithm() = default; double get_page_invalid_number() const { return page_invalid_number; } // 页面置换 纯虚函数 要求子类重写实现 virtual void page_change(int frame, vector &page_address) = 0; virtual ~algorithm() = default; };

实现FIFO置换算法 思想:使用List模拟队列,先进先出

// 先进先出置换算法 first-in first-out class FIFO : public algorithm { private: list page_queue; public: void page_change(int frame, vector &page_address) override { page_invalid_number = 0; page_queue.clear(); for (int i = 0; i = frame) { page_queue.pop_front(); } page_queue.push_back(page_address[i]); } } } };

实现LRU置换算法 思想:使用List模拟栈,栈底始终是最早访问到的页面,栈顶是最新访问到的页面,每次置换栈底的页面

// 最近最久未使用置换算法 least recently used class LRU : public algorithm { private: list page_stack; public: void page_change(int frame, vector &page_address) override { page_invalid_number = 0; page_stack.clear(); for (int i = 0; i = frame) { page_stack.pop_front(); } page_stack.push_back(page_address[i]); } } } };

实现OPT置换算法 思想:选择未来不会使用到或者最久不会使用到的页面进行置换

// 最佳置换算法 optimal class OPT : public algorithm { private: vector page_queue; unordered_map next_occurrence; // 存储每个页面下一次出现的位置 public: void page_change(int frame, vector &page_address) override { page_invalid_number = 0; page_queue.clear(); next_occurrence.clear(); for (int i = 0; i get_page_invalid_number() / 320, 1 - algoPtrL->get_page_invalid_number() / 320, 1 - algoPtrO->get_page_invalid_number() / 320); } } }; #endif //OS_03_THE_CLIENT_H //测试函数,请新建一个任意名称的.cpp文件 #include #include "The_Client.h" int main() { auto *client = new VSM(new OPT(), new FIFO(), new LRU()); // 生成指令 client->create_command(); // 转为页地址流 client->ToPage_address(); client->Run(); return 0; }

欧耶,至此,实验三已经完成。

由于本人技术有限,代码中不免存在纰漏,还望见谅。💕💕💕


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3