以下内容全部来自操作系统原理
功能目标:
页面置换算法的目标主要是减少页面置换次数
1. 最优页面置换算法:
最优页面置换算法
基本思路:当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个,作为被置换的页面。这只是一种理想情况,在实际系统中是无法实现的,因为操作系统无从知道每一个页面要等待多长时间以后才会再次被访问。可用作其他算法的性能评价的依据(在一个模拟器上运行某个程序,并记录每一次的页面访问情况,在第二 遍运行时即可使用最优算法)
2. 先进先出算法(FIFO)
基本思路:选择在内存中驻留时间最长的页面并淘汰,其实就是谁最先进来,谁就最先被淘汰.
实现机制:所有在内存的页面按照进入时间的顺序用链表链接起来.当有新的页面加进来的时候,只需要修改链表头上的页面,新加进来的页面放在链表的末端.
优点:简单以实现.
3. 最近最久未使用方法(LRU)
LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有也面中t值最大的,即最近最久未使用的页面予以淘汰。
5. 时钟页面算法
**下面内容来自[页面置换算法之Clock算法](https://www.cnblogs.com/wingsless/p/12295246.html)**
时钟置换算法可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。我们给每一个页面设置一个标记位u,u=1表示最近有使用u=0则表示该页面最近没有被使用,应该被逐出。
按照1-2-3-4的顺序访问页面,则缓冲池会以这样的一种顺序被填满:
注意中间的指针,就像是时钟的指针一样在移动,这样的访问结束后,缓冲池里现在已经被填满了,此时如果要按照1-5的顺序访问,那么在访问1的时候是可以直接命中缓存返回的,但是访问5的时候,因为缓冲池已经满了,所以要进行一次逐出操作,其操作示意图如下:
最初要经过一轮遍历,每次遍历到一个节点发现u=1的,将该标记位置为0,然后遍历下一个页面,一轮遍历完后,发现没有可以被逐出的页面,则进行下一轮遍历,这次遍历之后发现原先1号页面的标记位u=0,则将该页面逐出,置换为页面5,并将指针指向下一个页面。
假设我们接下来会访问2号页面,那么可以直接命中指针指向的页面,并将这个页面的标记为u置为1。
但是考虑一个问题,数据库里逐出的页面是要写回磁盘的,这是一个很昂贵的操作,因此我们应该优先考虑逐出那些没有被修改的页面,这样可以降低IO。
因此在时钟置换算法的基础上可以做一个改进,就是增加一个标记为m,修改过标记为1,没有修改过则标记为0。那么u和m组成了一个元组,有四种可能,其被逐出的优先顺序也不一样:
(u=0, m=0) 没有使用也没有修改,被逐出的优先级最高;
(u=1, m=0) 使用过,但是没有修改过,优先级第二;
(u=0, m=1) 没有使用过,但是修改过,优先级第三;
(u=1, m=1) 使用过也修改过,优先级第四。
5. 二次机会法
第二次机会算法的基本思想是与FIFO相同的,但是有所改进,避免把经常使用的页面置换出去。当选择置换页面时,依然和FIFO一样,选择最早置入内存的页面。但是二次机会法还设置了一个访问状态位。所以还要检查页面的的访问位。如果是0,就淘汰这页;如果访问位是1,就给它第二次机会,并选择下一个FIFO页面。当一个页面得到第二次机会时,它的访问位就清为0,它的到达时间就置为当前时间。如果该页在此期间被访问过,则访问位置为1。这样给了第二次机会的页面将不被淘汰,直至所有其他页面被淘汰过(或者也给了第二次机会)。因此,如果一个页面经常使用,它的访问位总保持为1,它就从来不会被淘汰出去。
第二次机会算法可视为一个环形队列。用一个指针指示哪一页是下面要淘汰的。当需要一个存储块时,指针就前进,直至找到访问位是0的页。随着指针的前进,把访问位就清为0。在最坏的情况下,所有的访问位都是1,指针要通过整个队列一周,每个页都给第二次机会。这时就退化成FIFO算法了。
全局页置换算法:https://blog.csdn.net/yinyang_ddl/article/details/89439471
在局部算法里面并没有考虑各个进程之间的访存差异,全局置换算法为进程分配可变数目的物理页面。常驻集是指进程在运行时,当前时刻实际驻留在内存当中的页面集合。而工作集是进程在运行过程所固有的特征。置换算法的工作就是在进程的工作集的前提下,确定常驻集的大小以及相应页面。