当内存中的页面满了之后,需要的数据又在磁盘虚拟内存中,可以使用页面置换算法将需要的页置换到物理内存中。下面先介绍几种局部页面置换算法,其针对一个进程而言的页面置换。

一、局部页面置换算法
1、最优页面置换算法

功能:当缺页中断发生时,需要调入新的页面而内存已满时,选择内存中哪个物理页面被置换。

目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体地说,将未来不再使用或者短期不再使用的页面置换出去。

页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键的应用程序。即那些必不可少的数据。

基本思路:当一个缺页中断发生时,对于保存在内存中的每一个逻辑页面,计算它的下一次访问之前还需要等待多长时间,从等待时间中选取最长的那个页面将其置换。

注意:该算法只是一种理想的情况,在实际时无法实现,因为操作系统是无法知道每个页面需要等待的时间。但是该算法可以作为页面置换算法的一个标杆,用以衡量其他页面置换算法的性能。

下图是一个页面置换算法的简单例子,假设物理内存中有4个页帧,表的第二行为某个进程调用页面的轨迹,开始的时候可以将abcd四个页存放到物理内存中,第1,2,3,4次调用时都在这4个页面范围内,第5次调用页面e,所以需要将物理内存中的abcd页进行时间的排序,按照下次调用时的时间长度,发现d最久,所以将d和e进行置换。

2、 先进先出算法(first in first out)
基本思路:选择在内存中驻留时间最长的页面进行置换。系统维护一个链表,记录在内存中的所有逻辑页,链首的位置驻留时间最长,链尾的位置驻留时间最短,当发生缺页中断时将链首的页面进行置换,将新加入的页面添加到链尾。

特点:性能较差,调出的页面可能是经常需要访问的页面,同时可能会发生Belady现象(后面介绍)。

下面是一个简单的例子,如何实现该算法:假设物理内存中只能包含4个页帧,开始时物理内存中预存abcd四个页面,在1、2、3、4时刻时进程用到的页面都在abcd的范围内所以不会产生缺页中断。

当第5时刻时,需要e页面,由于物理内存中不存在所以会产生缺页中断,需要进行页面置换,根据FIFO算法的规则选择驻留时间最长的页面a与e进行置换

后面再b不会产生缺页中断,然后a产生缺页中断,将物理页中的b置换,依次下去

3、最近最久未使用算法(Least Recently Used LRU)
基本思路:当发生缺页中断时,选择最久未使用的页面进行置换。

特点:它是对最优页面置换算法的一个近似,依据程序的局部性原理(即在最近一小段时间内(最近的几条指令),如果某些页面被频繁访问,那么在将来的一小段时间内它们可能会再一次被频繁访问)。

下面再使用一个例子对该算法进行简单说明:还是假设物理页存在4个页面,初始有abcd四个页面。1234时刻访问abcd都在物理内存中不会产生缺页中断。第5时刻e到来产生缺页中断,之前abcd四个页中c距离现在时刻是最久未被使用的页面所以将其置换,同理对后面的页面进行置换。

从上可知,系统需要记录每个页面的使用时刻,同时在每次使用页面时对这个时刻进行更新,这种方式的开销是比较大的。可以使用如下两种方式来进行实现:

①、使用链表。系统使用一个链表,链首保存刚刚使用的页面,链尾保存最久使用的页面,每次访问内存时,将最新被访问的页移到链首,如果发生缺页中断,将链尾的节点与需要的页面进行置换。

②、使用栈。当访问某页时,将该页放入栈顶位置,同时查看栈中是否有相同的页面,如果有将其拿出来。当需要置换的时候将栈底的页面进行置换即可。

比如将上面的例子使用栈的方式进行说明:1234时刻依次将页面放入栈中,第5时刻将栈底元素淘汰,然后将e放入栈顶,第6时刻b页面访问,将b提到栈顶位置。


4、时钟页面置换算法
基本思路:该算法基于在之前的虚拟内存章节说过的页表项中的访问位(access/used bit) ,当页面被加载到内存中时,该位被置为0,当该页面被访问(读/写)时该位被置为1。然后将各个页面组织成一个环形的链表,定义一个指针指向最先进驻内存的页面,当发生缺页中断时先观察指针指向的当前位置,如果访问位为0就与需要的页面进行置换,如果访问位为1将该位置为0,然后指向指向链表下一个元素,进行同样的操作直到找到目标位置,置换后将指针移动到下一个元素。访问位通常由硬件置1或0,软件也可以对其进行操作。

