千家信息网

Windows系统下的PostgreSQL进程fork

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Windows系统下的PostgreSQL进程fork"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2026年11月02日Windows系统下的PostgreSQL进程fork

本篇内容介绍了"Windows系统下的PostgreSQL进程fork"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

原稿用Markdown编写,拷贝进微信平台时段落有时发生反转,段落1、2、3变成段落3、2、1,发布前可能没有检查出来,遇到别扭的地方试试反过来读。

Windows系统API我并不熟悉,所以本篇大致点出过程,更多细节还请阅读代码和详查微软文档。后边还会有一篇讲Windows下信号处理的模拟,内容跟这篇是关联的。

这篇文章假定读者已经了解*nix的fork,如果不了解,请自行阅读相关资料。

1、*nix下PG后端(backend)进程的发起:

static intBackendStartup(Port *port){...#ifdef EXEC_BACKEND        pid = backend_forkexec(port);#else                                                   /* !EXEC_BACKEND */        pid = fork_process();        if (pid == 0)                            /* child */        {...

当然这里还有一些其他逻辑,不细表,有兴趣可以自己瞅瞅,都不复杂。

2、函数 fork_process

代码位于 src/backend/postmaster/fork_process.c, 没有什么很复杂的逻辑:

#ifndef WIN32...pid_tfork_process(void){...        result = fork();        if (result == 0)        {

注意:这里有preprocessor,上边这段代码是 #ifndef WIN32 控制,也就是只在 *nix下有效。

3、Windows下的后端进程创建

编译Windows版的方法,可以自行阅读,它不一样的地方之一是启用预处理符 EXEC_BACKEND。这个开关在*nix一样有效,有兴趣可以自己试试启用它编译Linux版,个人感觉进程fork效率一定要低很多。

函数 backend_forkexec 中:

       av[ac++] = "postgres";        av[ac++] = "--forkbackend";

这里增加两个参数,一个是程序启动的文件名,一个是参数forkbackend,指定这是要启动一个fork后端的进程,启动过程中会有一些影响:

  if (strcmp(argv[1], "--forkbackend") == 0 ||        ...                PGSharedMemoryReAttach();

4、参数传递

fork()不需要考虑变量传递的问题,EXEC_BACKEND 时保存到临时文件里:

paramHandle = CreateFileMapping(INVALID_HANDLE_VALUE,...param = MapViewOfFile(paramHandle, ......if (!save_backend_variables(param, port, pi.hProcess, pi.dwProcessId))...

这部分代码在 EXEC_BACKEND 函数实现 internal_forkexec 里,可以结合Windows文档去理解。

5、为新进程准备共享内存

if (!pgwin32_ReserveSharedMemoryRegion(pi.hProcess))

以后有机会写共享内存时再写,感觉尤其是Windows下挺有必要。

6、进程创建

在调用 save_backend_variables 之前:

  if (!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_SUSPENDED,                                           NULL, NULL, &si, &pi))        {

这里 cmdLine 是 安装路径\postgres.exe --forkbackend nnn,最后一个参数是参数处理句柄,第一个参数的计算前几天写过。

从微软文档看,并没有说新创建的进程与postmaster之间是父子关系:

Creates a new process and its primary thread. The new process runs in the security context of the calling process.

7、后端进程启动不一样的处理分支

Windows下调用 SubPostmasterMain:

...#ifdef EXEC_BACKEND        if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)                SubPostmasterMain(argc, argv);     /* does not return */#endif...

此函数位于:src/backend/postmaster/postmaster.c

SubPostmasterMain(int argc, char *argv[])

8、参数读入

在Windows下,读取由 CreateFileMapping 创建的文件映射句柄:

#ifdef _WIN64        paramHandle = (HANDLE) _atoi64(id);#else        paramHandle = (HANDLE) atol(id);#endif        paramp = MapViewOfFile(paramHandle, FILE_MAP_READ, 0, 0, 0);

9、共享内存ReAttach

      if (strcmp(argv[1], "--forkbackend") == 0 ||                strcmp(argv[1], "--forkavlauncher") == 0 ||                strcmp(argv[1], "--forkavworker") == 0 ||                strcmp(argv[1], "--forkboot") == 0 ||                strncmp(argv[1], "--forkbgworker=", 15) == 0)                PGSharedMemoryReAttach();

"Windows系统下的PostgreSQL进程fork"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

进程 参数 代码 函数 系统 内存 内容 文件 文档 更多 处理 复杂 有效 兴趣 句柄 地方 感觉 段落 知识 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 广州大一互联网络科技有限公司 新华互联网科技学校 美国互联网保险保险科技 金融科技 互联网金融 互联网金融公司科技 卓越科技(互联网 ) 上海喔噻互联网科技 互联网金融科技平台 互联网系的金融科技公司 恒生互联网科技指数跳水 科技类公司包括互联网吗 威龙国际互联网科技公司 世界互联网领先科技成果获奖 烟台灵鸽互联网科技有限公司 雨阳互联网卡科技有限公司 张召忠谈中国互联网科技 国产互联网科技公司 马化腾互联网科技教学 小牛互联网科技有限公司地址 蓝思科技飞鸽互联网 江苏根荣互联网科技 互联网科技logo设计 互联网高科技企业 互联网5g黑科技有哪些 杭州壁岐互联网科技有限公司 山东子淼互联网科技有限公司 互联网企业科技类企业如何做账 浙南科技城互联网大厦招聘 广东猫王互联网科技有限公司电话
0