算法的工作流程如下,假设硬件要设置 R 和 M 位 。同样的,在每个时钟周期内,一个周期性的时钟中断会使软件清除 Referenced(引用)位 。在每个缺页异常,页表会被扫描以找出一个合适的页面把它置换 。
随着每个页表项的处理,都需要检查 R 位 。如果 R 位是 1,那么就会将当前时间写入页表项的 上次使用时间域,表示的意思就是缺页异常发生时页面正在被使用 。因为页面在当前时钟周期内被访问过,那么它应该出现在工作集中而不是被删除(假设 t 是横跨了多个时钟周期) 。
如果 R 位是 0 ,那么在当前的时钟周期内这个页面没有被访问过,应该作为被删除的对象 。为了查看是否应该将其删除,会计算其使用期限(当前虚拟时间 - 上次使用时间),来用这个时间和 t 进行对比 。如果使用期限大于 t,那么这个页面就不再工作集中,而使用新的页面来替换它 。然后继续扫描更新剩下的表项 。
然而,如果 R 位是 0 但是使用期限小于等于 t,那么此页应该在工作集中 。此时就会把页面临时保存起来,但是会记生存时间最长(即上次使用时间的最小值)的页面 。如果扫描完整个页表却没有找到适合被置换的页面,也就意味着所有的页面都在工作集中 。在这种情况下,如果找到了一个或者多个 R = 0 的页面,就淘汰生存时间最长的页面 。最坏的情况下是,在当前时钟周期内,所有的页面都被访问过了(也就是都有 R = 1),因此就随机选择一个页面淘汰,如果有的话最好选一个未被访问的页面,也就是干净的页面 。
工作集时钟页面置换算法当缺页异常发生后,需要扫描整个页表才能确定被淘汰的页面,因此基本工作集算法还是比较浪费时间的 。一个对基本工作集算法的提升是基于时钟算法但是却使用工作集的信息,这种算法称为WSClock(工作集时钟) 。由于它的实现简单并且具有高性能,因此在实践中被广泛应用 。
与时钟算法一样,所需的数据结构是一个以页框为元素的循环列表,就像下面这样

文章插图
最初的时候,该表是空的 。当装入第一个页面后,把它加载到该表中 。随着更多的页面的加入,它们形成一个环形结构 。每个表项包含来自基本工作集算法的上次使用时间,以及 R 位(已标明)和 M 位(未标明) 。
与时钟算法一样,在每个缺页异常时,首先检查指针指向的页面 。如果 R 位被是设置为 1,该页面在当前时钟周期内就被使用过,那么该页面就不适合被淘汰 。然后把该页面的 R 位置为 0,指针指向下一个页面,并重复该算法 。该事件序列化后的状态参见图 b 。
现在考虑指针指向的页面 R = 0 时会发生什么,参见图 c,如果页面的使用期限大于 t 并且页面为被访问过,那么这个页面就不会在工作集中,并且在磁盘上会有一个此页面的副本 。申请重新调入一个新的页面,并把新的页面放在其中,如图 d 所示 。另一方面,如果页面被修改过,就不能重新申请页面,因为这个页面在磁盘上没有有效的副本 。为了避免由于调度写磁盘操作引起的进程切换,指针继续向前走,算法继续对下一个页面进行操作 。毕竟,有可能存在一个老的,没有被修改过的页面可以立即使用 。
原则上来说,所有的页面都有可能因为磁盘I/O 在某个时钟周期内被调度 。为了降低磁盘阻塞,需要设置一个限制,即最大只允许写回 n 个页面 。一旦达到该限制,就不允许调度新的写操作 。
那么就有个问题,指针会绕一圈回到原点的,如果回到原点,它的起始点会发生什么?这里有两种情况:
- 至少调度了一次写操作
- 没有调度过写操作
对于第二种情况,所有的页面都在工作集中,否则将至少调度了一个写操作 。由于缺乏额外的信息,最简单的方法就是置换一个未被修改的页面来使用,扫描中需要记录未被修改的页面的位置,如果不存在未被修改的页面,就选定当前页面并把它写回磁盘 。
页面置换算法小结我们到现在已经研究了各种页面置换算法,现在我们来一个简单的总结,算法的总结归纳如下
推荐阅读
- 图解Java内存区域
- 分享几款Linux 下C/C++程序内存泄漏检查工具
- 建议收藏 全网最全的SQL语句
- 安卓平板|vivo发布OriginOS HD大屏操作系统:手机、平板、PC无缝协同
- 白茶萎凋,白茶萎凋适度特征
- centos操作系统上实现网卡端口绑定
- 微信太“吃”内存了!教你怎样快速清理微信垃圾,释放手机内存?
- 在常用Linux操作系统中安装VMware Tools
- 聊聊 Linux 的内存统计
- 一加|12GB内存!一加首款天玑8100新机现身GeekBench:或为一加Ace
