PostgreSQL笔记19:进程与内存架构精解

PostgreSQL - 基础入门 它是开源的,其源代码是免费提供的。它是用PHP编写的PostgreSQL的基于Web的管理工具。PostgreSQL是跨平台的,可以在许多操作系统上运行,如Linux,FreeBSD,OS X,Solaris和Microsoft Windows等。它是一个命令行工具,也是管理PostgreSQL的主要工具。左外连接返回从“ON”条件中指定的左侧表中的所有行,只返回满足条件的另一个表中的行。右外连接返回从“ON”条件中指定的右侧表中的所有行,只返回满足条件的另一个表中的行。右边的空格填充到相等大小的字符。 阅读详情

纲要

  • PostgreSQL 系统架构概览
    • 客户端/服务器(C/S)模型
    • postmaster 守护进程
    • Backend 进程与 fork() 机制
  • 内存架构
    • 共享内存(Shared Memory)
      • 固定共享内存(shared_buffers、wal_buffers 等)
      • 动态共享内存(Dynamic Shared Memory,DSM)
    • 本地内存(Local Memory)
      • work_mem
      • maintenance_work_mem
      • temp_buffers
  • 后台进程
    • Checkpointer(检查点进程)
    • Background Writer(后台写进程)
    • WAL Writer(预写日志写进程)
    • Autovacuum Launcher / Autovacuum Worker(自动清理)
    • Stats Collector(统计信息收集器,PostgreSQL 15 起移除)
    • WAL Sender / WAL Receiver(物理复制)
    • Logger(日志收集器)
    • Archiver(归档进程)
  • 进程查看与验证(ps 命令)

系统架构概览

PostgreSQL 采用经典的 客户端/服务器(C/S)模型。客户端可以是 psql 命令行工具、JDBC 驱动程序、ODBC 驱动程序,以及 DBeaver、pgAdmin 等图形化管理工具。服务端则以 postmaster 为核心枢纽,统一管理连接请求、共享内存分配和后台进程的启停。

服务端

fork

fork

fork

连接请求

刷盘

存储层

PGDATA 数据目录

base/

pg_wal/

pg_log/

共享内存区域

shared_buffers

wal_buffers

锁/信号量

动态共享内存

后台进程

Checkpointer

Background Writer

WAL Writer

Autovacuum Launcher

Stats Collector
PG 15 起移除

客户端层

psql

JDBC/ODBC

DBeaver/pgAdmin

postmaster 守护进程

Backend 进程 1

Backend 进程 2

Backend 进程 N

PostgreSQL 与 MySQL 的核心区别之一在于进程模型:PostgreSQL 采用多进程架构,每个客户端连接对应一个独立的 Backend 进程;而 MySQL 采用多线程模型。

postmaster:一切进程的父进程

postmaster 是 PostgreSQL 实例启动时最先运行的进程。其主要职责包括:

  1. 加载 postgresql.conf 等配置文件
  2. 分配共享内存区域
  3. 启动各类后台辅助进程
  4. 在指定 TCP/IP 端口监听客户端连接请求

Backend 进程:每个连接一个进程

当客户端发起连接请求时,postmaster 首先通过 pg_hba.conf 进行认证检查,认证通过后调用 fork() 系统调用创建一个新的子进程——即 Backend 进程。此后,该 Backend 进程专门负责与对应客户端的所有通信和 SQL 执行,postmaster 不再参与其中。

共享内存 Backend 进程 postmaster 客户端 共享内存 Backend 进程 postmaster 客户端 连接请求 pg_hba.conf 认证 fork() 创建子进程 连接成功,转交 BE 发送 SQL 查询 读取/写入数据 返回结果集

内存架构

PostgreSQL 的内存分为两大类别:共享内存(Shared Memory) 和本地内存(Local Memory)。

共享内存(Shared Memory)

共享内存是 PostgreSQL 实例中所有进程共同访问的内存区域,是进程间通信(IPC)的核心载体。共享内存可进一步细分为两种类型:

固定共享内存

在实例启动时,postmaster 根据配置参数一次性分配固定大小的共享内存。主要组成部分包括:

组件配置参数用途
共享缓冲区shared_buffers缓存表和索引的数据页
WAL 缓冲区wal_buffers暂存 WAL 日志记录
锁空间—轻量级锁、共享锁、排他锁等
元数据缓存—系统表和对象元数据

