前篇在此: 
操作系统笔记(五) 虚拟内存,覆盖和交换技术 
操作系统 笔记(三)计算机体系结构,地址空间、连续内存分配(四)非连续内存分配:分段,分页

内容不多,就不做index了。

功能:当缺页中断发生时,需要调入新的页面而内存已满时,需要选择哪个物理页面被置换? 
目标:尽可能减少缺页中断(页面的换入换出)次数。在局部性原理下根据过去的数据统计预测。 
页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分,或时间关键的应用进程(time-critical)。需要在页表中添加锁定标志位(lock bit)

比较不同的页面置换算法: 
设置一个实验环境,记录一个进程对页访问的轨迹。 
虚拟地址跟踪(3,0) (1,9) (4,1)…… 
偏移可忽略,只用页号生成页面轨迹3,1,4 …… 
模拟一个页面置换的行为并且记录产生缺页的数量,越少越好

(1) 最优界面置换算法: 
选择内存中等待时间最长的页作为置换页面。 
只能是理想情况,OS不知道啊。 
可以作为最佳的标准,在第二遍运行时利用第一次的访问轨迹使用最优算法。其他算法应尽量逼近。 

(2) 先进先出算法 first-in first-out FIFO 
选择在内存中驻留时间最长的页面并淘汰之。OS维护着一个队列链表,淘汰首位,添加末位。 
性能较差,调出的页面可能是常用页面(驻留时间长,本身就说明可能常用),有belady现象(给的物理页帧越多反而缺页越频繁)。 
FIFO belady现象:分配的物理页数增加,缺页率反而提高,原因是FIFO忽视了进程访问的动态特征。多次访问的不要走。尤其是最坏情况发生时,易高缺页率。 
Belady 是个人名,不要想多了。。。 
很少单独使用

(3)  最近最久未使用算法least recently used LRU 
选择最久未使用的那个页面淘汰掉。 
是对最优置换算法的近似,以过去推未来。根据程序的局部性原理,如果最近一段时间内某些页面被频繁访问,那么在将来还可能被频繁访问。反之,未被访问的将来也不会被访问。 
程序应具有较好的局部性。 

需要记录各个页面使用时间的先后顺序,开销大。 
两种可能的实现方法: 
系统维护一个页面链表,最近刚使用的页面最为首节点,最久未使用的页面作为尾节点,每次访问内存动态更新头结点。缺页中断时,淘汰末位的页面。 
活动页面堆栈:访问某页时,将此页号入栈,并去除栈内的重复页。淘汰栈底的页面。(栈是先进后出,只有栈顶开口,怎么push栈底?)

动态更新(插,删,内部调整)堆栈和链表要开销,注意平衡—不是最有效

(4)  时钟页面置换算法 clock ——LRU的近似,FIFO的改进 
用到页表项的访问位(access bit),当一个页面被装入内存时,把该位初始化为0,被访问(读/写)时,硬件把它置为1. 而OS会定期清0。(1—最近被访问,0—-未访问) 
把各个页面组成环形链表类似一个clock,指针指向最老的页面。 
当发生一个缺页中断时,考察指针所指的最老页面,访问位是0则淘汰,如果是1则置为0,然后指针向下移动一格。如此下去直到淘汰某页。 
在内存中维持一个环形页面链表,更新并删除used bit=0的页面 
替换的应该是PAGE=1,把需要的新页面放到物理帧号为5的位置

(5)二次机会法 
区分读和写,enhanced clock algorithm 
读和写都是访问,dirty bit是写位,如果写,为1,否则是0。同时使用脏位和使用位。 
修改clock算法,使它允许脏页总是在一次时钟头扫描时保留下来,以减少写回硬盘的操作(仅读的页可以直接释放) 
需要替换的页,其访问位和脏位都是0,如果都是 1,则有两次机会才被淘汰。从而让更多使用频率的页有更多的机会留在内存中。 
较为接近LRU算法,尽量保存dirty page,更好地减少了访问外存

