上篇博客简要的介绍了下psql命令行客户端的前台代码。这一次,我们来看看后台的代码吧。

十分不好意思的是,上篇博客我们只说明了前台登陆的代码,没有介绍前台登陆过程中,后台是如何工作的。即:后台接到前台的连接请求后发生了什么?调用了哪些函数?启动了哪些进程?

那么,我们就先讲讲后台的工作流程吧。


1.postgresql后台工作流程

这里首先我们要知道postgresql是典型的“Server/Client”的模式。即服务器后台有一个主进程(postmaster),该进程根据客户端的连接请求,fork一个服务端进程(postgres)为之服务。

具体来说,postmaster监听着一个特定的 TCP/IP 端口等待进来的连接。每当检测到一个连接请求时,postmaster进程派生出一个新的叫postgres的服务器进程。服务器任务(postgres进程)相互之间使用信号量和共享内存进行通讯, 以确保在并行的数据访问过程中的数据完整性。

前台程序发出一个启动命令后到Postmaster后,Postmaster根据其提供的信息建立一个子进程,也就是后台进程,专门为前台服务。Postmaster负责维护后台进程的生命周期,但与后台进程相独立。这样在后台进程崩溃后可以重启动后台进程而不会和这些后台进程一起崩溃。

落实到代码里呢?

我们首先看看\src\backend\main下的main.c文件。我们说过每个程序都有个“main”函数,之前也说明了psql里的main函数。后台的main函数就定义在main.c文件里。

在这个main函数里主要做了什么?我写在下面:

line99: 函数MemoryContextInit()启动必须的子系统error和memory管理系统;

line110:函数set_pglocale_pgservice()获取并设置环境变量;

line146~148: 函数init_locale初始化环境变量;

line219~228:根据输入参数确定程序走向,这里进入了PostmasterMain(){跳转至postmaster.c文件中}

网友评论