shared_buffers 是 PostgreSQL 最核心的内存区域,相当于数据库的“二级缓存”。当执行查询需要读取数据时,Backend 进程会优先从 shared_buffers 中查找;若缓存未命中,再从磁盘读取并放入缓冲区。shared_buffers 的推荐配置为系统物理内存的 25% 左右。

-- 查看当前 shared_buffers 配置
SHOW shared_buffers;

-- 查看当前 wal_buffers 配置
SHOW wal_buffers;

-- 动态修改 shared_buffers(需重启)
ALTER SYSTEM SET shared_buffers = '4GB';
动态共享内存(Dynamic Shared Memory, DSM)

动态共享内存是 PostgreSQL 9.6 版本引入的特性,用于支持并行查询(Parallel Query)。并行查询允许一个 SQL 语句利用多个 CPU 核心协同计算——即“人多力量大”。

并行查询执行时,leader 进程会动态创建 DSM 段,并启动多个 worker 进程。这些 worker 进程通过 DSM 进行通信和元组传递,查询执行完毕后 DSM 随即释放。

-- 启用并行查询(默认开启)
SET max_parallel_workers_per_gather = 4;

-- 查看并行查询相关的 DSM 使用情况
SELECT * FROM pg_stat_activity WHERE backend_type = 'parallel worker';

本地内存(Local Memory)

每个 Backend 进程都拥有独立的本地内存区域,用于存放该会话执行 SQL 时的中间结果和临时数据结构。本地内存不与其他进程共享。主要参数包括:

参数默认值用途
work_mem4MB排序(ORDER BY、DISTINCT)、哈希连接(hash join)、聚合操作的内存
maintenance_work_mem64MBVACUUM、CREATE INDEX、REINDEX 等维护操作的内存
temp_buffers8MB临时表的缓冲区

需要注意的是,work_mem 是每个操作的内存上限,而非每个会话。一个复杂查询可能包含多个排序或哈希操作,每个操作都会独立申请 work_mem 内存。

-- 会话级调整 work_mem(仅对当前会话生效)
SET work_mem = '64MB';

-- 查看当前会话的 work_mem
SHOW work_mem;

-- 查看 maintenance_work_mem
SHOW maintenance_work_mem;

后台进程

PostgreSQL 在启动时会自动启动一组后台进程,各司其职,协同完成数据库的日常维护工作。

Checkpointer(检查点进程)

检查点(Checkpoint) 是确保数据库一致性的关键机制。Checkpointer 进程定期将 shared_buffers 中的所有脏页(Dirty Pages)写入磁盘。检查点完成后,意味着数据库在该时间点达到了一致性状态——所有已提交事务的修改均已持久化到磁盘。

检查点触发

定时触发
checkpoint_timeout

Checkpointer

WAL 段累积
max_wal_size

扫描 shared_buffers

将所有脏页刷盘

更新 pg_control
标记检查点完成

-- 查看检查点相关参数
SHOW checkpoint_timeout;   -- 默认 5min
SHOW max_wal_size;         -- 默认 1GB
SHOW checkpoint_completion_target; -- 默认 0.9

-- 手动触发检查点
CHECKPOINT;

Background Writer(后台写进程)

Background Writer 是 Checkpointer 的“好帮手”。它的职责是持续地、小批量地将 shared_buffers 中的脏页写入磁盘,而不是等到检查点时一次性全部刷盘。

这种设计可以有效分散 I/O 压力,避免检查点期间产生大量的 I/O 突发,从而降低对业务高峰期的性能冲击。

-- 查看 Background Writer 相关参数
SHOW bgwriter_delay;           -- 默认 200ms
SHOW bgwriter_lru_maxpages;    -- 默认 100
SHOW bgwriter_lru_multiplier;  -- 默认 2.0

-- 查看 Background Writer 统计信息
SELECT * FROM pg_stat_bgwriter;

WAL Writer(预写日志写进程)

WAL Writer 负责将 wal_buffers 中的 WAL 日志记录写入磁盘上的 WAL 文件。WAL(Write-Ahead Logging,预写日志)是 PostgreSQL 实现事务持久性和崩溃恢复的核心机制。

-- 查看 WAL 相关参数
SHOW wal_buffers;          -- 默认 -1(自动调整)
SHOW wal_writer_delay;     -- 默认 200ms
SHOW wal_writer_flush_after; -- 默认 1MB

Autovacuum Launcher / Worker(自动清理)

PostgreSQL 的 MVCC(多版本并发控制)机制中,UPDATE 和 DELETE 操作会在表中留下“死元组”(Dead Tuples)——类比房间里的外卖垃圾。Autovacuum 机制负责自动清理这些死元组并回收存储空间。

