Postgres bgworker

发布时间:2026/9/14 19:07:38

Postgres bgworker 路径一RegisterBackgroundWorker静态注册入口bgworker.c:871-943调用方在shared_preload_libraries加载的模块的_PG_init()函数中调用调用流程RegisterBackgroundWorker(worker) [bgworker.c:871] │ ├─ 1. 检查 IsUnderPostmaster → false此时 postmaster 刚启动 ├─ 2. 检查是否在 shared_preload_libraries 加载期间 ├─ 3. SanityCheckBackgroundWorker(worker) [bgworker.c:652] ├─ 4. 拒绝 bgw_notify_pid ! 0静态注册不允许通知 ├─ 5. 检查 numworkers max_worker_processes ├─ 6. malloc RegisteredBgWorker拷贝 worker 数据 └─ 7. slist_push_head(BackgroundWorkerList, rw-rw_lnode) ← 直接加入 postmaster 私有链表后续处理PostmasterMain() [postmaster.c:1480] │ ├─ BackgroundWorkerShmemInit() [bgworker.c:158] │ └─ 遍历 BackgroundWorkerList将每个 rw 拷贝到共享内存 │ BackgroundWorkerData-slot[slotno].worker │ 并记录 rw-rw_shmem_slot slotno │ └─ maybe_start_bgworkers() [postmaster.c:5966] └─ 遍历 BackgroundWorkerList检查启动条件 └─ do_start_bgworker(rw) [postmaster.c:5768] ├─ fork_process() / bgworker_forkexec() ← fork 子进程 ├─ child: StartBackgroundWorker() [bgworker.c:741] └─ parent: 记录 rw_pid, ReportBackgroundWorkerPID()路径二RegisterDynamicBackgroundWorker动态注册入口bgworker.c:955-1048调用方普通 backend 进程如并行查询需要启动 parallel worker 时调用流程RegisterDynamicBackgroundWorker(worker, handle) [bgworker.c:956] │ ├─ 1. 检查 IsUnderPostmaster → true必须在 backend 中调用 ├─ 2. SanityCheckBackgroundWorker(worker, ERROR) ├─ 3. LWLockAcquire(BackgroundWorkerLock, LW_EXCLUSIVE) ├─ 4. 遍历 BackgroundWorkerData-slot[] 找空闲 slotin_use false ├─ 5. 将 worker 数据 memcpy 到 slot-worker ├─ 6. 设置 slot-pid InvalidPid, slot-generation ├─ 7. pg_write_barrier() → slot-in_use true ← 写内存屏障保证可见性 ├─ 8. LWLockRelease(BackgroundWorkerLock) ├─ 9. SendPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE) ← 通知 postmaster └─ 10. 返回 handle含 slotno generationPostmaster 侧响应ServerLoop() [postmaster.c:1888] │ ├─ 检测信号: │ CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE) │ └─ BackgroundWorkerStateChange(allow_new_workers) [bgworker.c:242] │ │ │ ├─ 遍历 BackgroundWorkerData-slot[] 所有 slot │ ├─ 找到 in_usetrue 但不在 BackgroundWorkerList 中的新 slot │ ├─ 从共享内存 slot-worker 拷贝数据到新的 RegisteredBgWorker │ ├─ 验证 bgw_notify_pid 有效性 │ └─ slist_push_head(BackgroundWorkerList, rw-rw_lnode) │ └─ maybe_start_bgworkers() [postmaster.c:5966] └─ 遍历 BackgroundWorkerList └─ do_start_bgworker(rw) [postmaster.c:5768] ├─ fork_process() ├─ child: StartBackgroundWorker() [bgworker.c:741] └─ parent: rw-rw_pid worker_pidStartBackgroundWorker被调用的两个位置StartBackgroundWorker()在子进程中执行有两个调用点场景位置说明非 EXEC_BACKEND(Unix)postmaster.c:5834fork_process()返回 0 后子进程直接调用EXEC_BACKEND(Windows)postmaster.c:5083bgworker_forkexec()→postmaster_forkexec()启动新进程进程入口SubPostmasterMain()解析--forkbgworkerN参数后调用StartBackgroundWorker内部做了什么bgworker.c:741-862设置IsBackgroundWorker true设置信号处理函数根据是否带数据库连接选择不同的 handler设置sigsetjmp异常处理InitProcess()— 创建 PGPROC 结构BaseInit()— 基础初始化LookupBackgroundWorkerFunction()— 加载动态库查找入口函数entrypt(worker-bgw_main_arg)—调用用户定义的主函数proc_exit(0)— 正常退出关键区别总结维度RegisterBackgroundWorkerRegisterDynamicBackgroundWorker调用时机postmaster 启动期间 (_PG_init)系统运行期间任意 backend调用环境!IsUnderPostmasterIsUnderPostmaster注册位置直接写入 postmaster 私有链表写入共享内存 slot通知机制无需通知postmaster 启动时自然感知SendPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)postmaster 感知BackgroundWorkerShmemInit()时顺带处理BackgroundWorkerStateChange()扫描共享内存bgw_notify_pid不支持必须是 0支持用于通知调用进程 worker 状态变化并发控制无需单进程启动阶段BackgroundWorkerLock(LWLock)最终启动✅ 都是通过maybe_start_bgworkers()→do_start_bgworker()→StartBackgroundWorker()
延伸阅读

更多相关文章

2026/9/12 4:10:13

Python列表操作全解析:从基础到高级技巧

1. Python列表基础概念与特性Python列表(List)是Python中最基础且强大的数据结构之一,它就像是一个可以装下任何东西的"魔法口袋"。想象一下你去超市购物时用的购物车——可以放入水果、蔬菜、日用品等各种不同类型的商品,Python列表也是如此灵…

2026/9/13 8:23:14

Go语言Context核心机制与应用实践

1. Context在Go语言中的核心作用Context是Go语言标准库中一个极其重要的包,它定义了Context类型,用于在API边界和进程之间传递截止时间、取消信号以及其他请求范围的值。在实际开发中,Context主要解决以下几个关键问题:跨API边界的…

2026/9/8 0:43:58

Windows官方镜像获取与使用全指南

1. 各版本Windows官方镜像获取指南对于需要重装系统或搭建虚拟机的用户来说,获取纯净的官方系统镜像是首要任务。微软其实为所有主流Windows版本都提供了官方下载渠道,只是不同版本的获取方式有所差异。1.1 Windows 11官方镜像获取目前最直接的方式是通过…

2026/9/14 19:05:20

陕西成人高考 2026:报名前一定要问机构的 7 个问题

直接答案:7 个问题——我的前置学历够报哪个层次?你们是什么身份?流程谁负责?钱交给谁?教务谁对接?学位怎么申请?你们不能做什么?这 7 问答得清楚,机构基本可以继续谈&am…

2026/9/14 19:00:20

vscode settings.json 配置冲突?用 TaoToken 让 Codex 逐项核

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码