页面置换之Clock置换算法

LRU算法是较好的一种算法,但由于它要求有较多的硬件支持,故在实际应用中,大多采用LRU的近似算法。Clock算法就是用得较多的一种LRU近似算法。

1、简单的Clock置换算法

当采用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。下图示出了该算法的流程和示例。由于该算法是循环地检查各页面的使用情况,故称为Clock算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)。
在这里插入图片描述

2、改进型Clock置换算法

在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。在改进型Clock算法中,除须考虑页面的使用情况外,还须再增加一个因素,即置换代价,这样,选择页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。由访问位A和修改位M可以组合成下面四种类型的页面:
1类(A=0,M=0):表示该页最近既为被访问,又未被修改,是最佳淘汰页。
2类(A=0,M=1):表示该页最近未被访问,但也被修改,并不是很好的淘汰页
3类(A=1,M=0):表示该页最近已被访问,但未被修改,该页有可能再被访问
4类(A=1,M=1):表示该页最近已被访问且被修改,该页可能再被访问
在内存中的每个页必定是这四个类页面之一,在进行页面置换时,可采用与简单Clock算法相类似的算法,其差别在于该算法须同时检查访问位与修改位,以确定该页是四类页面中的哪一种。其执行过程可分成以下三步:

(1)从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A
(2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0
(3)如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页

该算法与简单Clock算法比较,可减少磁盘的I/O操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验使用一下算法 使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存中发生页面置换的过程。 整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法页面置换算法 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。用于算法评价参照。 随机置换算法 (S):产生一个取值范围在0和N-1之间的随机数,该随机数即可表示应被淘汰出内存的页面。 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存 Clock置换算法:为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一,算法在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存中的下一个页面的访问位。 改进型Clock置换算法: ①从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转② ② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
页面置换算法 Clock(也称为最近未用(NRU)算法)是一种简单的页面置换算法,其基本思想是采用类似于时钟的方式来维护每个页面的使用情况。当需要置换页面时,算法会先找到一个未被使用的页面,如果没有,则找到一个最早未被使用的页面进行置换。 下面是Clock算法的实现(假设物理内存大小为m,页面数为n): 1. 初始化一个指针hand,指向物理内存中的第一个页面。 2. 维护一个长度为m的位数组refbit,表示每个页面的使用情况。初始时所有位都设为0。 3. 当需要置换页面时,从hand指向的页面开始遍历物理内存: a. 如果当前页面的refbit为0,则选择该页面进行置换,并将hand指向下一个页面。 b. 如果当前页面的refbit为1,则将refbit设为0,并将hand指向下一个页面。 c. 如果遍历完所有页面都没有找到refbit为0的页面,则选择最早未被使用的页面进行置换,并将hand指向下一个页面。 4. 在访问页面时,将该页面的refbit设为1。 下面是Clock算法的示例代码(以C语言为例): ``` #define MAX_PAGE_NUM 100 #define PHYSICAL_MEM_SIZE 10 int hand = 0; // 指针 int refbit[PHYSICAL_MEM_SIZE]; // 位数组 int mem[PHYSICAL_MEM_SIZE]; // 物理内存 // 初始化页面 void init() { hand = 0; for (int i = 0; i < PHYSICAL_MEM_SIZE; i++) { refbit[i] = 0; mem[i] = -1; // -1表示页面未被使用 } } // 页面置换 void page_replace(int page_num) { while (1) { if (mem[hand] == -1 || refbit[hand] == 0) { // 找到未被使用的页面或refbit为0的页面 mem[hand] = page_num; // 置换页面 refbit[hand] = 1; // 设置refbit为1 hand = (hand + 1) % PHYSICAL_MEM_SIZE; // 指针指向下一个页面 break; } else { refbit[hand] = 0; // 设置refbit为0 hand = (hand + 1) % PHYSICAL_MEM_SIZE; // 指针指向下一个页面 } } } // 访问页面 void access_page(int page_num) { refbit[page_num] = 1; // 设置refbit为1 } // 测试 int main() { init(); // 初始化页面 int page_seq[MAX_PAGE_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 页面序列 int page_num = 10; // 页面数 for (int i = 0; i < page_num; i++) { access_page(page_seq[i]); // 访问页面 if (mem[hand] == -1) { // 物理内存未满 mem[hand] = page_seq[i]; // 放入页面 refbit[hand] = 1; // 设置refbit为1 hand = (hand + 1) % PHYSICAL_MEM_SIZE; // 指针指向下一个页面 } else { // 物理内存已满,进行页面置换 page_replace(page_seq[i]); } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值