「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍几种页面置换算法。
1. 页面置换算法
1.1 先进先出算法(FIFO First In First Out)
先进先出算法就是把进入到内存中的页面根据进入内存时间的先后组成一个链表,每次把表头换掉,把新进来的放到表尾。
优点:
- 简单,容易实现,公平。
缺点:
- 效率低。如果先进入的页面是经常被访问的页面,那很快就会导致缺页中断。
1.2 最近最久未使用算法(LRU Least Recently Used)
见名知意,其算法思想就是每次淘汰最近最久为使用的页面。
和FIFO算法有些类似但也有区别,注意区分即可。
实例展示:
假设给程序分配三个页面,程序的页面走向是:4 1 2 5 6 2 4 2 1
页面走向 | 4 | 1 | 2 | 5 | 6 | 2 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|
页面1 | 4 | 4 | 4 | 5 | 5 | 5 | 4 | 4 | 4 |
页面2 | 1 | 1 | 1 | 6 | 6 | 6 | 6 | 1 | |
页面3 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | ||
是否缺页 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 是 |
实例解析:
有三个空闲页面可以把4 ,1, 2都放进来,最近最久未使用的顺序是4,1,2
然后需要页面5,不存在,进行页面置换,跟据最近最久未使用,替换掉页面4,最近最久未使用变成1,2,5
接着需要页面6,不存在,进行页面置换,替换掉页面1,最近最久未使用变成2,5,6
接着需要页面2,已存在,不需要进行页面置换,但是要更新最近最久未使用,变成5,6,2
接着需要页面4,不存在,替换掉页面5,最近最久未使用变成6,2,4
接着需要页面2,已存在,更新最近最久未使用,变成6,4,2
最后需要页面1,不存在,替换掉页面6,更新最近最久未使用,变成4,2,1
优点:
- 性能较优
缺点:
- 需要硬件支持,算法开销大。
1.3 时钟算法(Clock)
把页面排成时钟的形状,每次从时钟的指针指向的页面开始判断,如果当前页面的访问位是0,说明没被访问过,那就替换掉它,如果是1,那就把它置为0,然后把指针指向下一个,直到找到访问位为0的页面。
优点:
- 实现简单,算法开销小。
缺点:
- 没考虑到页面的使用频率,可能会增大缺页率。
1.4 改进后的时钟算法
改进时钟算法其实就是增加了修改位。
淘汰的优先级(最先淘汰)是:
- 最近没有访问过的并且没有修改过的。
- 最近没有访问过的但是修改过的。
- 最近访问过的,但是没有修改过的。
- 最近访问过,而且修改过的。
访问过置为1,未访问过置为0。
修改过置为1,未修改过置为0。
小结
以上就是我对几种页面置换算法的一些理解,希望对读者有所帮助,如有不正之处,欢迎留言指正。