操作系统之全局页面替换策略算法

简介: 本文章适用于本科院校学生期末速成操作系统中存储管理的全局页面替换策略的相关算法,也适用于计算机学院老师教学板书参考使用。

本文章适用于本科院校学生期末速成操作系统中存储管理的全局页面替换策略的相关算法,也适用于计算机学院老师教学板书参考使用。


在多道程序正常运行的过程中,属于不同进程的页面被分散存放在内存页框中,当发生缺页异常时,如果已无空闲页框,系统要选择一个驻留页面进行淘汰。在此讨论的是所有驻留页面都可作为置换对象的情况,而不管页面所属进程的全局页面置换算法。


本文以一道例题讲解三种算法:

在一个请求分页虚存管理系统中,一个程序运行的页面走向是:

1,2,3,4,2,1,5,6,2,1,2,3,7,6,3

分别用OPT、FIFO、LRU算法,对于分配给程序4个页框的情况,求出缺页异常次数和缺页中断率。


首先,我们可以画出这样的一个框,上面是程序运行的页面走向,下面是四行即四个页框,最下面一行是是否缺页,缺页即打√,不缺页就打×。

什么是缺页?

页框里没这个数字就是缺页,有这个数字就是不缺页

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1
页框 2 2 2 2
页框3 3 3
页框4 4
是否缺页


然后我们可以看到接下来的两个数字2和1都是在页框里有的数字,也就是说不缺页,就不需要替换(因为已经有了,如果没有,就需要替换),所以直接照着写就可以了:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1
页框2 2 2 2 2 2
页框3 3 3 3 3
页框4 4 4 4
是否缺页 × ×


↑↑↑后两种算法直接跳至此阶段↑↑↑

重点来了,这时候出现了一个5!那这个5应该怎么进入页框里呢?也就是该把已经在页框里的1,2,3,4哪个替换掉呢?这时候就需要看看我们OPT算法的核心思想了:当要调入新的一页而淘汰旧的一页时,选择淘汰未来不再使用的页,或距现在最长时间后才访问的页。所以我们看上面的运行的页面走向,发现4这个数字在后面都没有出现过,那我们就可以把4这个数字替换成5。如图所示:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1
页框 2 2 2 2 2 2 2
页框3 3 3 3 3 3
页框4 4 4 4 5
是否缺页 × ×

好家伙,又出现了一个6,这个时候要把页框里的1,2,3,5哪个替换掉呢?还是看上面的运行的页面走向,看一下哪个数字是距现在最长时间后才访问的!2,1,2,3,7,6,3,发现1,2,3在后面都有访问,5没有,所以又要把5给替换掉(5太惨了,刚来了又要走了),如图:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2 2
页框 3 3 3 3 3 3 3
页框4 4 4 4 5 6
是否缺页 × ×


后面的2,1,2,3都是页框里有的数字,所以我们照填就可以了,如图:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2 2 2 2 2 2
页框3 3 3 3 3 3 3 3 3 3 3
页框4 4 4 4 5 6 6 6 6 6
是否缺页 × × × × × ×


然后OPT算法中最大的问题来了,出现了个7,那把谁替换成7呢?我们先看最上面,有6和3,没有1和2,那是把1替换成7还是把2替换成7呢?我也不知道,因为程序页面引用串是无法预知的,不可能对程序的运行过程做出精准断言,也就是说后面的运行页面是随机的,谁也不知道哪个页面是距现在最长时间后才访问的页,所以不知道用哪个去替换。


OPT算法的缺点如上所说,计算机没有预知未来的能力,而OPT想要通过预知未来回天改命是不行的。OPT算法也只能作为一个理论算法。