(6)最不常用算法(least frequently used)LFU 
选择置换访问次数最少的那个页面 
对每个页面设置访问计数器,每当一个页面被访问时,++。淘汰数值最小的那个。 
硬盘计数器空间开销,排序查找时间开销;

LRU/LFU区别:LRU考察的是多久未访问,时间越短越值得留在内存,LFU是访问次数/频度,次数越多越好。 
反例:一个页面在进程开始时使用的很多,但以后就不使用了。此时LFU就不适用了。 
把时间也考虑进去,在一段时间内考察LFU。比如,定期把次数寄存器右移一位。

综合比较局部页替换算法 
都是 针对一个程序 站在算法角度本身考虑

LRU和FIFO本质都是先进先出,但LRU是页面的最近访问时间而不是进入内存的时间,有动态调整,符合栈算法的特性,空间越大缺页越少。如果程序局部性,则LRU会很好。如果内存中所有页面都没有被访问过会退化为FIFO。 
Clock 和enhanced clock也是类似于FIFO的算法,但用了硬件的BIT来模拟了访问时间和顺序,近似了LRU,综合起来较好,但也会退化为FIFO。 
都对程序的访问次序有局部性的要求,不然都会退化。 
开销上,LRU开销大,FIFO开销小但BELADY,折中的是clock算法,开销较小,对内存中还未被访问的页面,效果等同LRU。对曾经被访问过的则不能记住其准确位置。

全局置换算法 
局部页替换算法的问题、工作集模型 
分配的物理页帧的数目对置换算法的效果有很大的影响。 
程序的运行具有阶段性,是动态变化的过程,开头结尾较多,中间较少,都分配固定的物理页帧则失去了灵活性。

工作集模型: 
如果局部性原理不成立,那各种算法都没啥区别,比如是单调递增,那不管哪种都会缺页中断。 
利用工作集模型来表征局部性。 
工作集(working set):一个进程当前使用的逻辑页面集合 
可以用一个二元函数W(t,Δ),t是当前执行时刻,Δ是工作集窗口 working-set window,一个定长的页面访问的时间窗口。t+Δ构成了一个时间段,W(t,Δ)就是在当前时刻t之前的Δ时间内所有访问页面组成的集合,在随t不断更新。| W(t,Δ)|是工作集的大小即页面数目。 
进程开始后,随着访问新页面逐步建立较稳定的工作集,当内存访问的局部性区域的位置大致稳定时| W(t,Δ)|波动很小,在过渡阶段,则会快速扩张和收缩过渡到下一个稳定值。有波峰,有波谷。

常驻集:在当前时刻,进程实际驻留在内存当中的页面集合。 
工作集是固有性质,常驻集取决于系统分配给进程的物理页面数目和所采用的置换算法。如果一个进程的常驻集与工作集尽量重叠,则不会造成太多缺页中断。当常驻集大小达到某个数目后,再分配物理页帧也不会有明显下降的缺页率——可以把多出来的物理页帧分给其他程序了。

2个全局算法: 
工作集缺页置换算法: 
追踪之前的(Δ)个引用。 
老的页会随着时间不断的换出,不管是否有缺页中断。确保物理页帧始终有空余的,给其他程序提供内存,让系统的缺页率降低。 
缺页率页面置换算法 
刚才的窗口是固定的。 
可变分配策略:常驻集大小可变 
可采用全局页面置换的方式,当发生一个缺页中断时,被置换的页面可以在其他进程中,各个并发进程竞争地使用物理页面。依据是缺页率。多的说明需要内存。缺页率算法(PFF, page fault frequency)动态调整常驻集的大小。性能较好,但增加了系统开销 
缺页率=缺页次数/内存访问次数 
=1/缺页的平均时间间隔 
影响因素有页面置换算法,分配给进程的物理页面数目(越多越小),页面本身的大小(页面大则会小),编程方法(局部性好就会小)

若缺页率高则增加工作集(Δ)来分配更多物理页面,若过低则减少工作集来减少其物理页面。使缺页率保持在一个合理的范围内。各个程序之间保持一个平衡。