下面举一个例子对其进行说明:初始内存中有abcd四个页面,同时环形链表中的访问位都为1,指针指向a页面。第1234时刻都没有发生缺页中断,第5时刻发生缺页中断,需要进行页面置换,查看指针当前指向的页面的访问位是否为0,如果为0立即置换通知指针移动一位,如果不为0将其置为0然后移动指针。

所以当e进来时,指针从a>b>c>d,同时以此将访问位置为0,然后又来到a发现其访问位为0,将其置换。依次下去
该算法是通过访问位来进行的,通过类似于时钟的方式粗略的找到驻留时间最长的页面进行置换。该种算法较LRU算法的开销比较小,仅仅用一个bit位就能解决问题。

5、二次机会法
二次机会法有时也叫二次时钟法。在页表项中增加dirty bit位来增加一次扫描。dirty bit位是判断程序是否进行了写操作,如果进行了写操作该位会被置为1,在进行页面置换之前需要将数据更新到硬盘上从而保证数据的一致性,如果仅仅是进行了读操作是不需要对数据进行更新的。

该算法结合used bit和dirty bit对需要置换的页面进行查询。该算法将优先的对不需要进行数据更新的页面进行置换,所以提高了效率,因为io的读写开销是比较大的。

该算法页面置换的条件如下:

当used bit和dirty bit都为0时才进行置换,如果是其他情况需要对used bit和dirty bit进行修改然后移动指针,直到找到目标页面。

下面对该算法的实现举一个例子:初始内存中有abcd四个页面,页面右上角有w的字样表明进程对该页面进行了写操作,需要将dirty bit位置1,如果发生页面置换需要对数据进行更新才能进行页面置换。初始环形链表中有abcd四个页面,同时used bit=1 dirty bit=0,将1234时刻完成之后,ab页面的dirty bit=1,第5时刻发生缺页中断,指针从a页面开始查询,根据上图的规格进行置换与标志位设置,第一遍走完之后再走到c页面时c的标志位为used bit=0 dirty bit=0所以将该页面与e进行置换,后面的页面置换与前面的一致。

6、最不常用法(Least Frequently Used LFU)
基本思路:最不常用法即将访问次数最少的那个页面进行置换。

实现:为给每个页面添加一个计数器,使用一次该计数器就加1,然后对数字进行排序找到最小的即可。LRU是考察的最久未被使用,LFU考察的是使用频次最少。

缺点:该算法有一个明显的缺点,如果某个在进程开始时使用频次非常多,然后后面就不使用了,会导致该页面一直不会被置换。

7、LRU FIFO CLOCK算法的对比
LRU和FIFO算法本质上都是先进先出算法,只是LRU增加了时间上的概念,将最久未被使用的页面进行置换,正因为如此LRU算法需要在每次内存访问时修改页面的先后顺序。FIFO算法是根据页面进入内存时间来进行的,如果进入内存中的页面不会再被访问,那么FIFO算法也就退化成了LRU算法。

比如物理内存允许3个页帧,页面的访问顺序为1 2 3 4 5 6 1 2 3…,此时LRU算法也就退化成了FIFO算法。正是因为程序具有局部性,所以使得FIFO算法和LRU算法具有一定的区别。

LRU算法的开销是比较大的,FIFO算法开销比较小,但是容易噪声Belady现象(文章末尾介绍)。所以折中的办法就是clock算法,在每次进行内存访问时,不需要像LRU那样维护链表,仅仅根据标志位来记录,发生缺页中断时再查询需要置换的页面。

8、Belady现象
Belady现象是指在使用FIFO算法时,可能会出现分配物理页面数增加时,缺页发生的次数也增加。我们知道物理页面增多时,我们可以将更多的页面加载到内存中,出现缺页中断的次数也会相应减少,但是FIFO算法则不然。因为FIFO算法置换不会考虑进程对该页面是否访问得多或最近在访问,所以才会造成上述原因。

下面看个例子:物理页帧数为3,看到总共发生了9次缺页中断。

现在增加物理页帧数为4,发生了10次缺页中断。

