这一节 pg 初始化后台写进程( BgWriter )用到的相关结构,通过 BgWriterShmemInit 例程实现 。主要是初始化了一个 BgWriterShmemStruct 结构,并使用了面向过程C 语言编程的一个技巧,把这个结构中的固定长度数组 BgWriterRequest requests[1] 扩充成 NBuffers 个(根据默认值或 GUC 参数的设置计算得到)的 BgWriterRequest

后台写进程 bgwriter 是 pg8.0 新增加的。尝试维护一个常规 backend 进程来从必须写出的脏共享缓存写出数据。负责处理共享缓存数据交换、所有检查点的 WAL 日志。其和其他 backend

 

1 先上个图,看一下函数调用过程梗概,中间略过部分细节

 

初始化 BgWriter 内存 方 法调用流程图

 

2 初始化 xlog 相关结构

话说 main()-> … ->PostmasterMain()-> … ->reset_shared() -> CreateSharedMemoryAndSemaphores()> … -> BgWriterShmemInit() ,调用 ShmemInitStruct() , 在其中 调用 hash_search() 在哈希表索引 "ShmemIndex" 中查找 "Background Writer Data" ,如果没有,就在 shmemIndex 中给 "Background Writer Data" 分一个 HashElement 和 ShmemIndexEnt ( entry ) ,在其中的 Entry 中写上 "Background Writer Data" 。返回 ShmemInitStruct() ,再调用 ShmemAlloc() 在共享内存上给 "Background Writer Data" 相关结构(见下面“ Background Writer Data 相关结构图” )分配空间,设置 entry (在这儿及ShmemIndexEnt 类型变量)的成员 location 指向该空间, size 成员记录该空间大小 , 最后返回 BgWriterShmemInit () ,让 BgWriterShmemStruct * 类型静态 全局变量 BgWriterShmem 指向 所分配内存 ,初始化BgWriterShmemStruct

相关结构定义和图见下面:

 

typedef   struct 
 
{
 
      RelFileNodeBackend   rnode ;
 
      ForkNumber    forknum ;
 
      BlockNumber   segno ;            /* see md.c for special values */
 
      /* might add a real request-type field later; not needed yet */
 
}  BgWriterRequest ;
 
 
 
typedef   struct 
 
{
 
      pid_t         bgwriter_pid ;   /* PID of bgwriter
 
 
 
      slock_t          ckpt_lck ;       /* protects all the ckpt_* fields */
 
 
 
      int           ckpt_started ;   /* advances when checkpoint starts */
 
      int           ckpt_done ;      /* advances when checkpoint done */
 
      int           ckpt_failed ;    /* advances when checkpoint fails */
 
 
 
      int           ckpt_flags ;         /* checkpoint flags, as defined in xlog.h */
 
 
 
      uint32        num_backend_writes ;        /* counts non-bgwriter
 
      uint32        num_backend_fsync ;         /* counts non-bgwriter fsync
 
 
 
      int           num_requests ;   /* current # of requests */
 
      int           max_requests ;   /* allocated array size */
 
      BgWriterRequest   requests [1];      /* VARIABLE LENGTH ARRAY */
 
}  BgWriterShmemStruct ;
 
 
 
static   BgWriterShmemStruct  *BgWriterShmem;

 

初始化完 Background Writer Data

       为了精简上图,把创建 shmem 的哈希表索引 "ShmemIndex" 时创建的 HCTL 结构删掉了,这个结构的作用是记录创建可扩展哈希表的相关信息,不过这个结构在 "ShmemIndex" 创建完成后也会由于出了对象作用域而消失。增加了左边灰色底的部分,描述 共享内存 /shmem

 


 

Background Writer Data