1. 前言
在postmaster或standalone后端启动期间初始化全局进程表(global process table)。该过程由InitProcGlobal()完成,对于此函数:
- (1)还创建了支持所请求的后端数量所需的所有每个进程信号量。我们过去只在后端真正启动时才分配信号量,但这很糟糕,因为它会让Postgres在负载下失败——许多Unix系统(错误地)配置了对信号量数量的小限制,并且在尝试启动另一个后端时耗尽信号量是一个常见的故障。
- (2) 因此,现在我们获取了足够的信号量,以在初始化时立即支持所需的最大后端数量——如果系统管理员将MaxConnections、 max_worker_processes、 max_wal_senders或autovacuum_max_workers设置得高于其内核所支持的值,他迟早会发现这一点。
- (3)这里创建信号量的另一个原因是,信号量的实现通常要求我们在postmaster中创建信号量,而不是在后端中。
- (4)注意:这不是由postmaster下的单个后端调用的,即使在EXEC_BACKEND的情况下也是如此。ProcGlobal和AuxiliaryProcs指针必须为EXEC_BACKEND操作专门传播。
2. 创建进程表(prcesses table)
函数InitProcGlobal()的源码实现如下:
void InitProcG