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

图解PostgreSQL-buffer管理(二)

原创 闫宗帅 2020-01-08
2031

本文介绍本地缓冲的管理。

一、数据结构

localbuffer数据结构.png
1、数组LocalBufferDescriptors[]为本地缓冲块的描述符,buf_id从-2开始,都是负数。为和共享缓冲区有区别,通过是否为负值就可以判断是否是本地缓冲区
2、数组大小由变量num_temp_buffers控制
3、LocalBufferBlockPointers数组为本地缓冲块的指针。这些数组的初始化由函数InitLocalBuffers完成,此时并没有分配本地缓冲块内存。
4、本地缓冲块内存的申请和分配由函数GetLocalBufferStorage完成。第一次时从内存上下文LocalBufferContext中分配16个页大小的block,然后将第一个页地址分配给LocalBufferBlockPointers[i],并不是一下子全部分配,下次使用时再分配数组下一个页。
5、16个页的block用完,再次申请32个页的block;同理32个页的block用完,申请64个页的block,每次都是之前的两倍。
6、最大一次分配1个GB的block

二、分配local buffer原理

localbuffer.png
1、本地buffer的分配由函数LocalBufferAlloc来完成,用于临时表的读写。
2、同样需要先初始化tag:newTag,唯一标记一个物理页
3、第一次使用临时表时,需要通过calloc创建一系列缓冲区(InitLocalBuffers完成):几个数组,大小为num_temp_buffers,即该变量控制大小。

  • LocalBufferDescriptors[]:存储本地缓冲块的描述符
  • LocalBufferBlockPointers[]:本地缓冲块指针数组,存储指向块的指针
  • LocalRefcount[]:每个描述符引用次数
  • LocalBufHash:用户管理本地缓冲块的hash表,key为tag,value为buffer的数组下标。
    4、通过tag从LocalBufHash表中查找,看有没有,是否已经加载到内存。
    5、LocalBufHash表中已存在:
       1)获取其ID,然后获取local buffer的描述符bufHdr
       2)原子操作读出bufHdr的state即buf_state
       3)buf_state的usagecount保持为1?refcount+1
       4)buf为BM_VALID,则foundPtr为TRUE,表示命中缓冲,否则为false
       5)返回该描述符bufHdr
    6、LocalBufHash不存在:
       1)通过该值nextFreeLocalBuf遍历本地缓冲区,若超过NlocBuffer值则从头开始遍历
       2)LocalRefcount对应的引用值不为0,则返回到1);否则取出其bufHdr的state
       3)usagecount=0,表示没有人在用,则LocalRefcount=1后退出循环,进入步骤7
       4)usagecount>0,则将usagecount-1后返回1)重新选择下一个
    7、buf_satate为BM_DIRTY,则需要刷脏:
       1)获取具体页localpage,smgropen一个oreln,如打开checksum则计算checksum并写入localpage;smgrwrite将其写入到磁盘;最后将状态置为非BM_DIRTY
    8、如果第一次使用本地buffer,则需要调用GetLocalBufferStorage将其挂到TopMemoryContext
    9、如果该buffer缓冲区的数据有效,则需要更新hash表:将该tag从LocalBufHash中删除,并将状态置为 ~(BM_VALID | BM_TAG_VALID),其bufHdr->tag需要清空
    10、将新的tag newTag插入hash表LocalBufHash
    11、将bufHdr->tag替换成newTag,此时是我们的tag了。
    12、buf_state清空,并且置为BM_TAG_VALID,且usagecount加1,foundPTR为false
    13、返回buf描述符bufHdr
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论