[操作系统]页面置换算法实验及C++实现(OPT、FIFO、LRU)

虚拟内存页面置换算法实验(OPT、FIFO、LRU)

进程运行时,若其访问的页面不再内存中而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。选择调出页面的算法就称为页面置换算法

好的页面置换算法应有较低的缺页率,也就是说,应将以后不会再访问或以后较长时间内不会再访问的页面先调出。

实验目标

  1. 理解虚拟内存的基本工作原理;
  2. 掌握虚拟内存页面置换的相关概念;
  3. 掌握先进先出FIFO,最佳置换OPT和最近最久未使用LRU页面置换算法的实现方法。

实验内容

设计程序模拟先进先出FIFO、最佳置换OPT、最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, …, Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。

输入:最小物理块数m,页面个数n,页面访问序列P1, …, Pn。

输出:每次页面访问时,物理块对应的页面序号;该方法下的缺页次数和缺页率。

最佳(OPT)置换算法

最佳(Optimal,OPT)置换算法选择的被淘汰的页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率。(然而,由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现)。

先进先出(FIFO)页面置换算法

先进先出页面置换算法优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

FIFO算法还会产生所分配的物理块数增大而缺页数不减反增的异常现象,这由Belady于1969年发现,因此称为Belady异常。只有FIFO算法可能出现Belady异常,LRU和OPT算法永远不会出现Belady异常。

最近最久未使用(LRU)置换算法

最近最久未使用置换算法选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择页面中值最大的予以淘汰。

LRU算法本质上是“向前看”的,而最佳置换算法则是根据各页以后的使用情况“向后看”的。

程序设计

在这里插入图片描述

在这里插入图片描述

实验过程和结果分析

  • 物理块数 m=3m=3m=3
  • 访问次数 n=20n=20n=20
  • 访问序列 P=[7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1]P=[7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1]P=[7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1]
页面置换算法缺页率
OPT0.450
FIFO0.750
LRU0.600

不难发现,OPT的缺页率最低,性能最好,但是实际中的“前瞻”不能实现。LRU的缺页率次之,是比较理想的页面置换算法。FIFO的缺页率最高,效果最差,因为被换出的页面可以被频繁访问。

OPT

OPT: 
7: 7 - - (miss)
0: 7 0 - (miss)
1: 7 0 1 (miss)
2: 2 0 1 (miss)
0: 2 0 1 (hit)
3: 2 0 3 (miss)
0: 2 0 3 (hit)
4: 2 4 3 (miss)
2: 2 4 3 (hit)
3: 2 4 3 (hit)
0: 2 0 3 (miss)
3: 2 0 3 (hit)
2: 2 0 3 (hit)
1: 2 0 1 (miss)
2: 2 0 1 (hit)
0: 2 0 1 (hit)
1: 2 0 1 (hit)
7: 7 0 1 (miss)
0: 7 0 1 (hit)
1: 7 0 1 (hit)
The rate of missing page is 0.450

FIFO

FIFO: 
7: 7 - - (miss)
0: 7 0 - (miss)
1: 7 0 1 (miss)
2: 2 0 1 (miss)
0: 2 0 1 (hit)
3: 2 3 1 (miss)
0: 2 3 0 (miss)
4: 4 3 0 (miss)
2: 4 2 0 (miss)
3: 4 2 3 (miss)
0: 0 2 3 (miss)
3: 0 2 3 (hit)
2: 0 2 3 (hit)
1: 0 1 3 (miss)
2: 0 1 2 (miss)
0: 0 1 2 (hit)
1: 0 1 2 (hit)
7: 7 1 2 (miss)
0: 7 0 2 (miss)
1: 7 0 1 (miss)
The rate of missing page is 0.750

LRU

