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>