一、背景
缓冲区管理器管理共享内存和持久化存储之间的数据传输,用于提升数据库系统的数据读/写效率。
![](https://img.haomeiwen.com/i19276429/00851e8a9a9f183b.png)
二、缓冲区管理器结构
1.术语
缓冲表、缓冲区描述符、缓冲池(存放表和索引的页面,一个简单数组通过buffer_id进行索引)。
2.缓冲区标签
typedef struct buftag
{
RelFileNode rnode;/* physical relation identifier */
ForkNumber forkNum;//0:关系表本体;1:空间映射fsm
BlockNumber blockNum;/* blknum relative to begin of reln */
}BufferTag;
typedef struct RelFileNode
{
Oid spcNode;/* tablespace 表空间*/
Oid dbNode;/* database 数据库*/
Oid relNode;/* relation 关系表*/
}RelFileNode;
3、后端进程读取数据页面
i)当读取数据表或索引页时,后端进程向缓冲管理区发送请求(buffer_tag)。
ii)BufferManager返回一个buffer_id。如果缓冲池中不存在,则从持久化存储中加载到缓冲池,再返回buffer_id。
iii)后端进程通过buffer_id访问缓冲区。
4、页面置换法
当缓冲区满,且未包含请求页面,BufferManager采用时钟扫描算法逐出一个页面(受害页面),用于放置被请求的页面。
5、脏页刷盘
当页面发生修改(如元组增加、删除、修改),BufferManager通过检查点进程或后台写入器,完成脏页刷入存储。
三、核心代码
postgres\src\backend\storage\buffer\buf_table.c
postgres\src\backend\storage\buffer\bufmgr.c
postgres\src\backend\storage\buffer\freelist.c
网友评论