postgresql源码学习(44)—— 守护进程Postmaster与服务进程Postgres

news/2024/5/2 17:33:25/文章来源:https://blog.csdn.net/Hehuyi_In/article/details/127147853

一、 Postmaster与Postgres进程的关系

      pg使用的是多进程架构,众多进程之中,最为重要的就是在前一节main函数中出现的Postmaster与Postgres进程。

  • 守护进程Postmaster:负责PG的启动和关闭;监听和接收客户端连接请求,为其派生服务进程Postgres
  • 服务进程Postgres:接收并执行客户端发送的命令,完成客户端的各种数据库操作并返回执行结果

     在Linux中,Postmaster仅是Postgres进程的一个符号链接;在windows中,Postmaster是Postgres的一个拷贝。因此,pg中的所有核心功能,几乎都是Postgres进程完成的。

     从main函数的调用中也可以看到,单用户模式下不需要Postmaster进程,只需要它的本体Postgres进程即可。

二、 守护进程Postmaster执行流程

1. 主要作用

Postmaster文件夹下包括下列文件:

      由此很明显能看出Postmaster进程的主要用途 —— 派生子进程。这既包括前面提到的Postgres进程,也包括大量的后台进程。

       它还负责中断、数据库启停等操作的处理,Postmaster进程本身并不直接处理这些事件,而是指派子进程在适当的事件处理。同时,它要在数据库崩溃时重启系统。

       Postmaster及其子进程通过共享内存和信号库(在启动时初始化)进行通信,这种多进程设计使其稳定性更强,即使某个后台进程崩溃也不会影响系统中其他进程的工作,Postmaster只需要重置共享内存即可从单个后台进程的崩溃中恢复(只是原理上是这样,实际上通过os命令kill pg的用户进程,都有可能整个pg实例崩溃)。

2. 代码核心流程

       这部分源码位于postmaster.c文件,由于内容太长,我们先只看初始化内存及信号处理设置的部分。

三、 PostmasterMain(1) —— 内存初始化与切换

       在main函数中,调用MemoryContextInit函数首先创建了顶层上下文TopMemoryContext和错误恢复处理的上下文ErrorContext。

/** MemoryContextInit*      Start up the memory-context subsystem.** This must be called before creating contexts or allocating memory in* contexts.  TopMemoryContext and ErrorContext are initialized here;* other contexts must be created afterwards.*/
void
MemoryContextInit(void)
{AssertState(TopMemoryContext == NULL);/** First, initialize TopMemoryContext, which is the parent of all others.*/TopMemoryContext = AllocSetContextCreate((MemoryContext) NULL,"TopMemoryContext",ALLOCSET_DEFAULT_SIZES);/** Not having any other place to point CurrentMemoryContext, make it point to TopMemoryContext.  Caller should change this soon!*/CurrentMemoryContext = TopMemoryContext;/** Initialize ErrorContext*/ErrorContext = AllocSetContextCreate(TopMemoryContext,"ErrorContext",8 * 1024,8 * 1024,8 * 1024);MemoryContextAllowInCriticalSection(ErrorContext, true);
}

        PostmasterMain中,调用AllocSetContextCreate()函数创建用于Postmaster工作的内存上下文PostmasterContext,并调用函数MemoryContextSwitchTo()将当前上下文切换到此处。这样若是在Postmaster模块若是出现内存相关的问题,不会影响到其余模块。

