后台一等公民进程StartupDataBase调用函数链,通过fork子进程AuxiliaryProcessMain来执行StartupProcessMain函数。
StartChildProcess
StartChildProcess函数执行流程如下,子进程执行如下函数InitPostmasterChild、ClosePostmasterPorts、MemoryContextSwitchTo、MemoryContextDelete、AuxiliaryProcessMain,最后执行ExitPostmaster(0)。
InitPostmasterChild
InitPostmasterChild函数将IsUnderPostmaster设置为true,也就是postmaster的子进程。重置proc_exit proc_exit,初始化进程本地latch支持。调用PostmasterDeathSignalInit注册postmaster death信号处理函数。
信号 | 信号处理函数 | 功能 |
POSTMASTER_DEATH_SIGNAL | postmaster_death_handler | 子进程处理postmaster death信号(部分平台支持) |
ClosePostmasterPorts
AuxiliaryProcessMain
处理argv命令行参数
通过ps显示自己的进程情况
子进程环境初始化
BaseInit函数在standalone或under postmaster进行初期初始化后端backend,且是在InitPostgres之前执行。主要调用如下函数:InitCommunication、DebugFileOpen、InitFileAccess、InitSync、smgrinit、InitBufferPoolAccess。
在auxiliary process中不能像后端postgres一样直接执行InitPostgres进行初始化,需要执行另外的函数进行初始化。
ProcSignalInit函数在procsignal数组中注册当前进程。传入参数可以是后台进行的BackendId,或者是MaxBackends + aux process type。函数执行流程参考PostgreSQL数据库PMsignal——后端进程\Postmaster信号通信中的进程间信号通信。
BootstrapProcess
StartupProcessMain函数
StartupProcessMain函数主要工作是注册信号处理函数、PG_SETMASK(&UnBlockSig)和运行StartupXLOG函数。
信号 | 信号处理函数 | 功能 |
SIGHUP | StartupProcSigHupHandler | 重载配置文件 |
SIGINT | SIG_IGN | 忽略查询取消 |
SIGTERM | StartupProcShutdownHandler | request shutdown |
SIGQUIT | startupproc_quickdie | hard crash time |
SIGALRM | handle_sig_alarm | timeout |
SIGPIPE | SIG_IGN | |
SIGUSR1 | StartupProcSigUsr1Handler | |
SIGUSR2 | StartupProcTriggerHandler | |
SIGCHLD | SIG_DFL | |
STANDBY_DEADLOCK_TIMEOUT | StandbyDeadLockHandler | |
STANDBY_TIMEOUT | StandbyTimeoutHandler | |
STANDBY_LOCK_TIMEOUT | StandbyLockTimeoutHandler |
StartupXLOG
proc_exit(0)