最近复习到了页面置换算法忍不住写一篇
FIFO先进先出算法,这个不是FIFA,虽然看着很像,算法是先进先出规则,加入驻留级只有3个,我们可以假设有一张桌子 TT 大概就是这样桌子上能放得下最多3个数字,放置方式就是从一边推过去,如果满了必然会把最外面的推下去
比如这么一串访问串1 2 3 4 1 5 1 3 4 2 6
我们将它从右边推到桌子上,就是 1 2 3,之后把4推过去1就被挤掉了变成了2 3 4,如此反复fifo是不会改变顺序的,到4 1 5的时候1又出现了但已经存在了,这时候fifo的做法就是将其无视继续往后走知道把最后一个推上桌子。
fifo是唯一一个有belady现象的算法,基本上二者是绑定的。
LRU算法
这个算法可以当成fifo的改进型,依然可以用桌子
还是上面的串,但lru不会像fifo一样无视已存在的页,而是在读取到已存在的页面时将其放到最右边,即推上桌子的位置,比如4 1 5到下一个1时变成4 5 1 继续推
clock算法
这次我们不说桌子了,假如桌子一周坐了5个人,兴许还是那几个哲学家,我们把串串比作相应的哲学家,每个人左边有一根筷子,先不考虑他们怎么抢筷子,默认筷子都是放下的,相当于访问位为0,又称找0算法,当读到一个数时让一个哲学家拿起一个筷子,访问位置为1,继续读数顺时针让下一个哲学家拿起他的筷子,直到所有的哲学家手里都有筷子后所有的访问位都是1,就没有空的访问位了,如果再读一个新的数字那我们回到第一个哲学家,他不会直接放下手中的筷子而是等我们走后再放下,我们看到他没放下筷子就得去找第二个哲学家,他会做和第一个哲学家一样的事,由于之前所有哲学家都没放下筷子,所以只有当我们访问完一圈后才能找到第一个放下的筷子,就是之前第一个哲学家在我们走后放下的筷子,然后第二个哲学家筷子也放下了读数时也能拿起自己的筷子了,如果期间有哲学家读到了别的哲学家正在读的数,只需要让正在读那个数的哲学家再拿起筷子就行,以此类推循环。
改进型clock算法
这个算法比clock多了一个修改位,即某个哲学家最近是否有放下/拿起筷子的操作,有则置1,1,每次置换都要花费至多4次扫描,第一次找0,0即最近即没有被修改过又没有被访问过,一圈之后如果没有则开始找0,1,即可以是被修改过的,同时把扫描过的访问位置0,两圈后还是没有找到0,1则开始再重复第一遍找0,0,若第三遍还是没找到0,0则开始第四遍,找0,1,由于第二遍将所有访问位设为0,所以第四遍所有初始的1,1都会变成0,1,必然能找到