Autovacuum Launcher 是调度进程,它会定期检查哪些表需要清理,并启动 Autovacuum Worker 进程执行实际的清理工作。

此外,Autovacuum 还会更新表的统计信息(如表的行数、不同值的分布等),为查询优化器提供决策依据。

-- 查看 Autovacuum 相关参数
SHOW autovacuum;                -- on/off
SHOW autovacuum_vacuum_threshold; -- 默认 50
SHOW autovacuum_analyze_threshold; -- 默认 50

-- 手动执行 VACUUM(不回收空间给操作系统)
VACUUM my_table;

-- 手动执行 VACUUM FULL(回收空间,但会锁表)
VACUUM FULL my_table;

-- 手动更新统计信息
ANALYZE my_table;

Stats Collector(统计信息收集器)—— PostgreSQL 15 起移除

在 PostgreSQL 14 及更早版本中,Stats Collector 是一个独立的后台进程,负责收集全局统计信息(如表的行数、索引使用频率、值分布等),并通过临时文件(pg_stat_tmp 目录)进行持久化。

PostgreSQL 15 的重大变更:官方社区移除了 Stats Collector 进程,改用动态共享内存(DSM) 直接存储统计信息。

这一变更带来的改进包括:

  • 消除额外进程:不再需要独立的统计收集进程
  • 减少 I/O 开销:统计信息不再频繁写入临时文件
  • 更低延迟:统计信息实时写入共享内存,优化器可获得更及时的数据
-- PostgreSQL 15+ 查看统计信息的系统视图(用法不变)
SELECT * FROM pg_stat_user_tables WHERE schemaname = 'public';
SELECT * FROM pg_stat_indexes WHERE schemaname = 'public';
SELECT * FROM pg_stat_activity;

WAL Sender / WAL Receiver(复制相关)

  • WAL Sender:在主库(发布端)按需创建,负责将 WAL 日志流式发送给备库
  • WAL Receiver:在备库(订阅端)运行,负责接收来自主库的 WAL 日志流

这两个进程是 PostgreSQL 实现物理复制和高可用的核心组件。

-- 查看复制状态
SELECT * FROM pg_stat_replication;
SELECT * FROM pg_replication_slots;

其他后台进程

进程用途
Logger将数据库运行日志写入 pg_log 目录
Archiver将 WAL 日志归档到指定目录
Logical Replication Launcher管理逻辑复制的 worker 进程

进程验证:使用 ps 命令查看

在 Linux/Unix 系统中,可以使用 ps 命令查看 PostgreSQL 的进程树:

# 树形显示 PostgreSQL 进程
ps -ef | grep postgres

# 或使用 axjf 查看进程树
ps axjf | grep -E 'postgres|grep'

# 查看所有 PostgreSQL 相关进程
ps -eo pid,ppid,cmd | grep postgres | grep -v grep

典型的输出示例(PostgreSQL 14):

postmaster (PID 3416)
├── checkpointer
├── background writer
├── walwriter
├── autovacuum launcher
├── stats collector
├── logical replication launcher
├── postgres: backend process (client connection 1)
├── postgres: backend process (client connection 2)
└── ...

在 PostgreSQL 15+ 中,stats collector 进程将不再出现。

API 速览

配置参数查询

-- 查询单个参数
SHOW shared_buffers;

-- 查询所有参数
SELECT name, setting, unit, context FROM pg_settings WHERE name LIKE '%memory%';

动态修改配置(无需重启)

-- 修改 work_mem(会话级)
SET work_mem = '128MB';

-- 修改 work_mem(全局,需重载配置)
ALTER SYSTEM SET work_mem = '128MB';
SELECT pg_reload_conf();

手动触发维护操作

-- 手动检查点
CHECKPOINT;

-- 手动清理(不回收空间)
VACUUM my_table;

-- 手动清理并更新统计信息
VACUUM ANALYZE my_table;

-- 手动更新统计信息
ANALYZE my_table;

统计信息查询

-- 查看表级统计信息
SELECT * FROM pg_stat_user_tables WHERE schemaname = 'public';

-- 查看索引使用统计
SELECT * FROM pg_stat_indexes WHERE schemaname = 'public';

-- 查看后台进程统计
SELECT * FROM pg_stat_bgwriter;

-- 查看当前活动会话
SELECT pid, usename, application_name, client_addr, state, query 
FROM pg_stat_activity 
WHERE state = 'active';

Demo 简单示例

