CLOCK置换算法:

是一种LRU的近似算法,是一种性能和开销较均衡的算法。由于LRU算法需要较多的硬件支持,采用CLOCK置换算法只需相对较少的硬件支持。又称为最近未用算法(NRU)

简单的CLOCK置换算法

1. 实现方法

(1)为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列

(2)当某页被访问时,其访问位置为1

(3)当需要淘汰一个页面时,只需检查页的访问位:如果是0,选择此页换出;如果是1,将它置0,暂不换出,继续检查下一个页面

(4)若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0,再进行第二轮扫描,第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描

2. 例子

假设系统为某进程分配了五个内存块,并考虑到有以下页面号引用串:1,3,4,2,5,6,3,4,7

解析:

                                                  

clock页面置换算法代码java 简单clock置换算法例题_学习

第一步:刚开始先将前五个页面装入五个物理块,这时五个页面均已被访问过,所以访问位置为1

                                                   

clock页面置换算法代码java 简单clock置换算法例题_页面设置_02

第二步:访问到6号页,需要换出一个页面。开始进行扫描,扫描一圈后,物理块中的五个页面的访问位全都置0

                                                    

clock页面置换算法代码java 简单clock置换算法例题_学习_03

 第三步:再进行第二轮扫描,1号页(0)淘汰,6号页进来并且将6号页访问位置为1,扫描页指针指向下一位

                                                     

clock页面置换算法代码java 简单clock置换算法例题_换出_04

第四步:按照访问顺序,该访问3号页和4号页,所以将3号页和4号页的访问位置为1,扫描页指针不动(因为没有淘汰)

                                                   

clock页面置换算法代码java 简单clock置换算法例题_循环队列_05

第五步:按照访问顺序,该访问7号页,7号页没有在物理块中,所以需要淘汰一个页面。扫描页指针从3号页开始扫描,3号页和4号页的访问位都是1,所以继续检查且将3号页和4号页的访问位置为0。2号页的访问位是0,所以淘汰2号页。7号页进入物理块中且将访问位置为1。扫描页指针指向下一位,也就是5号页

改进型的CLOCK置换算法

1. 引入:简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。

2. 思想:因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。

3. 实现方法:修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。为方便讨论,用(访问位,修改位)的形式表示各页面状态。

4. 算法规则:将所有可能被置换的页面排成一个循环队列

第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位

第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设为0

第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位

第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换

5. 注意:由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描

6. 例子

       

clock页面置换算法代码java 简单clock置换算法例题_学习_06

clock页面置换算法代码java 简单clock置换算法例题_clock页面置换算法代码java_07

第一轮扫描,没有(0,0),结束

第二轮扫描,没有(0,1),将所有扫描过的帧访问位设为0,全部都是(0,1)

第三轮扫描,没有(0,0),结束

第四轮扫描,第一个就是(0,1),进行替换