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步,然后根据不同入参走了不同的分支,因此以后要讨论到这些进程,就直接从这些分支开始。
postgres启动过程分析的更多相关文章
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
- 开机SystemServer到ActivityManagerService启动过程分析
开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...
- Neutron分析(2)——neutron-server启动过程分析
neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...
- linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)
回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...
- Activity启动过程分析
Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...
- Spark Streaming应用启动过程分析
本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...
- ActivityManagerService启动过程分析
之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...
- Disconf源码分析之启动过程分析下(2)
接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...
- Service启动过程分析
Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...
随机推荐
- 咕咕咕,skkyk的博客生活从此开始了
2019-5-9 咕咕咕,skkyk的博客生活从此开始了 我是划水时长两个半小时的个人OIer skkyk,我喜欢打表,暴零,骗分,瞎搞(律师函警告); 2019-6-14 中考结束的第二天 我们苦逼 ...
- cf950d A Leapfrog in the Array
考虑在位置 \(p\) 的青蛙. 如果 \(p\) 是奇数,答案显然是 \((p+1)/2\). 否则,由于未跳时 \(p\) 左边有 \(p/2\) 只,则 \(p\) 右边有 \(n-p/2\) ...
- angular 组件之间传值
/** * Created by Administrator on 2017/8/28. */ var app =angular.module('app',[]); app.directive('fo ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛
Banana Bananas are the favoured food of monkeys. In the forest, there is a Banana Company that provi ...
- C语言的那些秘密之---函数返回局部变量[转]
来源:http://blog.csdn.net/haiwil/article/details/6691854/ 一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部 ...
- php文档php-fpm.conf配置
cat php-fpm.conf|grep -v "^;"|grep -v "^$" [global] pid = run/php-fpm.pid //pi ...
- jquery滚动条插件slimScroll
参数 width: 'auto', //可滚动区域宽度 height: '100%', //可滚动区域高度 size: '10px', //组件宽度 c ...
- 浅谈java内存泄漏
最近有朋友遇到个问题,tomcat在运行几天后就会报outofmemory,然后就死了,我就稍微总结了下内存泄漏的一些原因,纯属个人理解,欢迎大侠们劈砖: 一.字符串问题 这个也是一个常见的问题,我们 ...
- servlet分析
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- 【Codevs1922】骑士共存问题(最小割,二分图最大独立集转最大匹配)
题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个 ...