广告
返回顶部
首页 > 资讯 > 数据库 >页面置换算法之Clock算法
  • 707
分享到

页面置换算法之Clock算法

页面置换算法之Clock算法 2019-09-14 10:09:28 707人浏览 才女
摘要

1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内存并返回。 但是内存的价值较高

页面置换算法之Clock算法

1.前言

缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内存并返回。

但是内存的价值较高,一般来说服务器的内存总是小于磁盘大小的,而且内存不能完全分配给数据库作为缓冲池。这就意味着数据库基本上无法将所有的数据都缓冲到内存中。

当缓冲池满后,如果还有新的页面要被缓冲到池中,就要设计一种页面置换的算法,将一个旧的页面替换成新的页面。

一般来说我们熟悉的算法有下面几种:

图片.png

下面逐一介绍各种算法。

2. 最佳置换算法

如果被替换掉的页是以后再也不会使用的,那么这种算法无疑是最优秀的。因为不管什么算法,替换掉的页也有可能再次被缓存,替换掉其它的页。

但是这种算法是无法实现的,我们不可能知道哪个页面以后也在不会被使用。

或者我们退一步,将这个算法改成被替换掉的页是以后很长一段时间都不会再次被使用的,那么这种算法无疑也是最优秀的。

但是还是会面对一个无法实现的问题,我们还是不知道哪些页面会在未来多长一段时间内不会被再次访问。页面无法确认,时间也无法确定。

虽然这种算法无法被实现,但是可以作为一种度量,如果有一种算法其效率最接近OPT,那么这种算法无疑是优秀的算法。

3. 先进先出算法

先进先出算法是一种很简单的算法,其基本思想是形成一个队列,最先入队的页面最先被逐出。我们用示意图来模拟一下FIFO算法:
图片.png
我们的内存假设只能保存4个页面,此时的访问请求按照时间顺序是1->2->3->4->5,那么按照时间顺序,当访问到4号页面时队列正好填满,当要访问5号页面时,会将最先入队的1号页面逐出。

这种算法实现起来很简单,但是从实现上来看,性能和OPT算法差距最大。因为被替换出去的页面很有可能是最常使用的页面,因此这个算法很少见出现在数据库缓冲池管理中的。

FIFO算法会出现一个叫做Belay异常的现象,就这个现象我们解释如下。

我们首先定义一个4个页面长度的队列作为缓冲池,然后按照下面的顺序访问:1->2->3->4->5->3->9->1->4->2->7->4->7。那么我们按照刚才描述的FIFO来看看访问的过程:

访问顺序 访问页 内存队列 是否命中
1 1 1
2 2 1,2
3 3 1,2,3
4 4 1,2,3,4
5 5 2,3,4,5
6 3 2,3,4,5
7 9 3,4,5,9
8 1 4,5,9,1
9 4 4,5,9,1
10 2 5,9,1,2
11 7 9,1,2,7
12 4 1,2,7,4
13 7 1,2,7,4

从这个表格上看到,非命中次数有9次,那么我们将这个队列的容量增加到5,然后再次重复这个访问序列,看看效果:

访问顺序 访问页 内存队列 是否命中
1 1 1
2 2 1,2
3 3 1,2,3
4 4 1,2,3,4
5 5 1,2,3,4,5
6 3 1,2,3,4,5
7 9 2,3,4,5,9
8 1 3,4,5,9,1
9 4 3,4,5,9,1
10 2 4,5,9,1,2
11 7 5,9,1,2,7
12 4 9,1,2,7,4
13 7 9,1,2,7,4

这样的话,非命中的次数是10次,奇怪的是增加了缓冲池的容量,非命中缓冲的数量还增加了,这种现象就叫做Belay异常。

这种算法不应该被考虑。

4. 最近最少使用算法

LRU算法的思想也很简单,实现一个链表(双向链表),每次要缓冲新的页面时,遍历链表,选择最近最少使用的页面进行逐出操作。

这种算法要求每个页面上记录一个上次使用时间t,程序决定逐出时,以这个时间t为准,t距离当前时间最大的,就是要被逐出的页面。

