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

内容不多,就不做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. BZOJ2069 POI2004ZAW(最短路)

    显然这样的路径一定是选择了与1相邻的不同的两点分别作为起点和终点(除1本身).如果能将每一组起点终点都计算到就可以得出最优解了.暴力显然不行.注意到我们每次求出的是单源最短路径,考虑如何充分利用信息. ...

  2. day5 continue 和 break的区别

    # continue num = 1 while num <=10: num += 1 if num == 3: continue print(num) # continue 表示跳出本次循环后 ...

  3. Intent 跳转Activity

    Intent 跳转 显示跳转(用类名跳转) Intent i = new Intent(a.this,b.class); 隐士跳转 自定义Action <!--配置跳转Activity--> ...

  4. 【Luogu3803】多项式乘法FFT(FFT)

    题目戳我 一道模板题 自己尝试证明了大部分... 剩下的还是没太证出来... 所以就是一个模板放在这里 以后再来补东西吧.... #include<iostream> #include&l ...

  5. ORMLite学习入门笔记

    ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...

  6. Holiday、Vacation、Days off、Leave、Break

    http://write.scu.edu.tw/view.php?bd=mistake&no=25 這些字在英文的用法中都有放假.休息的意思,但用法卻不太一樣,接下來就來看看它們的不同吧. 『 ...

  7. 关于阿里云Centos服务器搭建Java网站不能访问的问题

    首先阿里云提供的手册是没问题的 手工搭建 然后我在地址栏输入服务器地址之后总是提示无法访问! 输入命令 netstat -tunlp,80端口确实是在监听(这里不是8080,因为我在tomcat的配置 ...

  8. 漏洞评估工具Nexpose的配置使用

    nexpose是领先的漏洞评估工具之一.Nexpose社区版是一个免费的程序,其他版本是收费的.在这篇文章中,我们将使用Nexpose免费社区版,里面有扫描32主机的能力.用户界面干净.报告强大.像大 ...

  9. sklearn11_函数汇总

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  10. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'Address'中的标识列指

    在有自增长的SQL表格里面插入指定ID的数据的时候,会禁止你操作,提示如题目,解决办法: set identity_insert address on ,,,) set identity_insert ...