那下面我们来看看先进先出页面替换算法(FIFO

二、先进先出页面替换算法

核心思想:基于程序总是按线性顺序来访问物理空间这一假设,总是淘汰最先调入内存的页面,即淘汰在内存中驻留时间最长的页面,认为驻留时间最长的页不再使用的可能性较大。

简单来说就是谁先进入页框,然后遇到缺页的情况了,就把先进入页框的数字给替换掉。

表格的情况如下:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1
页框2 2 2 2 2 2
页框3 3 3 3 3
页框4 4 4 4
是否缺页 × ×


这个时候,5出现了,那么应该把谁替换成5呢?因为是1先进来的,所以把1给替换掉。如图:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 5 5
页框2 2 2 2 2 2 2 6
页框3 3 3 3 3 3 3
页框4 4 4 4 4 4
是否缺页 × ×


后面的2又回来了(刚走又叫我回来),这个时候看表格发现是3最先进入页框里的,就把3替换成2,如图:


页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 5 5 5
页框2 2 2 2 2 2 2 6 6
页框3 3 3 3 3 3 3 2
页框4 4 4 4 4 4 4
是否缺页 × ×


以此类推,最后的结果如图所示:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 5 5 5 5 5 3 3 3 3
页框2 2 2 2 2 2 2 6 6 6 6 6 7 7 7
页框3 3 3 3 3 3 3 2 2 2 2 2 6 6
页框4 4 4 4 4 4 4 1 1 1 1 1 1
是否缺页 × × × ×


三、最近最少使用页面替换算法

核心思想:最近最少使用页面替换算法淘汰的页面在最近一段时间内最久未被访问的那一页,它是基于程序局部性原理来考虑的,认为那些刚被使用过的页面可能还要被立即使用,而那些在较长时间内未被使用的页面可能不会立即使用。


前面两种算法在运行页面走向中是从左往右看的,这个算法是从右往左看的,简单来说,就是从右往左看,哪个在页框里的数字距当前要替换的数字越远,就替换掉它,如图所示:

当前表格的情况如下:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1
页框2 2 2 2 2 2
页框3 3 3 3 3
页框4 4 4 4
是否缺页 × ×


当5出现了,就在最上面的运行页面走向从右往左看,分别是1,2,4,3,2,1,可见在页框里的1,2,3,4中3离5最远,所以就把3给替换掉,此时的表格如下:


页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2
页框3 3 3 3 3 5
页框4 4 4 4 4
是否缺页 × ×


那现在6呢?还是老方法,从右往左看,页框中1,2,5,4谁离6最远?6前面是5,1,2,4,看样子是4离的最远,那就把4替换掉!如表格所示:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2 2
页框3 3 3 3 3 5 5
页框4 4 4 4 4 6
是否缺页 × ×


后面2,1,2都是在页框里的,那我们就照着写:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2 2 2 2 2
页框3 3 3 3 3 5 5 5 5 5
页框4 4 4 4 4 6 6 6 6
是否缺页 × × × × ×


这个时候出现了3,从右往左看,3的前面是2,1,2,6,5,怎么有两个2?出现两个2怎么算?只算第一个出现的,也就是2,1,6,5,所以我们把5给替换掉。

注意重点:


当出现多个相同的数字在前面的时候,只看第一个

如表格所示:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1 1 1 1 1
页框2 2 2 2 2 2 2 2 2 2 2 2
页框3 3 3 3 3 5 5 5 5 5 3
页框4 4 4 4 4 6 6 6 6 6
是否缺页 × × × × ×


以此类推。

最终的结果如表格所示:

页面走向 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3
页框1 1 1 1 1 1 1 1 1 1 1 1 1 1 6 6
页框2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
页框3 3 3 3 3 5 5 5 5 5 3 3 3 3
页框4 4 4 4 4 6 6 6 6 6 7 7 7
是否缺页 × × × × × ×


缺页异常次数

缺页异常次数就是看下面有多少是缺页的,也就是看多少个√,例如上面这个表格(LRU算法),出现的√有9个,那就是缺页异常9次

缺页中断率

缺页中断率=缺页异常次数/总次数

总次数就是一共有多少个页面走向,还是看上面的这个表格(LRU算法)

一共有15个页面走向,所以缺页中断率等于=9/15=3/5

本例题来自书

操作系统教程(第5版)费翔林 骆斌 编著

P248页 应用题第1题

感谢大家浏览,谢谢

相关文章
|
2月前
|
算法 调度 Python
深入理解操作系统中的进程调度算法
在操作系统中,进程调度是核心任务之一,它决定了哪个进程将获得CPU的使用权。本文通过浅显易懂的语言和生动的比喻,带领读者了解进程调度算法的重要性及其工作原理,同时提供代码示例帮助理解。
|
2月前
|
安全 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统优化策略####
当今数字化时代,移动应用已成为日常生活不可或缺的一部分,而移动操作系统则是支撑这些应用运行的基石。本文旨在探讨当前移动应用开发的最新趋势,分析主流移动操作系统的特点及优化策略,为开发者提供有价值的参考。通过深入剖析技术创新、市场动态与用户需求变化,本文力求揭示移动应用与系统协同发展的内在逻辑,助力行业持续进步。 ####
51 9
|
7天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
87 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
71 1
|
2月前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
38 2
|
2月前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
2月前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
55 1
|
2月前
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
45 4