BackgroundWriterMain代码

本文主要探讨PostgreSQL的后台写进程BackgroundWriterMain的工作流程及核心逻辑,包括基础流程的介绍,逻辑部分的详细分析,以及关键函数代码的展示。
摘要由CSDN通过智能技术生成

提示:
由于工作原因文章还没有弄完,请跳过,弄完后,会删除此提示

基础流程:

BackgroundWriterMain
BgBuffferSync->
SyncOneBuffer-> 
FlushBuffer()-> 
smgrwrite()

逻辑部分

首先代码定义一些基础类型和变量,例如:信号的处理,bgwrite的内存上下文,错误处理机制等。 
    然后,进入后台写进程,后台写进程是一个死循环进程,启动后,如果没有一些特殊情况(如:master死亡,关机等信号)就会一直运行。
    此函数主要做一些简单的工作,如,监听信号(重新加载、关机等信号)确定是否退出或者重载。
    调用落盘函数接口(BgBufferSync),将落盘动作返回的统计动作发送给stat统计表。
    做一些简单的判断判断是否要进入一个长时间的睡眠(如果超过WL_TIMEOUT,并且连续两次没有落盘动作,就会进入一个长时间的睡眠)。
    如果睡眠时间到,或者睡眠期间有内存的分配操作,就会醒来。然后再次循环。

代码部分

void
BackgroundWriterMain(void)
{
    sigjmp_buf  local_sigjmp_buf;
    //解析:定义错误恢复变量,保存错误后信号
    MemoryContext bgwriter_context;
    //解析:定义内存上下文
    bool        prev_hibernate;
    //解析:定义预先睡眠,后面用来确定是否进入一个深度睡眠
    WritebackContext wb_context;
    //解析:定义后台写进程上下文
    //内存上下文解析:
    //1.pg是基于进程的,每个进程拥有一块内存,分配内存上下文为了方便内存的处理。
    //2.方便错误处理,自己进行内存的管理,方便错误发生时进行恢复操作。

    pqsignal(SIGHUP, BgSigHupHandler);  /* set flag to read config file */
    pqsignal(SIGINT, SIG_IGN);
    pqsignal(SIGTERM, ReqShutdownHandler);      /* shutdown */
    pqsignal(SIGQUIT, bg_quickdie);     /* hard crash time */
    pqs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值