/** Postmaster main entry point*/
void
PostmasterMain(int argc, char *argv[])
{int         opt;int         status;char       *userDoption = NULL;bool        listen_addr_saved = false;int         i;char       *output_config_variable = NULL;InitProcessGlobals();PostmasterPid = MyProcPid;IsPostmasterEnvironment = true;/** 在checkDataDir()函数执行前不创建任何文件,但先用umask命令用来设置限制新建文件权限的掩码*/umask(PG_MODE_MASK_OWNER);/** 初始化内存上下文。TopMemoryContext是所有内存上下文的根,直到pg退出才会释放,后面会为各类操作单独创建内存上下文,避免内存泄漏问题。*/PostmasterContext = AllocSetContextCreate(TopMemoryContext,"Postmaster",ALLOCSET_DEFAULT_SIZES);MemoryContextSwitchTo(PostmasterContext);

四、 PostmasterMain(2) —— 信号处理函数设置

1. 原理简介

       信号是os响应某些状况而产生的事件,它可以明确由一个进程发给另一个进程,用这种方法传递信息或协调操作。进程可以自定义信号处理函数来处理信号,pg就是充分利用了这一点。

进程有权响应或屏蔽信号(SIGKILL和SIGSTOP不能屏蔽):

  • BlockSig:要屏蔽的信号集
  • UnBlockSig:不希望屏蔽的信号集
  • AutoBlockSig:在进行用户连接认证时需要屏蔽的信号集

        在设置响应信号的处理函数之前,要先通过PG_SETMASK函数把这些信号全部屏蔽,然后通过pgsignal函数为感兴趣的信号设置处理函数。

2. 常见信号处理函数及信号功能

① 处理函数SIGHUP_handler:处理SIGHUP信号。当配置文件发生改变时会产生SIGHUP信号,重读postgresql.conf文件,然后向子进程发送相同的信号,并重新装载pg_hba.conf和pg_ident.conf

② 处理函数pmdie:处理SIGTERM,SIGINT,SIGQUIT三种信号,这就是刚学关闭pg时的三种模式

  • SIGTERM:smart shutdown(类似oracle shutdown normal)
  • SIGINT:fast shutdown(类似oracle shutdown immediate)
  • SIGQUIT:immediate shutdown(类似oracle shutdown abort)

③ 处理函数reaper:当系统中有子进程退出时,子进程会给postmaster进程发送一个SIGCHLD信号,主进程收到后调用reaper函数清理退出的子进程(不同的进程有各自处理方式)。

其他主要信号量如下:

3. 相关源码

/* Initialize paths to installation files,获取安装路径 */getInstallationPaths(argv[0]);/** Set up signal handlers for the postmaster process. 信号处理函数设置*//* 在设置响应信号的处理函数之前,要先通过PG_SETMASK函数把这些信号全部屏蔽,然后通过pgsignal函数为感兴趣的信号设置处理函数 */pqinitmask();PG_SETMASK(&BlockSig);   pqsignal_pm(SIGHUP, SIGHUP_handler);    /* reread config file and have children do same */pqsignal_pm(SIGINT, pmdie); /* send SIGTERM and shut down */pqsignal_pm(SIGQUIT, pmdie);    /* send SIGQUIT and die */pqsignal_pm(SIGTERM, pmdie);    /* wait for children and shut down */pqsignal_pm(SIGALRM, SIG_IGN);  /* ignored */pqsignal_pm(SIGPIPE, SIG_IGN);  /* ignored */pqsignal_pm(SIGUSR1, sigusr1_handler);  /* message from child process */pqsignal_pm(SIGUSR2, dummy_handler);    /* unused, reserve for children */pqsignal_pm(SIGCHLD, reaper);   /* handle child termination */#ifdef SIGURGpqsignal_pm(SIGURG, SIG_IGN);   /* ignored */
#endif#ifdef SIGTTINpqsignal_pm(SIGTTIN, SIG_IGN);  /* ignored */
#endif
#ifdef SIGTTOUpqsignal_pm(SIGTTOU, SIG_IGN);  /* ignored */
#endif/* ignore SIGXFSZ, so that ulimit violations work like disk full */
#ifdef SIGXFSZpqsignal_pm(SIGXFSZ, SIG_IGN);  /* ignored */
#endif

后面是读取并设置GUC参数的部分,下节继续学习。

参考

《PostgreSQL数据库内核分析》第二章

http://www.javashuo.com/article/p-mmvwlzmf-ka.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_206647.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宋宇-课堂对话领域研究热点与 前沿趋势探究

好家伙。。。 看这种论文容易自闭,,,怎么能写这么好呢。。。 下次看看博士的论文吧还是。。 定义 课堂对话( classroom dialogue /discourse) 是师生间或者生生间围绕教育教 学目标的实现所形成的良性的交流活动。[1&#xff3d…

大一作业HTML电影网页作业(HTML+CSS)

🌩️ 精彩专栏推荐👇🏻👇🏻👇🏻 💂 作者主页: 【进入主页—🚀获取更多源码】 🎓 web前端期末大作业: 【📚HTML5网页期末作业 (1000套…

[leetcode]450.删除二叉树搜索树的节点

一.题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤&…

ES6--》读懂JS中—Class类

目录 Class类 初识class class中getter和setter设置 表达式方式书写 静态属性与静态方法 私有属性和私有方法 class继承 静态属性和方法继承 私有属性和方法继承 class显示原型与隐式原型关系 Class类 ES6提供了更接近传统语言的写法,引入了Class(类)这个…

脚本学习:1

今天所学的就俩个案例。 1.用脚本实现,鼠标移动到我的淘宝显示菜单&#xff0c;移除菜单隐藏 基本思路通过display来控制 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>脚本示例</title>&l…

03 NLP-神经网络基础常识复习3-梯度的推导和反向传播的实现

计算图的介绍结束了&#xff0c;下面我们来实现一些实用的层。这里&#xff0c;我们将实现Sigmoid层、全连接层,Affine层和Softmax with Loss层。 1.Sigmoid层 sigmoid函数由 表示&#xff0c; sigmoid函数的导数由下式表示 Sigmoid层的计算图可以绘制成如下图。这里&#x…

PWM实验(控制蜂鸣器,风扇,马达)

cortex-A7核实现PWM对蜂鸣器&#xff0c;风扇&#xff0c;马达的控制 1.PWM概念 PWM为一种对模拟信号电平进行数字编码的方法&#xff0c;通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 A7核的芯片有控制PWM的脉冲宽度调制定…

【设计模式】-创建型模式-第2章第4讲-【原型模式】

目录 1、原型模式&#xff08;Prototype Pattern&#xff09;概念 2、浅拷贝与深拷贝 2.1、概念 2.2、Java 中的深浅拷贝 浅拷贝&#xff1a; 深拷贝&#xff1a; 实例 浅拷贝 深拷贝的两种实现方式 方式一 方式二 3、原型模式的优缺点 4、 结尾 1、原型模式&#…

带你一步步分析webpack是如何执行打包产物的

引入关系如图所示&#xff1a; 圈出来文件d是异步导入的文件。 wepback版本如图所示&#xff1a; 执行打包命令&#xff0c;产物如下图&#xff1a; 会生成两个js文件&#xff0c;一个是入口文件打包的testxx.js&#xff0c;还有一个是异步文件d生成的src_d_js.js。 打包后的…

CSS学习298~355(品优购+Web服务器)

1 品优购项目规划 1.1 网站制作流程 我们主要做前台页面设计 1.2 品优购项目整体介绍 项目名称: 品优购项目描述:品优购是一个电商网站,我们要完成PC端首页、列表页、注册页面的制作 1.3 品优购项目的学习目的 电商类网站比较综合,里面需要大量的布局技术,包括布局方式、…

数据结构-复杂度(深入学习版+Java版)

文章目录一、复杂度经典例子分析1、计算时间复杂度分析题1&#xff1a;O(NM)&#xff0c;循环题2&#xff1a;O(N^2)&#xff0c;冒泡排序题3&#xff1a;O(logN)&#xff0c;二分查找题4&#xff1a;O(N)&#xff0c;阶乘递归题5&#xff1a;O(2^N)&#xff0c;斐波那契递归(满…

ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;…

回溯算法 - 二叉树中和为某一值的路径 字符串的排列

目录 1.二叉树中和为某一值的路径 1.1 题目描述 1.2 回溯算法的一般步骤 1.3 解题思路 1.4 代码实现 2. 字符串的排列 2.1 题目描述 2.2 解题思路 2.3 代码实现 1.二叉树中和为某一值的路径 1.1 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff…

华为模拟器ensp学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录前言1️⃣如何注册eNSP设备?2️⃣如何通过SecureCRT登录eNSP模拟设备&#xff1f;结语前言 记录华为模拟器使用中遇到的问题 1️⃣如何注册eNSP设备? 如何注册eNSP设备 重新注册AR、WLAN设备&#xff1a; 启动AR时&…

模块化:CommonJS规范

目录 CommonJS规范 模块使用环境区分 核心语法 如何使用 CommonJS&#xff1a;服务器端使用 CommonJS&#xff1a;浏览器端使用 CommonJS规范 模块使用环境区分 CommonJS规范中&#xff0c;每一个JS文件都可以作为一个模块。模块的引入&#xff0c;主要区分两个环境&…

基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的医院预约挂号小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序医院预约挂号系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设置医生排班信息、查看预约…

(附源码)计算机毕业设计SSM毕业设计管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3功能需求分析 本系统采用从上往下的步骤开发&#xff0c;基本功能如下&#xff1a; 本课题要求实现一套毕业设计管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;教师和学生&a…

python-pyecharts基础知识

资料来源&#xff1a;2022新版黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 折线图 地图 动态GDP增长图 补充知识&#xff1a; json 1&#xff09;JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去…

群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像

[群晖Docker套件注册Harbor私有镜像仓库&#xff0c;并下载运行自己发布的Docker镜像] 在进行微服务开发时&#xff0c;一些基础服务组件&#xff08;Nacos、Redis、Mysql&#xff09;的运行以及越来越多的业务服务组件的开发&#xff0c;会导致开发者电脑的内存资源紧张&#…

Android:玩转Jetpack Compose之MVI架构——基类中使用页面UiState

系列文章目录 架构一&#xff08;MVP&#xff09;&#xff1a;Android:玩转RetrofitOkHttpKotlin协程 网络请求架构 架构二&#xff08;MVVM&#xff09;&#xff1a;Android:玩转网络请求架构 RetrofitKotlin协程简单使用(MVVM架构模式) 架构三&#xff08;MVI&#xff09;&a…