以下是一个使用 Node.js + pg 库的完整示例,演示了 PostgreSQL 连接、查询执行以及统计信息查看。

运行说明

  1. 确保本地已安装 PostgreSQL 并启动服务
  2. 创建一个测试数据库和测试表
  3. 安装依赖:npm install pg
  4. 运行脚本:node demo.js

代码示例

const { Client } = require('pg');

// PostgreSQL 连接配置
const config = {
  host: 'localhost',
  port: 5432,
  database: 'postgres',
  user: 'postgres',
  password: 'your_password',
};

async function runDemo() {
  const client = new Client(config);

  try {
    // 1. 建立连接 —— 对应 postmaster 创建 Backend 进程
    await client.connect();
    console.log('✅ 连接成功,Backend 进程已创建');

    // 2. 创建测试表
    await client.query(`
      DROP TABLE IF EXISTS test_users;
      CREATE TABLE test_users (
        id SERIAL PRIMARY KEY,
        name TEXT,
        age INTEGER,
        created_at TIMESTAMP DEFAULT NOW()
      );
    `);
    console.log('✅ 测试表创建成功');

    // 3. 插入测试数据
    await client.query(`
      INSERT INTO test_users (name, age)
      SELECT 
        'User_' || generate_series,
        floor(random() * 50 + 20)
      FROM generate_series(1, 10000);
    `);
    console.log('✅ 插入 10000 条测试数据');

    // 4. 执行查询 —— Backend 进程从 shared_buffers 读取数据
    const res = await client.query(`
      SELECT age, COUNT(*) 
      FROM test_users 
      GROUP BY age 
      ORDER BY age;
    `);
    console.log(`✅ 查询完成,返回 ${res.rowCount} 行`);

    // 5. 查看当前会话的 work_mem 设置
    const workMemRes = await client.query('SHOW work_mem;');
    console.log(`📊 当前 work_mem: ${workMemRes.rows[0].work_mem}`);

    // 6. 查看 shared_buffers 设置
    const sharedBuffersRes = await client.query('SHOW shared_buffers;');
    console.log(`📊 当前 shared_buffers: ${sharedBuffersRes.rows[0].shared_buffers}`);

    // 7. 查看表统计信息(由 Stats Collector / 共享内存提供)
    const statsRes = await client.query(`
      SELECT 
        schemaname,
        tablename,
        n_live_tup,
        n_dead_tup,
        last_vacuum,
        last_analyze
      FROM pg_stat_user_tables 
      WHERE tablename = 'test_users';
    `);
    console.log('📊 表统计信息:', JSON.stringify(statsRes.rows[0], null, 2));

    // 8. 查看后台进程统计
    const bgwriterRes = await client.query(`
      SELECT 
        checkpoints_timed,
        checkpoints_req,
        buffers_checkpoint,
        buffers_clean,
        buffers_backend
      FROM pg_stat_bgwriter;
    `);
    console.log('📊 后台写进程统计:', JSON.stringify(bgwriterRes.rows[0], null, 2));

    // 9. 查看当前活动会话(包含本会话的 Backend 进程)
    const activityRes = await client.query(`
      SELECT pid, usename, application_name, state, backend_type
      FROM pg_stat_activity 
      WHERE pid != pg_backend_pid();
    `);
    console.log(`📊 当前其他活动会话数: ${activityRes.rowCount}`);

    // 10. 清理测试数据
    await client.query('DROP TABLE test_users;');
    console.log('✅ 测试表已清理');

  } catch (err) {
    console.error('❌ 错误:', err.message);
  } finally {
    await client.end();
    console.log('✅ 连接已关闭,Backend 进程终止');
  }
}

runDemo();

代码说明

步骤对应技术点
连接建立postmaster 监听端口 → fork() 创建 Backend 进程
数据插入数据写入 shared_buffers,WAL 记录写入 wal_buffers
查询执行Backend 进程从 shared_buffers 读取缓存页
SHOW work_mem查看本地内存参数(会话级)
pg_stat_user_tables查看统计信息(PG 15 前来自 Stats Collector,PG 15+ 来自共享内存)
pg_stat_bgwriter查看 Background Writer 和 Checkpointer 的工作统计
pg_stat_activity查看所有 Backend 进程和后台进程的状态

对应的 PostgreSQL 原生指令

-- 连接数据库
psql -h localhost -p 5432 -U postgres -d postgres

-- 创建测试表
CREATE TABLE test_users (id SERIAL PRIMARY KEY, name TEXT, age INTEGER);

