图解PostgreSQL-buffer管理(三)
本文介绍本地缓冲的管理。
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
- 点赞
- 收藏
- 分享
- 文章举报
- 图解PostgreSQL-local buffer管理
- PgSQL · 答疑解惑 · PostgreSQL 用户组权限管理
- ElasticSearch56:内核原理探秘_深度图解剖析document写入原始(buffer,segment,commit)
- PostgreSQL用户、数据库及表的管理、操作与授权
- PostgreSQL 事务管理的MVCC
- postgresql模式管理
- linux服务器的又一管理利器webmin图解教程
- 图解项目管理【基础】
- Java NIO学习笔记之二-图解ByteBuffer
- PG的Buffer的管理,有说明share_buffer设置的原理
- PostgreSQL 角色管理
- MIS通用管理组件_角色管理图解
- innodb buffer pool管理--数据页的访问
- OBJC依赖库管理利器cocoapods 安装及使用详细图解
- PostgreSQL服务器管理:服务器设置和操作
- PostgreSQL学习手册(数据库管理)
- OpenGL4.3如何管理buffer中的数据的
- postgresql+postgis+pgrouting安装步骤图解
- postgresql学习--权限管理
- [图解]管理九段的新排列