今天来学习一下pg启动的过程。

pg的启动命令./bin/postgres -D path/to/data。

1.主体监控进程

  postmaster进程进入无限循环,等待客户端请求并为之提供请求的服务。在无限循环里,postmaster进程通过调用操作系统接口select定期检查是否有客户端服务请求,如果没有,继续循环,如果有,就创建一个postgres子进程为其提供服务。

  在postmaster进程的serverloop方法中,进行中无限循环等待连接请求到达。调用OS的select接口检查端口上有无请求(看和端口对应的文件句柄有什么改变),调用select后,如果有请求到达,阻塞所有信号,为服务请求完成了新建连接后,postmaster进程再次循环等待不再阻塞信号。

  如果有连接请求,从socket数组ListenSocket(ListenSocket里存放的是服务器上的为socket准备的文件描述符FD)上取一个socket ListenSocket[i],把这个socket作为参数调用ConCreate方法创建一个port结构,主要是把port结构的文件描述符设置为服务器本地对应断口的文件描述符,以及给port结构的本地和远程地址填值,如果port创建成功,调用BackendStartup(port)创建一个portgres服务进程,并把客户端进程转接到这个新创建的postgres服务进程上,以后这个进程专门为该客户端进程提供服务,然后把调用streamclose该客户端进程和postmaster进程的连接关闭,再调用ConnFree释放服务器端的port结构对象。

2.postgres服务进程

启动进程里Main()->SubPostmasterMain(),调用了如下方法,启动XLOG后就结束了生命。

1)MemoryContextInt方法,参见《PostgresQL启动过程中的那些事一》;

2)InitializeGUCOptions方法,参见《PostgresQL启动过程中的那些事三》;

3)Read_backend_variablases方法,为重组BackendParameters结构读取前面存储的文件pgsql_tmp/pgsql_tmp.backend_var.[pid].[tmpFileNum];

4)PGSharedMemoryReAttach方法,attach进程postmaster里的共享内存;

5)read_nondefault_variables方法,读非默认GUC参数,参见《PostgresQL中的那些事十一:保存非默认GUC参数到文件》;

6)ClosePostmasterPorts方法,关闭“启动进程”不用的文件句柄,当然,在postmaster进程里这些文件还是打开的;

7)Securl_initialze方法,如果设置了客户端和服务器要使用SSL连接,初始化SSL 连接相关对象。pg用开源库openssl实现了相关功能,安全相关功能以后专题讨论吧,参见《pg启动过程中的那些事六》。

8)BackendInitialize方法,初始化后台进程和客户端交互的libpq协议相关实例,在port结构里设置客户端进程IP、端口等。

9)InitShmemAccess方法,在初始化本进程共享内存全局变量:这些shmem头的ShmemSegHdr、shmem起始地址ShmemBase和shmem结束地址+1的ShmemBase。定义见下面。

staticPGShmemHeader *ShmemSegHdr;           /* shared mem segment header */

staticvoid *ShmemBase;                      /* start address of shared memory */

staticvoid *ShmemEnd;                       /* end+1 address of shared memory */

10)InitProcess方法,初始化一个PGPROC结构;

11)CreateSharedMemoryAndSemaphores方法,参见《PostgresQL中的那些事七》;

12)BackendRun方法,为这个后台进程组织入参(一般为"postgres db_name"),然后传入PostgresMain方法。

13)PostgresMain方法是后台服务进程postgres进程的入口函数,其主要工作都在这个方法里。

3.后台进程启动

根据启动进程的传入参数“postgres –forkbackend NULL[v_AuxProcType]”走了"--forkbackend"这个分支。还有AutoVacuumLauncher进程、AutoVacuumWorker进程、归档进程、统计进程以及为前端提供服务的postgres进程等在进程初始阶段,几乎没有区别的都走了1-6步,然后根据不同入参走了不同的分支,因此以后要讨论到这些进程,就直接从这些分支开始。

postgres启动过程分析的更多相关文章

  1. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  2. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...

  3. Neutron分析(2)——neutron-server启动过程分析

    neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...

  4. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  5. Activity启动过程分析

    Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...

  6. Spark Streaming应用启动过程分析

    本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...

  7. ActivityManagerService启动过程分析

    之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...

  8. Disconf源码分析之启动过程分析下(2)

    接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...

  9. Service启动过程分析

    Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...

随机推荐

  1. 输入url后发生了什么

    (1)浏览器解析 (2)查询缓存 (3)DNS查询 顺序如下,若其中一步成功直接进去建立连接部分: -- 浏览器自身DNS -- 操作系统DNS -- 本地hosts文件 -- 像域名服务器发送请求 ...

  2. cookie小结(转)

    原文地址:http://www.cnblogs.com/xianyulaodi/p/6476991.html#_label0 作者:咸鱼老弟   阅读目录 什么是cookie       官方定义:N ...

  3. Oracle审计相关对象的迁移

    目录 创建审计用的表空间 在线迁移 查询结果 在日常的数据库维护中,经常出现因为数据库登录审计的功能启动,导致system表空间被用满.从而出现异常,一般建议把aud$相关对象迁移到其他表空间,从而避 ...

  4. python模拟浏览器webdriver登陆网站后抓取页面并输出

    关键在于以下两行代码 特别是find_element_by_xpath写法 很多写成 findElementsByXpath不知道是写错了 还是高级版本是这么写的... #webElement = s ...

  5. WordPress添加前台注册功能

    一.添加注册表单 1.首先在当前主题的目录下新建一个php文件,命名为reg-page.php,然后将page.php中的所有代码复制到reg-page.php中: 2.删除reg-page.php开 ...

  6. c标准库 徐明远 背景基础

    背景基础 1.c语言库用c语言编写   其他语言则不同 早期语言的库是用汇编语言编写的    不同的计算机体系结构有不同的汇编语言   所以在移植性方面差一点   而c语言可以编写出高度可移植性的代码 ...

  7. 【LeetCode】Combination Sum(组合总和)

    这道题是LeetCode里的第39道题. 题目描述: 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组 ...

  8. Python之Monitor监控线程(干货)

    在日常工作中常遇到这样的情况,我们需要一个监控线程用于随时的获得其他进程的任务请求,或者我们需要监视某些资源等的变化,一个高效的Monitor程序如何使用python语言实现呢?为了解决上述问题,我将 ...

  9. spring之生命周期

    1.容器中对的生命周期 spring可以管理 singleton作用域的bean的生命周期,spring可以精确地知道该bean何时被创建,何时被初始化完成,容器合适准备销毁该bean实例. spri ...

  10. Wing IDE 6.0 算号器注册机代码

    我开发Python时喜欢用Wing IDE, 然后最近发现Wing IDE升级到6.0版本了, 但是之前能在5.1上用的算号器代码不能用在6.0上了, 所以就上网搜搜是否有相关算号器, 果然, 找到了 ...