下图中按照1->5->2->2->6->5->4的顺序访问,内存和访问示意图如下:
图片.png
其中最接近顶端的页面我们认为其t最小,最接近底部,我们认为其t最大。

访问6号页面的时候,内存被填满,下一次访问5号页面的时候,会将5号页面提升到顶部,也就是t最小,之后访问4号页面,因为原先内存中没有4号页面,因此会选择逐出一个页面。此时1号页面在底部,其t最大,因此被逐出。

那么LRU算法是否解决了Belay异常呢?

还是按照上一节的实验顺序,测试容量为4和5的内存,左侧到右侧,t逐渐增大:

访问顺序 访问页 内存队列 是否命中
1 1 1
2 2 1,2
3 3 1,2,3
4 4 1,2,3,4
5 5 2,3,4,5
6 3 2,4,5,3
7 9 4,5,3,9
8 1 5,3,9,1
9 4 3,9,1,4
10 2 9,1,4,2
11 7 1,4,2,7
12 4 1,2,7,4
13 7 1,2,4,7

一共有10次未命中。增加容量到5,看一下新的情况:

访问顺序 访问页 内存队列 是否命中
1 1 1
2 2 1,2
3 3 1,2,3
4 4 1,2,3,4
5 5 1,2,3,4,5
6 3 1,2,4,5,3
7 9 2,4,5,3,9
8 1 4,5,3,9,1
9 4 5,3,9,1,4
10 2 3,9,1,4,2
11 7 9,1,4,2,7
12 4 9,1,2,7,4
13 7 9,1,2,4,7

未命中的次数已经变成了9次,减少了一次,如果我设计的队列中有大量的重复,那么这个改进应该更加明显。

LRU算法在InnoDB的实现中是被改进的,每次新添加进去的页面会被放在队列的3/8处。

无论如何,LRU算法都被认为是最接近OPT的算法。

5. 时钟置换算法

时钟置换算法可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。我们给每一个页面设置一个标记位u,u=1表示最近有使用u=0则表示该页面最近没有被使用,应该被逐出。

按照1-2-3-4的顺序访问页面,则缓冲池会以这样的一种顺序被填满:

图片.png

注意中间的指针,就像是时钟的指针一样在移动,这样的访问结束后,缓冲池里现在已经被填满了,此时如果要按照1-5的顺序访问,那么在访问1的时候是可以直接命中缓存返回的,但是访问5的时候,因为缓冲池已经满了,所以要进行一次逐出操作,其操作示意图如下:

图片.png

最初要经过一轮遍历,每次遍历到一个节点发现u=1的,将该标记位置为0,然后遍历下一个页面,一轮遍历完后,发现没有可以被逐出的页面,则进行下一轮遍历,这次遍历之后发现原先1号页面的标记位u=0,则将该页面逐出,置换为页面5,并将指针指向下一个页面。

假设我们接下来会访问2号页面,那么可以直接命中指针指向的页面,并将这个页面的标记为u置为1。

但是考虑一个问题,数据库里逐出的页面是要写回磁盘的,这是一个很昂贵的操作,因此我们应该优先考虑逐出那些没有被修改的页面,这样可以降低io

因此在时钟置换算法的基础上可以做一个改进,就是增加一个标记为m,修改过标记为1,没有修改过则标记为0。那么u和m组成了一个元组,有四种可能,其被逐出的优先顺序也不一样:

  • (u=0, m=0) 没有使用也没有修改,被逐出的优先级最高;
  • (u=1, m=0) 使用过,但是没有修改过,优先级第二;
  • (u=0, m=1) 没有使用过,但是修改过,优先级第三;
  • (u=1, m=1) 使用过也修改过,优先级第四。
您可能感兴趣的文档:

--结束END--

本文标题: 页面置换算法之Clock算法