二、全局页面置换算法
之前的局部页面置换算法或多或少的存在一些问题,如下,使用FIFO算法将会发生多次缺页中断,但是如果我们动态的调整物理内存中的页帧数就可以减少缺页中断的次数。同时局部页面置换算法针对单个进程而言的,全局页面置换算法是针对多个进程而言的置换算法。

局部页面置换算法是在程序具有局部性的背景下提出的,如果程序不具有局部性那么将会使得几种局部页面置换算法都变为一种页面置换算法,之间没有任何区别。

我们通过工作集来对物理页面进行定量表示。

1、工作集
工作集是指一个进程当前正在使用的逻辑页面的集合。用一个二元函数表示W(t, △),其中t表示当前时刻,△表示工作集窗口,相当于一个时间段。W(t, △)表示在当前时刻t之前△时间段内的页面集合。工作集的变化情况如下图所示:其总会趋于一个稳定状态,当局部性区域的位置发生变化时,其会扩张或者收缩但是都会最终趋于稳定。

2、常驻集
常驻集是指当前时刻,进程实际驻留在内存当中的页面集合。工作集的范围更广,指进程需要的页面集合,可能该页面在虚拟内存中。当进程的工作集都在内存中时,进程将会顺利的进行,不会造成太多的缺页中断,同时调整常驻集可以有效的改善缺页发生的次数,但是当常驻集数量增加到一定数量后,再给它分配更多的物理页面也不会使得缺页率下降。

举个例子:如下假设时间窗口△=4,t=-2时刻加入页面e,t=-1时刻加入页面d,t=0时刻加入页面a。然后1时刻访问c页面,直接将该页面加入到内存中。全局算法只会考虑时间窗口,没有的加进来,窗口之外的淘汰。

c页面进来时,内存中有e d a c四个页面按时间排序,2时刻还是访问c页面,由于 时间窗=4,t=-2时刻的页面被淘汰,即e页面被淘汰,此时内存中有d a c,3时刻访问d不变但是顺序变为a c d因为d页面是最新被访问的,4时刻访问b,根据时间窗的长度a页面被淘汰,剩下c d b,依次下去即可。

3、缺页率页面置换算法
基本思想:常驻集可变。每个进程在刚开始运行的时候为其预分配一些页面,然后在程序运行时动态的调整常驻集的大小。

缺页率:缺页次数/内存访问次数。影响缺页率的因素有:页面置换算法、分配给进程的物理页面数量、页面本身大小、程序编写方法。

如果缺页率过高,可以通过增加工作集从而增加更多的物理页面来降低缺页率。如果缺页率太低,可以通过减少工作集的方式来量缺页率保持在一定范围内。缺页率太低也说明内存占用可能是有冗余的。

举个例子:例如将窗口设置为2,如果两个缺页中断发生的时间长度大于2,表名工作集太多了需要移除,如果小于2表名工作集需要增加。

例如上面的例子,在4时刻时,需要移除部分工作集,移除的部分是1-4时刻之外的页面。以此对后面的进行操作。

4、抖动问题
如果常驻集小于工作集,会引起很多的缺页中断,内存与外存之间会频繁的进行页面置换操作。从而使得程序的运行变得缓慢,这种状态称为“抖动”。

产生抖动的原因为:随着进程数量的增加,分配给每个进程的物理页面数量会减少,从而导致缺页率增加。所以os需要在进程数与进程的物理页帧数之间做一个平衡。

抖动问题是可以通过本地页面置换改善的。首先先提两个关键词:MTBF与PFST,MTBF是指平均页缺失时间,表示内存中发生页缺失的平均时间长度,PFST是指页缺失时操作系统服务的时间(进行页面置换等一系列操作的时间)。

下图的横轴表示进程的数量,纵轴表示cpu的利用率,进程数量与cpu的利用率的关系如紫色线所示,Nmax处达到最大。理想的状态肯定就是Nmax处的状态,但是由于抖动所以可能无法达到最理想的状态,通过定义MTBF/PFST比值来确定最理想的状态。

当MTBF/PFST=1时达到理想状态,因为当比值>1时表明PFST时间太短存在IO过剩的问题,如果比值<1表明PFST>MTBF,即cpu会存在闲置的状态。

