目录
0.页面置换算法总览
1.最优页面置换算法
2.先进先出算法FIFO
3.最近最久未使用算法LRU
4.时钟页面置换算法
0.页面置换算法总览



我们有一系列的页面置换算法,如何有效地分析比较他们呢?
我们需要设置一定的实验环境.
我们当然可以写出一些页面置换算法然后进行测试,但是我们可以用更简单的方法进行测试.
我们可以设置模拟的环境,比如说一个正在运行的程序有一系列的内存访问,我们把内存地址
记录下来形成序列,以页号和偏移作为标记.这一系列的标记位就形成了一个访问轨迹,我们
在考虑页面置换算法的时候可以忽略偏移部分,只关注页号,因为只有在一个也不存在的时候
才会产生缺页中断,才需要去考虑是否需要将页置换出去,如果说要对一个页进行多次访问,
一般情况只有在第一次的时候才可能产生缺页异常,除非在后面这个页又被置换出去了,否则
之后内容被加载到内存中后很难产生缺页异常了.
至此,我们可以得到由页号组成的页面轨迹,可以将其抽象成一个轨迹list,我们可以基于这
个list来设计页面替换算法,以此来探讨在一定物理页的情况下,各个算法的缺页产生情况.
一般来说,更少的缺页就意味着更好的性能.
1.最优页面置换算法



需要预知未来,根据未来推测未来,未来是未知的,在现实中无法实现这种算法,
更多时候作为参考和验证算法的优劣.
2.先进先出算法FIFO


3.最近最久未使用算法LRU




LRU的结果不错,代价也需要考虑,如果代价太大就不是一个合适的方法.
操作系统的设计首先要高效,第二要简洁,需要做一个平衡.
LRU的实现的开销很大.
4.时钟页面置换算法


前置知识:
每次访问一个页的时候,硬件会自动将used bit置成1,表示这个页刚刚被访问过.
指针对于页表项的操作是:
顺时针探测,
如果页表项中的used bit是1,则将其置成0,然后继续探测;
如果页表项中的used bit是0,则将这个页表项替换出去,然后继续探测;
如图,如果从Page 0开始探测,那么它的探测过程是:
(1)Page 0的used bit会被置成0,探测Page 3;
(2)Page 3的used bit会被置成0,探测Page 1;
(3)Page 1会被替换出去,将当前需要访问的那个页加载进来;
(4)Page 7的used bit会被置成0,探测Page 4;
(5)Page 4会被替换出去,将当前需要访问的那个页加载进来.
问题:
是请页一次,指针跳一次吗?
按照老师说的这个思路,貌似是这样的.
在实际中,Clock产生的缺页异常的次数是向LRU贴近的.
