操作系统理论 第五章(虚拟存储器)—第三节(页面置换算法)

本文主要是介绍操作系统理论 第五章(虚拟存储器)—第三节(页面置换算法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面:

  1. 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
  2. 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili

一、概述

        在进程运行过程中,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,需从内存中调出一页程序或数据,送入磁盘的对换区,但应将哪个页面调出,需根据一定的算法来确定。把选择换出页面的算法称为页面置换算法,其好坏直接影响系统的性能。

        不适当的算法可能会导致进程发生“抖动”,即刚被换出的页很快又要被访问,需要将它重新调入,此时又需要再选一页调出而此刚被调出的页很快又被访,又需将它调入,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上,我们称该进程发生了抖动

        一个好的置换算法应具有较低的页面更换频率,从理论上讲,应将那些以后不会再访问的页面换出,或者把那些在较长时间内不会再访问的页面换出。

二、最佳置换算法和先进先出算法

1、最佳置换算法

(1)最佳置换算法是由Belady于1966年提出的一种理论上的算法,其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面

(2)采用最佳置换算法通常可保证获得最低的缺页率,但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。

(3)假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串。

①进程运行时,先将7、0、1三个页面装入内存。

②以后,当进程要访问页面2时,将会产生缺页中断,此时OS根据最佳置换算法将选择页面7予以淘汰,这是因为页面0将作为第5个被访问的页面,页面1是第14个被访问的页面,而页面7则要在第18次页面访问时才需调入。

③下次访问页面0时,因它已在内存而不必产生缺页中断。

④当进程访问页面3时,又将引起页面1被淘汰,因为它在现有的1、2、0三个页面中,将是以后最晚才被访问的。

⑤以此类推,可得到下图所示的最佳置换算法置换图。

2、先进先出算法

(1)该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰

(2)该算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中有些页面经常被访问,比如含有全局变量、常用函数、例程等的页面,先进先出算法(FIFO)并不能保证这些页面不被淘汰。

(3)沿用上面的例子,采用FIFO算法进行页面置换。

①当进程第一次访问页面2时,将把第7页换出,因为它是最先被调入内存的。

②在第一次访问页面3时,又将把第0页换出,因为它在现有的2、0、1三个页面中是最老的页。

③以此类推,可得到下图所示的先进先出算法置换图。

(4)如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象,这种现象发生在FIFO(先进先出)置换算法

三、最近最久未使用和最少使用置换算法

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

(1)LRU置换算法根据页面调入内存后的使用情况进行决策。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰

(2)该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

(3)沿用上面的例子,利用LRU算法进行页面置换。

①当进程第一次对页面2进行访问时,由于页面7是最近最久未被访问的,故将它置换出去。

②当进程第一次对页面3进行访问时,第1页成为最近最久未使用的页,将它换出。

③以此类推,可得到下图所示的LRU算法置换图。

(4)LRU置换算法虽然较好,但需较多的硬件支持,为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,需有以下两类硬件之一的支持:

①寄存器:

        为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为R=R_{n-1}R_{n-2}R_{n-3}\cdots R_{2}R_{1}R_{0}当进程访问某物理块时,要将寄存器相应的R_{n-1}位置成1,此时定时信号将每隔定时间将寄存器右移一位,如果把n位寄存器的数看作是一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。(简单说,这个寄存器的作用就是计时,记录一个页面自上次被访问以来所经历的时间)

        下图示出了某进程在内存中具有8个页面、为每个内存页面配置一个8位寄存器时的LRU访问情况,把8个内存页面的序号分别定为1~8。由图可以看出,第3个内存页面的R值最小,当发生缺页时,应首先将它置换出去。

②栈:

        可利用一个特殊的栈保存当前使用的各个页面的页面号,每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶因此,栈顶始终是最新被访问页面的编号而栈底则是最近最久未使用页面的页面号

        假定现有一进程,它分有五个物理块,所访问的页面的页面号序列如下图所示。

        [1]在前三次访问时,系统将依次将4、7、0放入栈中,4是栈底,0是栈顶;第四次是访问第7页,使7成为栈顶。

        [2]在第八次访问页面2时,该进程的五个物理块都已装满,在第九和十次访问时,未发生缺页。

        [3]在第11次访问页面6时发生了缺页,此时页面4是最近最久未被访问的页,应将它置换出去。

2、最少使用置换算法(LFU)

(1)在采用LFU算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在最近时期使用次数最少的页面作为淘汰页

(2)在最少使用置换算法中采用了移位寄存器方式,每次访问某页时,便将该移位寄存器的最高位置1,再每隔一定时间右移一次,这样,在最近一段时间使用最少的页面将是\sum R_{i}最小的页。LFU置换算法的页面访问图与LRU置换算法的访问图完全相同,或者说,利用这样一套硬件既可实现LRU 算法,又可实现LFU 算法。

(3)需要说明的是,这种算法并不能真正反映出页面的使用情况,因为在每一时间间隔内只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页访问1次和访问1000次是完全等效的。

四、Clock置换算法

1、简单的Clock置换算法

(1)为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列,当某页被访问时,其访问位被置1置换算法在选择一页淘汰时,只需检查页的访问位,如果是0就选择该页换出;若为1则重新将它置0,暂不换出,给予该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面,当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面

(2)简单的Clock置换算法又称最近未使用算法。

2、改进型Clock置换算法

(1)在改进型Clock算法中,除须考患页面的使用情况外,还须再增加一个因素——置换代价(对于修改过的页面,在换出时需要重新写回磁盘上,开销比较大),这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面,把同时满足这两个条件的页面作为首选淘汰的页面。

(2)由访问位A和修改位M可以组合成下面四种类型的页面:

①A=0,M=0:表示该页最近既未被访问,又未被修改,是最佳淘汰页。

②A=0,M=1:表示该页最近未被访问,但已被修改,并不是很好的淘汰页。

③A=1,M=0:表示最近已被访问,但未被修改,该页有可能再被访问。

④A=1,M=1:表示最近已被访问且被修改,该页可能再被访问。

(3)在进行页面置换时,可采用与简单 Clock算法相类似的算法,其差别在于该算法须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程可分成以下三步:

①从指针所指示的当前位置开始扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。

②如果第一步失败,即查找一轮后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。

③如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0,然后重复第一步,即寻找A=0目M=0的第一类页面,如果仍失败必要时再重复第二步,寻找A=0且M=1的第二类页面,此时就一定能找到被淘汰的页。

五、页面缓冲算法

1、影响页面换进换出效率的若干因素

(1)页面置换算法。影响页面换进换出效率最重要的因素,无疑是页面置换算法,因为一个好的页面置换算法,可使进程在运行过程中具有较低的缺页率,从而可以减少页面换进换出的开销。

(2)写回磁盘的频率。对于已经被修改过的页面,在将其换出时应当写回磁盘。如果是采取每当有一个页面要被换出时就将它写回磁盘的策略,这意味着每换出一个页面,便需要启动一次磁盘,但如果在系统中已建立了一个已修改换出页面的链表,则对每一个要被换出的页面(已修改),系统可暂不把它们写回磁盘,而是将它们挂在已修改换出页面的链表上,仅当被换出页面数目达到一定值时,再将它们一起写回到磁盘上,这样就显著地减少了磁盘 I/O的操作次数,或者说,减少已修改页面换出的开销。

(3)读入内存的频率。在设置了已修改换出页面链表后,在该链表上就暂时有一批装有数据的页面,如果有进程在这批数据还未写回磁盘时需要再次访问这些页面时,就不需从外存上调入,而直接从已修改换出页面链表中获取,这样也可以减少将页面从磁盘读入内存的频率,减少页面换进的开销。

2、页面缓冲算法PBA的实现

(1)PBA算法的主要特点是:

①显著地降低了页面换进、换出的频率,使磁盘I/O的操作次数大为减少,因而减少了页面换进、换出的开销。

②正是由于换入换出的开销大幅度减小,才能使其采用一种较简单的置换策略,如先进先出算法,它不需要特殊硬件的支持,实现起来非常简单。

(2)VAX/NMS操作系统中所使用的页面缓冲算法,内存分配策略上采用了可变分配和局部置换方式,系统为每个进程分配一定数目的物理块,系统自己保留一部分空闲物理块。为了能显著地降低页面换进、换出的频率,在内存中设置了如下两个链表:

①空闲页面链表:

        实际上该链表是一个空闲物理块链表,是系统掌握的空闲物理块,用于分配给频繁发生缺页的进程、以降低该进程的缺页率,当这样的进程需要读入一个页面时,便可利用空闲物理块链表中的第一个物理块来装入该页。

        当有一个未被修改的页要换出时,实际上并不将它换出到外存,而是把它们所在的物理块挂在空闲链表的末尾,这些挂在空闲链表上的未被修改的页面中是有数据的,如果以后某进程需要这些页面中的数据时,便可从空闲链表上将它们取下,免除了从磁盘读入数据的操作,减少了页面换进的开销。

②修改页面链表:

        它是由已修改的页面所形成的链表,设置该链表的目的是为了减少已修改页面换出的次数,当进程需要将一个已修改的页面换出时,系统并不立即把它换出到外存上,而是将它所在的物理块挂在修改页面链表的末尾,这样做的目的是降低将已修该页面写回磁盘的频率,降低将磁盘内容读入内存的频率。

这篇关于操作系统理论 第五章(虚拟存储器)—第三节(页面置换算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

禁止HTML页面滚动的操作方法

《禁止HTML页面滚动的操作方法》:本文主要介绍了三种禁止HTML页面滚动的方法:通过CSS的overflow属性、使用JavaScript的滚动事件监听器以及使用CSS的position:fixed属性,每种方法都有其适用场景和优缺点,详细内容请阅读本文,希望能对你有所帮助... 在前端开发中,禁止htm