本文链接: https://www.lsjlt.com/news/4239.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 页面置换算法之Clock算法
    1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内存并返回。 但是内存的价值较高...
    99+
    2019-09-14
    页面置换算法之Clock算法
  • 页面置换算法有哪些
    页面置换算法有:1、FIFO算法,通过维护一个页面队列,将最早进入内存的页面置换出去;2、LRU算法,根据页面的访问历史来进行页面置换;3、LFU算法,根据页面的访问次数来进行页面置换;4、Clock算法,通过使用一个时钟指针来遍历页面队列...
    99+
    2023-08-14
  • C语言实现页面置换算法(FIFO、LRU)
    目录1.实现效果2.实现源代码 1.实现效果 2.实现源代码  #include<iostream> #include<process.h> #inc...
    99+
    2022-11-12
  • Java实现FIFO、LRU、LFU、OPT页面置换算法
    目录题目要求具体代码题目要求 采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下: 需要建立访问页表线程、...
    99+
    2023-02-07
    Java 页面置换算法 JAVA FIFO LRU LFU OPT
  • Linux页面置换算法的C语言实现
    Linux页面置换算法的C语言实现 编写算法,实现页面置换算法FIFO、LRU、OPT;针对内存地址引用串,进行页面置换算法进行页面置换。 其中,算法所需的各种参数由输入产生(手工输入或者随机数产生);输出内存驻留的...
    99+
    2022-06-03
    Linux C语言 页面置换
  • C语言怎么实现页面置换算法
    本篇内容主要讲解“C语言怎么实现页面置换算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现页面置换算法”吧!1.实现效果2.实现源代码 #include<iostr...
    99+
    2023-06-25
  • Python实现FIFO缓存置换算法
    本文实例为大家分享了Python实现FIFO缓存置换算法的具体代码,供大家参考,具体内容如下 在上一节中我们实现了双向链表DoubleLinkedList类,本节我们基于双向链表实现...
    99+
    2022-11-11
  • java图形界面之加法计算器
    JAVA用于开发图形界面应用的 SWING 组件包功能强大,使用方便。接下来我们就使用其写一个简单的图形界面小程序:加法计算器。 第一步: 首先得构思,我们要做什么。加法计算器的话,...
    99+
    2022-11-13
  • js算法实例之字母大小写转换
    题目:输入字符串将大写转换成小写,小写转换成大写? <strong>js字母大小写转换方法:1、转换成大写:toUpperCase()2、转换成小写:toLowerCas...
    99+
    2022-12-26
    js字母大小写转换自定义方法 实现大小写转换的代码 js大写字母转小写
  • Java面试题之算法的示例分析
    小编给大家分享一下Java面试题之算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!面试题1:你说一下常用的排序算法都有哪些?追问1:谈一谈你对快排的理...
    99+
    2023-06-20
  • Java面试题之手撸算法的示例分析
    这篇文章将为大家详细讲解有关Java面试题之手撸算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。手撸算法1:查找数组中重复元素和重复元素的个数当听让我写这个算法时,纸笔还没给到我手上,作为一个...
    99+
    2023-06-20
  • java图形界面之怎么实现加法计算器
    这篇文章主要介绍“java图形界面之怎么实现加法计算器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java图形界面之怎么实现加法计算器”文章能帮助大家解决问题。第一步:首先得构思,我们要做什么。加...
    99+
    2023-06-30
  • 算法学习?挑战高薪的必经之路!让面试官满意的排序算法(图文解析)
    ...
    99+
    2023-06-04
  • 面试官最爱考的 PHP 编程算法之分布式系统实践!
    随着互联网的快速发展,分布式系统已经成为了大型互联网企业的基础设施之一。而在分布式系统中,算法的优化和实现也成为了非常重要的工作。PHP 作为一种广泛使用的编程语言,也在分布式系统的开发中发挥着重要作用。 本文将介绍一些在分布式系统中最常...
    99+
    2023-06-04
    面试 编程算法 分布式
  • C语言常见排序算法之交换排序(冒泡排序,快速排序)
    目录前言1.交换排序——冒泡排序1.1 算法思想1.2 动图演示1.3 冒泡最好的情况 2. 交换排序——快速排序...
    99+
    2022-11-13
  • 计算机中鼠标滑轮上下变成页面缩放的解决方法
    小编给大家分享一下计算机中鼠标滑轮上下变成页面缩放的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!鼠标滑轮上下变成页面缩放的解决办法:首先在计算机的桌面上...
    99+
    2023-06-14
  • 剑指Offer之Java算法习题精讲数组与列表的查找及字符串转换
    题目一 解法 class Solution { public String toLowerCase(String s) { StringBuilder ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作