具体机制:根据缺页的时间间隔来判断 动态更新 
保持追踪缺页概率,记录上次缺页到这次的时间间隔 
t(current) -t(last),与T比较(自定义一个合理的间隔),若大于T,则缺页率小,可增加工作集,否则增加缺失页到工作集中。

抖动问题(thrashing): 
如果分配给一个进程的物理页面太少,常驻集远小于工作集,则缺页率会很大,频繁在内外存之间替换页面,使进程的运行慢,这种状态成为”抖动”。 
随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减少,缺页率上升。因此OS要选择一个适当的进程数目和进程需要的帧数,在并发水平和缺页率中达到平衡。 
抖动问题可能被本地的页面置换改善。加载控制(better criteria for load control: adjust MPL so that): 
 
mean time between page faults(MTBF)= PFST page fault service time 
∑▒WSt=内存的大小

程序开的多,OS忙于换进换出的I/O操作,用于运行程序的cpu少了。找到交汇点,此时可以并发执行的程序个数和cpu利用率都较好,总体达到平衡。另一方面,如果仅有一个程序,但它很大,也会导致抖动。

下篇在此:

操作系统清华向勇陈渝版笔记(七) 进程与线程 PCB TCB 进程挂起 用户线程 内核线程 轻量级进程 僵尸队列

操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法的更多相关文章

  1. 页置换算法FIFO、LRU、OPT

    页置换算法FIFO.LRU.OPT 为什么需要页置换 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断.当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调 ...

  2. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  3. 虚存管理页面置换算法 — FIFO和RUL算法模拟实现

    本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...

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

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

  5. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  6. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  7. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

  8. 【操作系统】页面置换算法(最佳置换算法)(C语言实现)

    [操作系统]页面置换算法(最佳置换算法)(C语言实现) (编码水平较菜,写博客也只是为了个人知识的总结和督促自己学习,如果有错误,希望可以指出) 1.页面置换算法: 在地址映射过程中,若在页面中发现所 ...

  9. 操作系统-1-存储管理之LFU页面置换算法(leetcode460)

    LFU缓存 题目:请你为 最不经常使用(LFU)缓存算法设计并实现数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1 ...

随机推荐

  1. mvc 中英文切换

    我常用的2个方案,其实性质是一样的 方案1,使用过滤器 ActionFilterAttribute,这个就不细说了,比较方便. 实现一个继承自ActionFilterAttribute的类,实现OnA ...

  2. 调用 Webapi 跨域

    先讲一下,web和client各自调用webapi的post和get实例 Get方式 [HttpGet] public dynamic Test(string a) { return a+" ...

  3. JAVA内部类小结

    内部类的概念:定义在其他类里面的类叫做内部类,包含内部类的类叫做外部类: 内部类的作用:内部类主要是用来描述一个事物存在于另一个事物里面,依赖于外部事物存在的: 内部类的格式: 内部类的分类: 成员内 ...

  4. Migrate Maven Projects to Java 11

    Migrate Maven Projects to Java 11 So you want to migrate to Java 11 but your Maven project is still ...

  5. (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果

    环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...

  6. linux运维、架构之路-linux文件属性

    1.查看文件属性 ls -lhi 文件属性详细说明 1. 第一列: inode索引节点编号 2. 第二列:文件类型及权限 3. 第三列:硬链接数 4. 第四列:文件或目录所属的用户,即文件的所有者 5 ...

  7. 51nod 1061 最复杂的数V2

    题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...

  8. luogu1080 国王游戏(贪心+高精度)

    貌似这道题是碰巧蒙对了贪心的方式..就是把ai*bi越小的放在越前面 (不过也符合直觉) 然后统计答案需要用高精度,然后就调了一年 #include<cstdio> #include< ...

  9. numpy 从入门到遗忘

    不常用的函数总是遗忘,很是困扰啊.于是痛下时间,做一个系统的总结,纯原创,都是些实际项目中常用的函数和方法,当然还有一些这边也是没有记录的,因为我在实际数据处理过程中也没有遇到过(如字符串处理等等). ...

  10. module模块和包(十七)

    在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办法,把这些定义存放在文 ...