Today is new!
00.01 Postgres简介
PostgreSQL
是以加州大学伯克利分校计算机系开发的POSTGRES Version 4.2
为基础的对象关系型数据库管理系统(ORDBMS), 为了更好的了解Postgres
的原理以及发展历史,我准备花费一段时间来学习Postgres
的源码,历史源码可在伯克利的POSTGRES 站点中获取,也可以在本系列文章的Git仓库中获取,本文为 Postgres-v3r1 源码阅读系列第一篇文章。
00.02 目录结构
顶层目录
COPYRIGHT
:版权与许可信息。bench/
:性能基准与压力测试脚本与查询集(如query1
~query32
、r1k
/r10k
)。demo/
:示例程序与脚本,展示数据库功能或扩展用法(如circle.c
、boxarea.c
)。doc/
:文档与手册来源(开发者说明、打印支持、参考文档生成相关文件)。newconf/
:构建与配置系统(Makefile 片段、平台/端口配置、依赖与文件清单)。ref/
:参考资料与工具(如libpq
客户端库文档、postquel
历史语言资料、Unix 脚本initdb
/vacuum
)。sample/
:示例说明或模板。test/
:独立测试脚本与示例代码(如script-1
、von.c
)。video/
:教学/演示用数据与脚本(如rect_data
和大量script-*
)。
核心源码 src/
每一个目录都对应着一个模块;
access/heap/
:堆表的存储访问方法实现。bootstrap/
:系统引导工具(创建系统目录/基础对象)。commands/
:SQL 命令层的实现(如CREATE
/ALTER
等)。contrib/3M/
:附加模块或第三方示例。executor/
:查询执行器(执行计划的实际运行)。lib/
:通用库和工具C/
、Gen/
、H/
:生成脚本、头文件与通用 C 代码。catalog/
:系统目录(元数据)相关工具与定义。libpq/
:客户端通信库(早期libpq
)。
main/
:服务入口(如main.c
)。parser/
:解析器及 I/O 例程(io.c
/io.h
)。planner/
:查询优化器与计划生成。port/
:不同平台的移植层(dec/
、sparc/
、sunos4/
等)。rewrite/
:规则系统重写器(基于规则的查询重写)。rules/
:规则定义与桩代码(prs2/
、stubs/
)。scripts/
:构建/运维/测试辅助脚本。storage/ipc/
:存储与进程间通信(共享内存、锁等)。support/
:构建与开发支撑工具。tcop/
:前后端命令处理与输出目标控制(如dest.c
)。test/
:源码内的测试配置(如buf.mk
)。utils/
:通用实用组件adt/
:内置类型与其函数。cache/
:系统缓存。error/
:错误与日志处理。fmgr/
:函数管理器(动态函数调用)。hash/
:哈希结构。init/
:初始化流程。mmgr/
:内存管理。sort/
:排序实现。time/
:时间/日期相关。
00.03 构建系统
当前工程的构建系统符合时代背景,它使用多个脚本协同进行构建项目,首先最主要的是一个使用csh编写的名为Make
的脚本来驱动整个构建过程的。
通过构建系统,主要可以得到如下目标:
- 可执行文件
postgres
:数据库后端主程序。postmaster
:PostgreSQL 主进程,负责初始化数据库系统、监听连接、管理后端进程。monitor
:监控工具,用于监控数据库系统的运行状态(依赖libpq.a
)。xexemon
: X11执行器监视器pg_version
:打印数据库版本信息。pg_id
: 用户/标识工具
- 静态库
cinterface.a
:C 接口库,用于与 C 代码交互。libpq.a
:PostgreSQL 客户端库,用于与postgres
后端交互。
总体思路
“驱动脚本 + 片段拼接”:
- 解析命令行参数,设置环境与开关。
- 根据目标名将
config.mk
、模块FILES/*.mkf
、规则postgres.mk
、support.mk
、postmaster.mk
、defaults.mk
等拼成一个临时Makefile
。 - 把该
Makefile
内容通过标准输入传给make -f -
在上级目录(项目根)执行,生成中间.o
聚合和最终二进制。
支持平台
底层支持的实现代码在src/port/
目录下,每个子目录对应着一个平台的实现。分别为
- dec: MIPS/DECstation 平台的通用移植
- decsprite: DEC MIPS + Sprite 操作系统的移植
- sparc: SPARC 平台的通用移植
- sun: SunOS 平台的通用移植
- sunos4: SunOS 4.x 平台的通用移植
- ultrix: DEC Ultrix 4.x 的专用移植(DEC 机器,MIPS/VAX 体系)
00.04 系统架构
本节的内容根据当前版本自带的文档进行整理,在本系列的最后一章会对系统架构进行详细的分析。
Postgres
采用三主程序的通讯结构,分别是
- 用户应用(User Application): 通过
libpq
与后端交互,可运行在任意可访问服务端的主机上。 - Postmaster: 处理网络初始化与链接;首次启动分配共享内存与信号量以供后端使用;为每个连接
fork
一个后端进程,之后返回监听。 - Postgres(backend): 真正的数据库引擎;与对应的用户应用一对一的查询与结果。
下一节将具体分析分析后端的代码逻辑。
Postgres-v3r1源码阅读00- 源码概述
http://example.com/2021/08/31/2021-09-01-Postgres-v3r1源码阅读00/