Postgres数据库的进程结构---菜鸟的PG分析之路

本文介绍了Postgres数据库的启动过程,包括Postmaster进程的初始化、内存上下文的分配、信号处理函数的注册以及系统日志进程syslogger的启动。此外,文章详细讲解了StartupProcess如何启动其他辅助子进程,如BgWriterProcess和WalWriterProcess,并阐述了PostmasterMain函数在检测和重启子进程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	if (argc > 1 && strcmp(argv[1], "--boot") == 0)
		AuxiliaryProcessMain(argc, argv);		/* does not return */
	else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
		GucInfoMain();			/* does not return */
	else if (argc > 1 && strcmp(argv[1], "--single") == 0)
		PostgresMain(argc, argv,
					 NULL,		/* no dbname */
					 strdup(get_user_name_or_exit(progname)));	/* does not return */
	else
		PostmasterMain(argc, argv);		/* does not return */

  Postgres数据库所有服务进程的入口均位于src/backend/main目录下的main函数,在启动PG数据库的命令行参数中,只要没有指定--single选项,程序都会跳转到PostgresMain所在的分支进行启动;只有当指定了以single模式启动,才会执行PostgresMain分支。程序在进入PostmasterMain分支执行前,会首先对数据库的内存上下文管理进行初始化,具体包括为顶层的TopMemoryContext分配内存空间、将全局变量CurrentMemoryContext指向刚分配的TopMemoryContext、以及初始化ErrorContext。在完成这一些列的内存上下文的初始化工作后,程序进入到PostmasterMain分支执行。

在PostmasterMain函数的执行过程中,会首先设置全局变量IsPostmasterEnvironment = true, 表明系统处在多用户模式下;接着会为Postmaster进程分配执行的内存上下文PostmasterContext,并切换到PostmasterContext上下文中;接着注册一系列的信号处理函数:并接下来设置数据库的工作目录以及从配置文件中载入GUC全局变量等;在设置好监听的网络端口后,会首先启动系统日志进程syslogger 子进程,具体的启动也是通过fork 函数载入 Postgres文件并设置对应的命令行参数为"--forklog"完成的。

	pqsignal(SIGHUP, SIGHUP_handler);	/* reread config file and have
										 * children do same */
	pqsignal(SIGINT, pmdie);	/* send SIGTERM and shut down */
	pqsignal(SIGQUIT, pmdie);	/* send SIGQUIT and die */
	pqsignal(SIGTERM, pmdie);	/* wait for childre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值