openGauss内核求索——缓冲区管理器
1.基本原理
缓冲管理器:主要是管理共享内和持久存储之间的数据传输,并可能对 DBMS 的性能产生重大影响。
缓冲区管理器、持久存储和后端进程之间的关系如下图所示:
2.缓冲区管理器结构
缓冲区管理器包括一个缓冲区表、缓冲区描述符和缓冲池。
缓冲区描述符:保存着页面的元数据,对应的页面则保存在缓冲池的槽位中。
缓冲池:缓冲池存储数据文件的页,如表的页面。缓冲池是一个数组,每个插槽存储数据文件的一页。缓冲池数组的索引称为buffer_id。
相关函数:BufferDesc *BufferAlloc
2.1 缓冲区标签
数据库为所有数据文件的每个页面分配一个唯一的标记,即缓冲区标签。
缓冲区标签由关系文件节点、关系分支编号和页面块号
typedef struct buftag {
RelFileNode rnode; * physical relation identifier */
ForkNumber forkNum;
BlockNumber blockNum; * blknum relative to begin of reln */
} BufferTag;
2.3缓冲区描述符
缓冲区描述符:保存着页面的元数据,对应的页面则保存在缓冲池的槽位中。缓冲区描述符的结构由BufferDesc结构定义。
2.3.1 缓冲区描述符结构体
结构体BufferDesc定义如下:
typedef struct BufferDesc {
BufferTag tag; * ID of page contained in buffer */
/* state of the tag, containing flags, refcount and usagecount */
pg_atomic_uint64 state;
int buf_id; * buffer's index number (from 0) */
ThreadId wait_backend_pid; * backend PID of pin-count waiter */
LWLock* io_in_progress_lock; * to wait for I/O to complete */
LWLock* content_lock; * to lock access to buffer contents */
BufferDescExtra *extra;
#ifdef USE_ASSERT_CHECKING
volatile uint64 lsn_dirty;
#endif
} BufferDesc;
<br>