-- 插入测试数据
INSERT INTO test_users (name, age) SELECT 'User_' || generate_series, floor(random() * 50 + 20) FROM generate_series(1, 10000);

-- 执行查询
SELECT age, COUNT(*) FROM test_users GROUP BY age ORDER BY age;

-- 查看参数
SHOW work_mem;
SHOW shared_buffers;

-- 查看统计信息
SELECT schemaname, tablename, n_live_tup, n_dead_tup FROM pg_stat_user_tables WHERE tablename = 'test_users';

-- 查看后台写进程统计
SELECT * FROM pg_stat_bgwriter;

-- 查看活动会话
SELECT pid, usename, state, backend_type FROM pg_stat_activity;

-- 清理
DROP TABLE test_users;

技术点总结

  • 进程模型:每个客户端连接对应一个独立的 Backend 进程
  • 共享内存:shared_buffers 缓存数据页,wal_buffers 缓存 WAL 日志
  • 本地内存:work_mem 控制排序/哈希操作的内存上限
  • 后台进程:Checkpointer、Background Writer、WAL Writer、Autovacuum 等协同工作
  • 统计信息:PG 15 前由 Stats Collector 进程收集,PG 15+ 改用共享内存

项目难点与解决方案

核心难点

  • 多进程通信的复杂性:PostgreSQL 的多进程架构需要依赖共享内存和信号量实现进程间通信,对操作系统的 IPC 配置(如 shmmax、shmall)有较高要求
  • 检查点 I/O 冲击:Checkpointer 一次性刷盘大量脏页会导致 I/O 突发,影响在线业务的响应时间
  • MVCC 带来的垃圾膨胀:频繁的 UPDATE/DELETE 会产生大量死元组,若不及时清理会导致表膨胀和性能退化

解决方案

  • Background Writer 分摊 I/O 压力:通过 bgwriter_delay 和 bgwriter_lru_maxpages 参数控制刷盘节奏,将集中式 I/O 转化为分散式 I/O
  • Checkpoint 调优:通过 checkpoint_completion_target 参数(默认 0.9)延长检查点的完成窗口,平滑 I/O 负载
  • Autovacuum 精细化管理:根据表的大小和更新频率,为不同表设置不同的 autovacuum_vacuum_scale_factor 和 autovacuum_analyze_scale_factor,避免全表扫描带来的性能开销

广度

涵盖 PostgreSQL 从客户端连接、进程模型、内存架构到后台进程的完整体系,涉及 10+ 种核心进程和 6+ 个关键内存参数。

深度

深入剖析了共享内存的两种类型(固定 vs 动态)、Checkpointer 与 Background Writer 的协作机制、以及 PostgreSQL 15 移除 Stats Collector 的架构演进原因。

复杂度

涉及操作系统层面的进程管理(fork())、IPC 通信(共享内存/信号量)、数据库内核层面的缓冲区管理、WAL 机制和 MVCC 垃圾回收,属于 PostgreSQL 中级到高级的系统架构知识。

官方文档

参考链接

总结

本文系统梳理了 PostgreSQL 的进程与内存架构。PostgreSQL 采用多进程 C/S 模型,以 postmaster 为守护进程,通过 fork() 为每个客户端连接创建独立的 Backend 进程。

内存方面分为共享内存(包含固定大小的 shared_buffers/wal_buffers 和动态共享内存 DSM)和本地内存(work_mem、maintenance_work_mem、temp_buffers)。后台进程各司其职:Checkpointer 保障数据一致性、Background Writer 平滑 I/O 压力、WAL Writer 确保事务持久性、Autovacuum 清理 MVCC 垃圾并更新统计信息。

PostgreSQL 15 起移除了 Stats Collector 进程,改用共享内存存储统计信息,减少了 I/O 开销和进程间通信。理解这些底层机制,是进行性能调优、故障排查和架构设计的基础。

PostgreSql简介 PostgreSQL简介 阅读详情

相关推荐

【PostgreSQL】手把手教学PostgreSQL

PostgreSQL 是一个功能强大的开源对象关系数据库系统,它使用和扩展了 SQL 语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL 因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及软件背后的开源社区致力于始终如一地提供高性能和创新的解决方案而赢得了良好的声誉。数据类型基元:整数、数字、字符串、布尔值结构化:日期/时间、数组、范围/多范围、UUID文档:JSON/JSONB、XML、KEY-VALUE (HSTORE)几何:点、线、圆、多边形。

Fanjufei的博客 5579

PGSQL(PostgreSQL)数据库基础篇:PostgreSQL 的 主要优点 、 劣势 、体系结构 、核心功能 、安装教程。

