zoukankan      html  css  js  c++  java
  • postgres启动过程分析

    今天来学习一下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步,然后根据不同入参走了不同的分支,因此以后要讨论到这些进程,就直接从这些分支开始。

  • 相关阅读:
    WSAAsyncSelect模型触发不了FD_Close消息?
    WSAAsyncSelect模型中,FD_WRITE事件什么时候触发?
    VC学习笔记:状态栏
    VC++对话框中加状态栏
    c++子类和父类成员函数重名
    vim学习笔记(11):vim 去掉<200b>
    tensorflow笔记5:tensorflow的基本运作,函数
    Anaconda的使用和包的更新;conda 创建虚拟环境
    vim学习笔记(10):vim命令大全
    tensorflow笔记4:函数:tf.assign()、tf.assign_add()、tf.identity()、tf.control_dependencies()
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/4190598.html
Copyright © 2011-2022 走看看