Today is new!

00.01 Postgres简介

PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES Version 4.2为基础的对象关系型数据库管理系统(ORDBMS), 为了更好的了解Postgres的原理以及发展历史,我准备花费一段时间来学习Postgres的源码,历史源码可在伯克利的POSTGRES 站点中获取,也可以在本系列文章的Git仓库中获取,本文为 Postgres-v3r1 源码阅读系列第一篇文章。

00.02 目录结构

顶层目录

  • COPYRIGHT:版权与许可信息。
  • bench/:性能基准与压力测试脚本与查询集(如 query1query32r1k/r10k)。
  • demo/:示例程序与脚本,展示数据库功能或扩展用法(如 circle.cboxarea.c)。
  • doc/:文档与手册来源(开发者说明、打印支持、参考文档生成相关文件)。
  • newconf/:构建与配置系统(Makefile 片段、平台/端口配置、依赖与文件清单)。
  • ref/:参考资料与工具(如 libpq 客户端库文档、postquel 历史语言资料、Unix 脚本 initdb/vacuum)。
  • sample/:示例说明或模板。
  • test/:独立测试脚本与示例代码(如 script-1von.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.mkpostmaster.mkdefaults.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/
Author
ULis3h
Posted on
September 1, 2021
Licensed under