2020-11-22(操作系统——页面置换算法)相关推荐

  1. 操作系统——页面置换算法练习题

    操作系统--页面置换算法练习题 1.设某计算机的逻辑地址空间和物理地址空间均为64KB,按字节编址.若某进程最多需要6页(Page)数据存储空间,页的大小为1KB,操作系统采用固定分配局部置换策略为此 ...

  2. 计算机操作系统——页面置换算法

    声明:本篇博客参考书籍<计算机操作系统>(西安电子科技大学出版社) 文章目录 一.最佳页面置换算法 1.基本知识 2.算法思想 二.先进先出(FIFO)页面置换算法 1.基本知识 2.算法 ...

  3. 操作系统——页面置换算法

    一.页面置换算法简介 操作系统将内存按照页的进行管理,在需要的时候才把进程相应的部分调入内存.当产生缺页中断时,需要选择一个页面写入.如果要换出的页面在内存中被修改过,变成了"脏" ...

  4. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  5. 操作系统-页面置换算法

    实验六:页面置换算法 一. 实验目的( 页面置换 ) 在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断.当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选 ...

  6. 操作系统页面置换算法之先进先出(FIFO)页面置换算法(C语言实现)

    先进先出(FIFO)页面置换算法 [注]本代码数据及思路方法参考自<计算机操作系统(第四版)>汤小丹等 编著的教材. #include <iostream>int access ...

  7. 操作系统页面置换算法实验报告

    实验指导 一 .页面置换算法的基本内容 1.1 页面置换算法是在当进程运行过程中,若其要访问的页面不在内存且内存已满时,要决定将哪个页面换出的算法.常见的页面置换算法包括最佳置换.先进先出置换.最近最 ...

  8. 操作系统页面置换算法

    通常把选择换出页面的算法称为页面置换算法,置换算法的好坏直接影响到系统的性能,不适当的算法可能会导致抖动, 最近学习了一下,算是做一个笔记吧... 实现OPT和LRU置换算法 #include < ...

  9. 操作系统页面置换算法(最佳置换算法,FIFO,LRU,Clock)

    页面置换算法 为什么要页面置换 最佳置换算法 先进先出页面置换算法 LRU置换算法 Clock置换算法 为什么要页面置换 缺页中断: 在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断 ...

最新文章

  1. C/C++ 误区:fflush(stdin)
  2. 傅立叶变换、拉普拉斯变换、Z变换之间 篇二
  3. Windows完成端口的理解
  4. JS的隐式转换 从 [] ==false 说起
  5. ubuntu16.04下安装opencv出现libgtk2.0-dev配置失败问题解决方法
  6. c语言 string.h部分常用函数的实现
  7. 详解REST架构风格
  8. NS2典型例子简单分析
  9. postgresql 索引使用参考
  10. 架构之每天数十亿次请求的web应用经验分享
  11. 超详细 excel 基础知识
  12. sony媒体服务器文件不对,索尼Z280断电MXF变成RSV文件完美修复
  13. ipv6测试工具-支持ipv6的web压力测试工具curl-load
  14. Milvus 揭秘| 向量索引算法HNSW和NSG的比较
  15. has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister
  16. ArcMap模型:批量导出shp
  17. 好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效button
  18. 谷歌服务框架(google services framework)是什么?
  19. AEC IATF16949 - AEC-Qxxx 质量体系IATF16949 -芯片进入汽车领域的门槛
  20. html数字拼图游戏,JavaScript_JS写的数字拼图小游戏代码[学习参考],复制代码 代码如下:html - phpStudy...

热门文章

  1. php drive mssql,PHP 连接 MSSQL 2005/2008 以UTF8存取 并让ADODB支持的安装设置
  2. 成功解决利用matplotlib.pyplot进行绘图的时候整个画布中的绘制曲线只显示一部分
  3. Py之pywin32:Python库之pywin32的简介、安装、使用方法之详细攻略
  4. DL之YoloV3:Yolo V3算法的简介(论文介绍)、各种DL框架代码复现、架构详解、案例应用等配图集合之详细攻略
  5. 任务间通信的基本知识
  6. angularJS前台传list数组,后台springMVC接收数组
  7. 微信公众平台--3.普通消息交互(发送与接收)
  8. [嵌入式]Bootloader的作用
  9. iOS - 让view触发点击事件
  10. 机器学习 回归篇(1)——多元线性回归