1.最新版本和历史版本不分离存储,导致清理老旧版本时需要做更多的扫描,代价比较大但一般的数据库都有高峰期,如果合理安排VACUUM,这也不是很大的问题,而且在PostgreSQL9.0中VACUUM进一步被加强了。2.在PostgreSQL中,由于索引完全没有版本信息,不能实现Coverage index scan,即查询只扫描索引,不能直接从索引中返回所需的属性,还需要访问表,而Oracle与Innodb则可以。因为存储过程的存在也避免了在网络上大量原始的SQL语句的传输,这样的优势是显而易见的。

一码归一码@ 1万+

PostgreSQL的进程架构和内存架构

共享内存提供了数据的共享和重复使用,从而提高了性能和效率,而进程内存提高了数据的隔离性和安全性,从而保护了每个连接进程的数据和状态。后台进程是PostgreSQL启动时创建的第一个进程,它负责管理和控制数据库系统的全局操作,如启动和关闭其他进程、管理共享缓存、处理全局锁、处理全局事务、管理日志等。在PostgreSQL中,每个连接进程都有一个单独的后台进程与之对应,这个后台进程会监控和管理它所对应的连接进程。PostgreSQL的进程架构是由多个进程组成的,每个进程都有不同的作用和职责。

程序员野蛮成长 1821

数据库之PostgreSQL详解

在日常操作中,对于一组相关操作,通常要求要么都成功,要么都失败。在关系型数据库中,称这一组操作为事务。原子性A:事务是一个最小的执行单位,一次事务中的操作要么都成功,要么都失败。一致性C:在事务完成时,所有数据必须保持在一致的状态。(事务完成后吗,最终结果和预期结果是一致的)隔离性:一次事务操作,要么是其他事务操作前的状态,要么是其他事务操作后的状态,不存在中间状态。持久性:事务提交后,数据会落到本地磁盘,修改是永久性的。

励志成为一名优秀的全能型软件开发工程师。 2万+

《postgresql指南--内幕探索》第二章 进程与内存架构

本文参考书籍《postgresql指南–内幕探索》的 Chapter 2:Process and Memory Architecture 该书的网络内容可参考:The Internals of PostgreSQL 进程架构 Postgresql 是一个C/S架构的关系型数据库,由多个后台进程管理数据库,下面分别介绍一些这些进程: postgres server process :是所有进程的父进程 backend process:每一个客户端的连接都有一个后端进程存在 backgroud process

hmxz2nn的博客 1133

PostgreSQL的奥秘:物理、内存与进程模型的深度解析

PostgreSQL是一款强大的开源关系型数据库管理系统,以其灵活性和高性能著称。要充分发挥PostgreSQL的优势,了解其底层架构是至关重要的。本文将详细探讨PostgreSQL的物理、内存和进程模型,并提供实用的优化方案。

探索技术世界的奥秘 分享编程经验与创新见解 通过深入浅出的文章,助您在技术领域不断成长,让知识成为您前行的力量! 2093

PostgreSQL核心揭秘(二)-进程和内存架构

目录1、进程架构2、进程架构图3、内存架构4、内存架构图PostgreSQL 的进程架构采用了一个多进程的设计,这使其能够有效地管理并发连接和资源。以下是 PostgreSQL 的主要进程架构组成部分的详细描述:1. 主进程(Postmaster)功能:Postmaster 是 PostgreSQL 的主进程,负责启动和管理所有其他进程。它监听客户端连接请求,并为每个连接创建新的后端进程。重要性:...

qq_34692500的博客 1539

PostgreSQL 内存架构

用于排序操作(如ORDER BY, DISTINCT)和表连接(如merge-join, hash-join)。可用于扩展模块开发,如逻辑复制和pg_prewarm模块。:用于某些维护操作(如VACUUM, REINDEX)。:用于存放WAL数据(事务日志)在写入持久存储前的缓冲。:存储从持久存储加载的表和索引页面,供直接操作。(CLOG):记录所有事务的状态,用于并发控制。:由PostgreSQL服务器的所有进程共享。内存按需分配和释放,用于进程间通信。(如检查点进程、自动清理进程)。

zfj321的博客 747

Postgresql技术内幕系列-第二章 进程与内存架构

本章主要介绍pg的进程架构和内存架构,如果您对此已经非常熟悉,可跳过本章阅读后续章节。 2.1 进程架构 PostgreSQL是一个C/S架构的关系型数据库管理系统,在一个服务器中采用了多进程架构。 'PostgreSQL server'指的是用以一组数据库后台进程的集合,用于管理一个数据库集合。pg server包括以下主要后台进程: ...