LRU: 
7: 7 - - (miss)
0: 7 0 - (miss)
1: 7 0 1 (miss)
2: 2 0 1 (miss)
0: 2 0 1 (hit)
3: 2 0 3 (miss)
0: 2 0 3 (hit)
4: 4 0 3 (miss)
2: 4 0 2 (miss)
3: 4 3 2 (miss)
0: 0 3 2 (miss)
3: 0 3 2 (hit)
2: 0 3 2 (hit)
1: 1 3 2 (miss)
2: 1 3 2 (hit)
0: 1 0 2 (miss)
1: 1 0 2 (hit)
7: 1 0 7 (miss)
0: 1 0 7 (hit)
1: 1 0 7 (hit)
The rate of missing page is 0.600

输出截图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Belady 异常

  • 物理块数 m1=3,m2=4m_1=3, m_2=4m1=3,m2=4
  • 访问次数 n=12n=12n=12
  • 访问序列 P=[3,2,1,0,3,2,4,3,2,1,0,4]P=[3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4]P=[3,2,1,0,3,2,4,3,2,1,0,4]

在使用FIFO页面置换算法时,可能会出现Belady异常。

m缺页率缺页次数
30.7509
40.83310

附录:代码

#include <iostream>using namespace std;class Base {
public:Base(int m, int n, int *p) :m(m), n(n), p(p), missed(0),field(new int[m]{}),blocks(new int[m]) {for (int j = 0; j < m; ++j)blocks[j] = -1;}protected:int m;int n;int *p; // 页面调用序列int i{}; // 页面调用序列的指针int missed; // 缺页次数int *field; // 访问字段int *blocks; // 物理块void run(); // 运行函数
private:float rateOfMissingPage{}; // 缺页率bool isHit(); // 检查是否命中virtual int blockSelect() = 0; // 换出页面选择函数virtual void printAlgorithmName() const = 0;void pageExchange(int blockInd, int page); // 页面换出函数void updateField(); // 更新访问字段void printBlocks();void printRateOfMissingPage() const;
};void Base::pageExchange(int blockInd, int page) {blocks[blockInd] = page;
}void Base::printBlocks() {int t;for (int j = 0; j < m; ++j) {t = blocks[j];if (t >= 0) printf("%d ", t);else printf("- ");}
}bool Base::isHit() {int page = p[i];for (int j = 0; j < m; ++j)if (page == blocks[j]) {// 命中则修改访问字段field[j] = 0;return true;}return false;
}void Base::run() {int blockInd;printAlgorithmName();for (i = 0; i < n; ++i) {updateField();// 尚有空闲物理块if (i < m) {blocks[i] = p[i];blockInd = i;} else {// 命中if (isHit()) {printf("\033[32m%d: ", p[i]);printBlocks();printf("(hit)\033[0m\n");continue;} else { // 未命中blockInd = blockSelect();pageExchange(blockInd, p[i]);}}printf("\033[31m%d: ", p[i]);printBlocks();printf("(miss)\033[0m\n");++missed;field[blockInd] = 0;}rateOfMissingPage = (float) missed / (float) n;printRateOfMissingPage();
}void Base::printRateOfMissingPage() const {printf("The rate of missing page is %.3f\n", rateOfMissingPage);
}void Base::updateField() {for (int j = 0; j < m; ++j)++field[j];
}class OPT : public Base {
public:OPT(int m, int n, int *p) : Base(m, n, p) { run(); }private:int blockSelect() override {int j, k;int obj_page;int look_back = 0;for (j = 0; j < m; ++j) {for (k = i + 1; k < n; ++k) {if (blocks[j] == p[k]) {if (k > look_back) {obj_page = j;look_back = k;}break;}}if (k == n) {obj_page = j;break;}}return obj_page;}void printAlgorithmName() const override {cout << "OPT: " << endl;}
};class FIFO : public Base {
public:FIFO(int m, int n, int *p) : Base(m, n, p) { run(); }private:int blockSelect() override {return (missed) % m;}void printAlgorithmName() const override {cout << "FIFO: " << endl;}
};class LRU : public Base {
public:LRU(int m, int n, int *p) : Base(m, n, p) { run(); }private:int blockSelect() override {int tag = 0;int obj_page;for (int j = 0; j < m; ++j) {if (tag < field[j]) {tag = field[j];obj_page = j;}}return obj_page;}void printAlgorithmName() const override {cout << "LRU: " << endl;}
};int main() {int m = 3;int P[] = {3, 2, 1, 0, 3, 2, 4, 3, 2, 1, 0, 4};int n = sizeof(P) / sizeof(int);
//    OPT opt(m, n, P);FIFO fifo1(3, n, P);FIFO fifo2(4, n, P);
//    LRU lru(m, n, P);return 0;
}

参考文献

  1. 2023年操作系统考研复习指导/王道论坛考研组编.——北京:电子工业出版社,2021.12

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

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

相关文章

智谱AI多项成果惊艳亮相2021北京智源大会

来源&#xff1a;学术头条2021 年 6 月 1 日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称 “智源”&#xff09;主办的 2021 北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。包括 Yoshua Bengio、David Patterson 等图灵奖获得者在内的两百余位国…

python-字典方法

1.字典的格式化字符串在转换说明符%后面加上键(圆括号括起来)&#xff1b;phonebook{"A":45,"B":"56"} s"As phone number is %(A)s." print(s%phonebook) 运行结果&#xff1a; #字典方法&#xff1a; #clear():清楚字典中的所有的项…

获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的

来源&#xff1a;Pinterest优选2019年初NHK的一个访谈纪录片&#xff0c;看哭了很多网友。“感动&#xff0c;这才是真正的大神啊&#xff01;”纪录片的主人公&#xff0c;是2002年的诺贝尔化学奖得主——田中耕一。十九年前&#xff0c;他的获奖几乎是“都市传说”般的爆炸新…

光辉岁月:人工智能的那些人和事(1)

来源&#xff1a;图灵人工智能源头茫昧虽难觅&#xff0c;活水奔流喜不休。——法国数学家亨利庞加莱&#xff08;Henri Poincare&#xff09;目前&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;正在迅速崛起。现已面世的AI应用&#xff…

MySQL主从架构及读写分离实战

​​​​​​ 目录 一、实验目的与环境 二、基础环境介绍 三、搭建主从集群 1、理论基础 2、同步的原理 3、搭建主从集群 3.1 配置master主服务器 3.2 配置slave从服务 3.3 主从集群测试 3.4 集群搭建扩展&#xff1a; 3.5、GTID同步集群 4、集群扩容 5、半同步复…

编译原理课程实践——实现一个初等函数运算语言的解释器或编译器

编译原理课程实践——实现具有初等函数运算语言的解释器或编译器 作者&#xff1a;Sylvan Ding &#xff5c;转载请注明文章出处&#xff01; 摘要&#xff1a;本文主要内容是设计词法分析器、语法分析器&#xff08;LL(1)、SLR(1)&#xff09;和语义分析器&#xff08;基于SL…

数据结构开发(3):线性表的顺序存储结构

0.目录 1.线性表的本质和操作 2.线性表的顺序存储结构 3.顺序存储结构的抽象实现和具体实现 3.1 SeqList3.2 StaticList 和 DynamicList4.顺序存储线性表的分析 4.1 效率分析4.2 功能分析5.小结 1.线性表的本质和操作 线性表 ( List ) 的表现形式&#xff1a; 零个或多个数据元…

小目标检测的一些问题,思路和方案

来源&#xff1a;机器学习研究组订阅机器学习正越来越多地进入我们的日常生活。从个人服务的广告和电影推荐&#xff0c;到自动驾驶汽车和自动送餐服务。几乎所有的现代自动化机器都能“看”世界&#xff0c;但跟我们不一样。为了像我们人类一样看到和识别每个物体&#xff0c;…

python-条件语句

#条件、循环和其他语句 #print:可以打印多个表达式&#xff0c;表达式之间用逗号隔开 print(a,"b",False)#参数并不构成一个元组 模块导入:import x :导入模块xfrom x import func &#xff1a;导入模块x的函数funcfrom x import func1,func2,... 导入模块…

一文读懂全球半导体市场

来源&#xff1a;深城物联作者&#xff1a;孙卓异&#xff0c;供职于赛迪顾问集成电路产业研究中心 半导体是当今信息技术产业高速发展的基础和原动力&#xff0c;已经高度渗透并融合到了经济、社会发展的各个领域&#xff0c;其技术水平和发展规模已经成为衡量一个国家产业竞争…

如何写好一份技术简历?

写简历的基本目的和策略 大部分情况下&#xff0c;写简历是找工作的第一步&#xff0c;考虑到第二步就是面试&#xff0c;那么简历就是敲门砖&#xff0c;为了让企业认识到你的价值&#xff0c;必须把自己的真实水平描述出来&#xff0c;展现出你有能力应对这份工作。甚至要体现…

这是我看过最全的工业机器人知识介绍 !

来源&#xff1a;产业智能官编者按工业机器人广泛使用在产业制造上&#xff0c;汽车制造、电器、食品等&#xff0c;能替代反复机器式操纵工作&#xff0c;是靠本身动力和控制才能来实现种种功用的一种机器。它能够承受人类指挥&#xff0c;也能够按照事先编排的程序运转。今天…

表白网站|程序猿的爱情记录网站模版|情侣日记网页

程序猿的爱情记录网站模版&#xff5c;情侣日记网页设计 介绍 我为我的女朋友制作了这个主页&#xff0c;目的是记录一些值得纪念的时刻。 如果需要&#xff0c;您可以复制和修改此模板作为送给女朋友或妻子的礼物。 Demo Click here to review the website! ❤️ https://…

python-字符串方法

#find方法&#xff1a;查找子串&#xff0c;返回子串所在位置的最左端索引&#xff0c;如果没有找到则返回-1 s"agsa" print(s.find("gs")) print(s.find("agsaa")) #可以指定匹配的起始点和结束点参数,包含第一个索引&#xff0c;不包含第二个索…

智慧食堂数据分析系统

智慧食堂数据分析系统&#xff5c;大数据分析&#xff5c;数据可视化 Demo Repo&#xff1a;https://github.com/sylvanding/AI-Restaurant-Data-Analysis项目演示&#xff08;模拟真实运行环境&#xff09;&#xff1a;http://analysis.sylvanding.online数据展示静态页面&am…

鸿蒙系统全面解析,诞生背景、技术细节生态圈一文看懂

编辑&#xff1a;智东西内参华为6月2日正式发布的鸿蒙系统无疑占据了最近热点话题的C位&#xff0c;虽然不全是赞美的声音&#xff0c;但这种努力打破美国垄断&#xff0c;挑战谷歌、苹果在移动操作系统上垄断地位的尝试必将成为中国科技史上的里程碑事件。本期的智能内参&…

python-字典

字典映射&#xff1a;通过名字来引用值&#xff1b;字典是python中唯一内建的映射类型&#xff1b;1)创建字典&#xff1a;字典有键-值对(项)组成&#xff0c;键和值之间通过冒号(:)隔开&#xff0c;项之间通过逗号(,)分割&#xff0c;整个字典由大括号括起来&#xff1b;空字典…

2021十大人工智能趋势

来源&#xff1a;雷锋网6月5日&#xff0c;以“交叉、融合、相生、共赢”为主题的2021全球人工智能技术大会&#xff08;GAITC 2021&#xff09;在杭州举行。会上&#xff0c;腾讯优图联合厦门大学人工智能研究院共同发布《2021十大人工智能趋势》&#xff08;以下简称“趋势报…

通过CTY、VTY、TTY访问网络设备[计网实践Cisco Packet Tracer]

实验一&#xff1a;接入网络设备 学习目标 CTY访问网络设备VTY访问网络设备TTY访问网络设备WEB访问网络设备 实验环境 Cisco Packet Tracer 6.0 原创文章&#xff0c;转载请注明出处&#xff1a;©️Sylvan Ding ❤️ 实验内容 CTY访问设备 CTY是指通过Console接口访…

细数二十世纪最伟大的10大算法

来源&#xff1a;深度学习于机器视觉编辑&#xff1a;nhyilin一、1946 蒙特卡洛方法[1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also known as the Monte Carlo method.]1946…