暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

为什么PostgreSQL抛弃了LRU算法而使用时钟扫描?

我们知道LRU(Least Recently Used)最近最少使用算法被广泛运用于操作系统及数据库的内存淘汰机制上,比如mysql的缓冲区页面置换算法就是使用LRU。当然还有lfu(最不经常使用算法)和fifo(先进先出算法)。下面先来看看lru算法。



LRU算法



通过下面的图来说明一下置换过程:



我们可以使用双向链表来将页面串联起来,使用双向链表而不是单向链表的原因是双向链表在进行页面淘汰后可以反向更改页面指针,指向相邻页面。


再看看上面的过程,页面4,7,0被相继读入缓冲区,第四步页面需要访问页面7,然后就会去遍历该链表,发现找到了7号页面,而且此时页面没有全部用满,那么将页面7提到表头(通过更改双向链表的指针指向实现),然后页面1被读到缓冲区,然后读取页面0,遍历链表找到了页面0并将页面0提到表头,其他步骤类似,再看看置换,比如最后一步,读取页面6,遍历链表后发现页面6没有找到,此时缓冲区已满,这时需要从缓冲区中置换掉链表最尾部(最近最少使用)的页面4进行淘汰,并且把页面6放在表头。



Clock算法



下面先来说说clock算法的过程。Clock算法为每页设置一位访问标识usage_tag,内存中的所有页面以链表的形式组成一个环形队列。当某页被访问时,其访问标识u就被置1。

 

Clock在需要进行页面淘汰时会循环地扫描环形队列的页面,如果发现页面访问位u=0,就选择该页换出;若u=1,则重新将它置0,这样该页面本次就不会被换出,有了第二次驻留内存的机会,再继续检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面,本轮检查就一定有u=0的页面了,然后会将第一个u=0的页面换出。

 

Clock算法实现起来更简单,性能也接近LRU,在clock的基础上又有改进的clock算法。



改进的clock算法



改进的clock算法是在clock算法的基础上再增加一个一个修改位modify_tag,标识该页面是否被修改。为什么增加修改位m呢,因为被修改的页面(也称为脏页)如果被替换出去必须要先强制刷盘,所以我们的原则是尽量优先替换未被修改过的页面。所以改进的clock算法页面替换原则顺序如下:


①先替换最近未被访问,也未被修改的页(u=0, m=0)。

②再替换最近被访问,但未被修改的页(u=1, m=0)。

③再替换最近未被访问,但被修改的页(u=0, m=1)。

④最后替换最近被访问,被修改的页(u=1, m=1)。



PostgreSQL中的clock算法



PG作为学术派数据库在改进的时钟扫描算法上又做了进一步创新,将usage_tag从一个布尔值的标识位改为usage_count的数值位,u代表了该页面被使用的次数,而不再是是否被使用。通过下面这个图看看PG的时钟扫描算法过程。当然pg缓冲区的三层结构不再介绍了,毕竟不是研发人员,了解下原理就行。

 

 

①受害者指针指向第一个描述符(buffer_id=1),发现它的状态是pinned(被钉住m=1,可以理解为modify_tag=1),故跳过该描述符。
②受害者指针指向第二个描述符(buffer_id=2),发现此描述符的状态是unpinned(未被钉住m=0)但其usage_count为2,此时将usage_count减1,受害者指针继续前进。
③受害者指针指向第三个描述符(buffer_id=3),状态描述符为unpinned(m=0),而且usage_count=0,所以该描述符被选为本轮的受害者进行替换。

 

从上面的过程可以看出,每当循环扫描缓冲区时,如果存在未被修改的页面,该页面的usage_count就会减少1。所以,如果缓冲池中存在未被修改的页面时,此算法始终可以通过若干次扫描找到usage_count=0的页面。

 

PG中的时钟扫描算法相比两标识位的时钟扫描更加精细,相当于为每个最近被使用的页面增加了权重,使用越频繁越不容易被替换出去,更加符合真实的场景。

I Love PG

关于我们

中国开源软件推进联盟PostgreSQL分会(简称:PG分会)于2017年成立,由国内多家PG生态企业所共同发起,业务上接受工信部产业发展研究院指导。PG分会致力于构建PG产业生态,推动PG产学研用发展,是国内一家PG行业协会组织。



欢迎投稿

做你的舞台,show出自己的才华 。

投稿邮箱:partner@postgresqlchina.com

                               

                                 ——愿能安放你不羁的灵魂


技术文章精彩回顾




PostgreSQL学习的九层宝塔
PostgreSQL职业发展与学习攻略
搞懂PostgreSQL数据库透明数据加密之加密算法介绍
一文读懂PostgreSQL-12分区表
PostgreSQL源码学习之:RegularLock
Postgresql源码学习之词法和语法分析
PostgreSQL buffer管理
最佳实践—PG数据库系统表空间重建
PostgreSQL V12中的流复制配置
2019,年度数据库舍 PostgreSQL 其谁?
PostgreSQL使用分片(sharding)实现水平可扩展性
一文搞懂PostgreSQL物化视图
PostgreSQL原理解析之:PostgreSQL备机是否做checkpoint
PostgreSQL复制技术概述

PG活动精彩回顾




见证精彩|PostgresConf.CN2019大会盛大开幕
PostgresConf.CN2019大会DAY2|三大分论坛,精彩不断
PostgresConf.CN2019培训日|爆满!Training Day现场速递!
「PCC-Training Day」培训日Day2圆满结束,PCC2019完美收官
创建PG全球生态!PostgresConf.CN2019大会盛大召开
首站起航!2019“让PG‘象’前行”上海站成功举行
走进蓉城丨2019“让PG‘象’前行”成都站成功举行
中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行
PostgreSQL实训基地落户沈阳航空航天大学和渤海大学,高校数据库课改正当时
群英论道聚北京,共话PostgreSQL
相聚巴厘岛| PG Conf.Asia 2019  DAY0、DAY1简报
相知巴厘岛| PG Conf.Asia 2019 DAY2简报
相惜巴厘岛| PG Conf.Asia 2019 DAY3简报
独家|硅谷Postgres大会简报
全球规模最大的PostgreSQL会议等你来!

PG培训认证精彩回顾




关于中国PostgreSQL培训认证,你想知道的都在这里!
首批中国PGCA培训圆满结束,首批认证考试将于10月18日和20日举行!
中国首批PGCA认证考试圆满结束,203位考生成功获得认证!
中国第二批PGCA认证考试圆满结束,115位考生喜获认证!
请查收:中国首批PGCA证书!
重要通知:三方共建,中国PostgreSQL认证权威升级!
一场考试迎新年 | 12月28日,首次PGCE中级认证考试开考!
近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕!


文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论