yq272393925的博客 919

图解链表 —— JAVA中的单链表基本操作

文章目录1. 什么是链表2. 链表的种类3. 创建单链表3.1 创建 Node 类(车厢类)3.2 创建 MySingleList (火车类)4. 单链表的基本操作4.1 增加链表元素4.1.1 在链表头部添加元素4.1.2 在链表任意位置添加元素4.1.3 在链表尾部添加元素4.2 删除链表元素4.2.1 删除第一个节点元素4.2.2 删除任意位置 index 元素4.2.3 删除链表中指定元素的第一个节点4.2.4 删除链表的所有指定元素4.3 查找链表元素4.3.1 判断链表中是否包含元素 data4

AlinaQ05的博客 2503

从零到一:AVL Cruise与Matlab联合仿真DLL配置的避坑指南

本文详细介绍了AVL Cruise与Matlab联合仿真DLL配置的全流程,包括编译器选择、环境变量设置、DLL编译与模型导出等关键步骤。针对常见问题如版本匹配、路径错误等提供了实用解决方案,帮助工程师高效实现控制策略与整车性能仿真的无缝对接。

weixin_29054399的博客 567

PG INTERNAL-进程与内存架构

PG INTERNAL-进程与内存架构1.进程架构1.1Postgres Server Process1.2 Backend Process1.3 Background processes2.内存架构2.1 Local Memory Area2. Shared Memory Area 翻译http://www.interdb.jp/pg/pgsql02.html 1.进程架构 PostgreSQL是运行在单个主机的多进程架构的c/s类型的关系型数据库管理系统. 一组多进程共同管理一个database clu

feeling890712的博客 754

MATLAB打开.m文件乱码解决办法

Matlab打开.m文件出现中文乱码问题,是因为Matlab存在两种编码格式:GBK和UTF-8,而不同版本的Matlab编码格式可能不统一,因此在不同版本的Matlab打开文件,由于编码格式的改变,会导致注释乱码。 1.查看你的Matlab的文件编码方式,在Matlab的命令行窗口输入feature('locale') ,如下图,可以看到默认编码为GBK,那问题就变成了将Matlab的文件编码方式GBK修改成UTF-8; 2.找到你的Matlab安装目录bin文件夹下的lcdata_utf.

zhugby的博客 4万+

进程与内存架构

作者:崔鹏 目录 1.进程架构的概述 2.内存架构的概述 3.核心进程简介 4.核心进程源码浅析 进程架构概述1 – 体系架构概览 记忆方法:3 + 5 + 8 + 5 进程架构概述2 Backend Processes概述 后端进程,也称为postgres,由 postgres 服务器进程启动并处理由一个连接的客户端发出的所有语句。 它通过单个 TCP 连接与客户端通信,并在客户端断开连接时终止。 由于只允许操作一个数据...

长期深耕于云计算、大数据、数据库领域! 439

Keil5 安装与卸载全攻略:从零开始到完美避坑

本文提供了Keil5集成开发环境的完整安装与卸载指南。针对嵌入式开发新手,详细解析了安装前的关键准备、MDK核心与C51双环境的安装激活步骤、常见问题排查,并重点介绍了如何彻底卸载软件以避免残留问题,帮助用户从零开始搭建稳定高效的开发环境。

weixin_29172963的博客 636

XVF3800麦克风阵列实战:从选型到快速原型搭建

本文详细介绍了XVF3800麦克风阵列的选型与快速原型搭建实战经验。从开箱即用的特性到波束成形、回声消除等核心功能拆解,再到硬件设计避坑指南和固件开发技巧,帮助开发者高效实现智能语音设备的开发。特别适合智能音箱、会议终端等需要远场拾音和声源定位的应用场景。

weixin_29161719的博客 274

第二章 PostgreSQL进程和内存体系结构

搞了一个公众号PostgreSQL运维技术,欢迎来踩~ 悄悄放一张: PostgreSQL运维技术 本章总结了PostgreSQL的进程架构和内存架构。 2.1. Process Architecture(进程架构) PostgreSQL是一个客户端/服务器类型的关系数据库管理系统,具有多进程架构,运行在单个主机上。 多个进程协同管理一个数据库集群通常被称为“PostgreSQL server”,它包含以下类型的进程: postgres 服务器进程:postgres服务器进程...

深海微澜 727

