深入理解缓冲区(十)

4.1.4.3           Buf的主体结构

形式上是“char *”,本质上是内存开辟出的一块地址连续的区域。

关键问题是:数据库如何使用这块区域(缓冲区调度算法)。

4.1.4.4           Buf的置换调度策略管理相关数据结构

第一个相关结构:SharedBufHash

作用:哈希表,用于缓存块的快速查找。

 

第二个相关结构:BufferStrategyControl

/*

 * The shared freelist control information.

 */

typedef struct

{

       /* Clock sweep hand: index of next buffer to consider grabbing */

       int                  nextVictimBuffer; // 指向缓存块(缓存块是地址连续的,所以把缓存块当作数组,用int型下标即可表示下一个要被置换的缓存块的位置)

 

       int                  firstFreeBuffer;      /* Head of list of unused buffers */

       int                  lastFreeBuffer; /* Tail of list of unused buffers */

 

       /*

        * NOTE: lastFreeBuffer is undefined when firstFreeBuffer is -1 (that is,

        * when the list is empty)

        */

       /*

        * Statistics.   These counters should be wide enough that they can't

        * overflow during a single bgwriter cycle.

        */

       uint32            completePasses; /* Complete cycles of the clock sweep */

       uint32            numBufferAllocs;   /* Buffers allocated since last reset */

} BufferStrategyControl;

 

深入理解缓冲区(十) - 那海蓝蓝 - 那海蓝蓝的博客
 

说明:

1.         上图,左侧,是解释区,第一椭圆说明了整体缓存的情况;第二个椭圆表示PostgreSQL数据库初始化后,在data(数据目录)中初始化出的配置文件,此文件存放数据启动、运行时需要的各种参数,其中,有关缓存的参数是“shared_buffers”,表示缓冲区大小,实际大小的计算方式,参见上图;“NBuffers”是代码中和缓冲区相关的变量,其值源于GUC参数“shared_buffers”。

2.         上图,右侧,是缓冲区。由四块地址连续的区域组成。分别是:缓存头、缓存块集合、缓存块快速查找hashtable、置换策略指示器。

3.         缓冲区的第一个部分:【缓存头】,与【缓存块集合】一一对应,每一个缓存块,都有自己的一份使用情况信息,保存在【缓存头中】。

4.         缓冲区的第二个部分:【缓存块集合】,与外存的数据块对应,是n:m的关系。当缓存块还有空闲的时候,则从空闲链表中取缓存块共上层(数据访问层)使用,否则,使用“clock”算法,淘汰一个页面(页面大小对应一个块,8k),然后给这个页面置相应值(如可能读入新数据到缓存块)并他的元信息(缓存头中对应的使用情况信息,如是否加锁等),最后返回这个块

5.         缓冲区的第三个部分:【缓存块快速查找hashtable】,把所有缓存块注册到一个hash表中,便于快速查找缓存块

6.         缓冲区的第四个部分:【置换策略指示器】,与缓存块的页面淘汰算法直接相关,指示了哪个缓存块可以被淘汰(注意图中从【置换策略指示器】发出的线的指向,对应的变量是nextVictimBuffer,其用法“nextVictimBuffer++”,表明缓存块是从前到后逐个被淘汰的,这就是简单的“clock”算法,但并非说:缓存块是依次被淘汰,而是从前到后,找到没有被使用的、可被淘汰的---如脏页、引用计数为零的---进行淘汰,当nextVictimBuffer达到最大值,则变为零,从前面再重新开始淘汰)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值