发布时间:2026/7/18 5:32:49
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/7/18 5:32:49

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

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

2026/7/18 5:32:49

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

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

2026/7/18 5:27:49

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

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

2026/7/18 6:32:55

解锁AI图像创作的终极魔法:DreamOmni2零代码体验指南

解锁AI图像创作的终极魔法:DreamOmni2零代码体验指南 【免费下载链接】DreamOmni2 项目地址: https://ai.gitcode.com/hf_mirrors/xiabs/DreamOmni2 你是否曾幻想过,只需一句话或一张参考图,就能让AI精准理解你的创作意图&#xff1f…

2026/7/18 6:32:55

微信本地数据库安全解密技术:逆向工程与SQLCipher实战指南

1. 项目概述:WechatDecrypt的定位与核心价值最近在技术社区和开发者圈子里,关于微信本地数据处理的讨论又热了起来,尤其是“WechatDecrypt”这个关键词,频繁出现在各种技术论坛和开源项目里。这背后反映的,其实是很多开…

2026/7/18 6:32:55

Switch刷B站终极方案:wiliwili第三方客户端完整指南

Switch刷B站终极方案:wiliwili第三方客户端完整指南 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 还在为Switch上无…

2026/7/18 6:27:55

NestJS全栈开发实战:前端工程师转型企业级后端指南

这次我们来看一个前端程序员转型全栈工程师的实战路径——NestJS从基础搭建到企业级开发的完整指南。对于有26年前端经验的开发者来说,掌握NestJS意味着能够快速构建可维护的后端服务,突破技术栈边界。NestJS作为Node.js的渐进式框架,最大的特…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/18 0:00:24

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/17 14:59:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…