Dify与第三方平台(飞书、微信、钉钉)LangBot机器人对接实战

调用链路:飞书用户发消息 → 飞书开放平台事件回调 → LangBot 服务 → Dify 应用接口 → Dify 知识库 + 大模型生成答案 → 原路返回飞书聊天框Dify:承载知识库、提示词配置、大模型调用能力;LangBot:多 IM 渠道适配器,统一对接各大 IM 开放平台与 Dify API;飞书开放平台:提供机器人消息收发、事件推送能力。LangBot 作为中间转发服务,一端对接 Dify 应用 API,一端对接飞书开放平台机器人接口;

悦分享 273

postgresql进程

参考在 PostgreSQL 中,当前端客户端(比如应用程序)发起连接时,后端进程会通过创建一个新的进程来专门处理该连接。这个新的进程被称为子进程。postgres进程会根据文件的配置来决定是否允许特定的客户端连接到数据库,并决定使用哪种认证方法(如密码验证、信任验证等)。是通过操作系统提供的或来判断是否有新的客户端连接。

weixin_46451326的博客 1635

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 134

落地实战!Python构建地方政府公开数据爬虫:政策/数据/规划全维度抓取(附反爬适配+数据清洗)

政务公开数据爬虫的核心不是“技术多先进”,而是“适配政务网站的特性”——慢一点、稳一点、合规一点,比追求抓取速度更重要。多地市爬虫集群:通过配置文件管理不同地市的URL规则,实现全省/全国政务数据抓取;图片表格识别:结合OCR工具(如pytesseract)识别政务网站的图片表格,转换为结构化数据;数据可视化:将抓取的统计数据导入PowerBI/Matplotlib,实现区域发展趋势分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1802

AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍

本文深入解析 PostgreSQL 的运行架构,揭示其多进程模型下各组件的职责与协作机制。Postmaster 作为父进程负责初始化共享内存、管理 backend 及辅助进程;每个客户端连接对应独立 backend 进程,实现故障隔离与稳定性保障。核心辅助进程如 Checkpointer、Background Writer、WAL Writer 分工明确,协同保障数据一致与性能。内存方面,共享内存(shared_buffers)与私有内存(work_mem)分工清晰,且存在“双缓冲”现象——shared_b

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 144

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2、postgresql运行架构

WAL记录了数据库的所有更改,使得在系统崩溃后可以从日志中恢复数据。WAL Writer进程(通常称为bgwriter,即后台写入器)是负责将这些事务日志写入磁盘的后台进程。先写日志后写库,如果崩溃了,可以通过该日志恢复数据,减小了磁盘读写次数,为啥?pg后端进程:由pg服务器启动,通过单个TCP和数据库连接,多个客户端连接时,设置max_connections可以控制客户端连接数量。:在重启数据库之前,可以执行这个命令,加快后续数据库的恢复。检查点进程,主要是缩短数据库实例恢复的时间。

lycdf的博客 1811

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

PostgreSQL内幕剖析——结构与架构

PostgreSQL内幕剖析:主要介绍PostgreSQL中的集群、数据库、表是什么即他们的逻辑结构和实际的物理结构。同时介绍了堆表文件写入读取元组的方法,并简单讲解PostgreSQL的进程架构和内存架构。

bang___bang_的博客 1563

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Postgresql 进程和内存结构

在本章中,总结了PostgreSQL中的流程体系结构和内存体系结构,以帮助阅读后续章节。如果您已经熟悉它们,可以跳过本章 1.进程结构 Postgresql 是一个C/S架构的关系型数据库,由多个后台进程管理数据库,下面分别介绍一些这些进程 postgres server process 是所有进程的父进程 backend process 每一个客户端的连接都有一个后端进...

weixin_30329623的博客 129

PostgreSQL进程结构

文章目录一、PostgreSQL进程分类二、进程介绍2.1 主进程postmaster2.2 Logger系统日志进程2.3 BgWriter后台写进程2.4 WalWriter预写日志进程2.5 PgArch归档进程2.6 AutoVacuum自动清理进程2.7 PgStat统计数据收集进程2.8 CheckPoint(检查点)进程 一、PostgreSQL进程分类 主进程Postmaster 辅助子进程Logger(系统日志)进程 辅助子进程BgWriter(后台写)进程 辅助子进程WalWrite

雪辉博客 3267
上一篇: PostgreSQL笔记18:物理备份体系详解——从底层API到工具生态
下一篇: PostgreSQL笔记20: 实例、集群、模板数据库与表空间 —— 逻辑体系架构深度解析
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值