(KO) PostgreSQL 서버 아키텍처 — 섹션 개요
목차
이 섹션이 다루는 것
섹션 제목: “이 섹션이 다루는 것”이 서브카테고리는 머신 그 자체다. 프로세스들과 그것들이 공유하는 조율 구조 — 이것이 범위다. 프로세스들이 하는 일과는 구별된다. 아키텍처 개요의 핵심 명제는 PostgreSQL에서 공유 메모리가 곧 아키텍처이고 프로세스는 그 교체 가능한 주민이라는 것이다. 이 섹션은 그 명제의 두 부분을 메커니즘 수준에서 문서화한다. 주민이 누구인지, 그리고 그들이 어떻게 연결되고 조율하고 잠그고 신호를 보내는지가 이 섹션의 내용이다.
구체적인 범위는 다섯 묶음이다.
- fork 모델과 백엔드 수명 주기 — 단일 postmaster,
child_process_kinds레지스트리,fork()경로(또는EXEC_BACKEND재실행), 그리고 클라이언트 백엔드가InitProcess에서InitPostgres를 거쳐PostgresMain메시지 루프까지 하는 일. - 공유 메모리 / IPC 기반 — 고정 세그먼트를 부팅 시 한 번 크기 계산하고 생성하는 방식(
CalculateShmemSize→CreateSharedMemoryAndSemaphores), 모든 프로세스를 뒷받침하는PGPROC/ProcGlobal슬롯, 그리고 병렬 질의와 확장 기능이 부팅 이후 쓰는 동적 계층(dsm,dsa,shm_mq). - 세 가지 락 계층. 이 섹션의 무게 중심이다.
storage/lmgr/README가 열거하는 순서 그대로 구성했다.- LWLock + 스핀락 — 인메모리 공유 구조체를 보호하는 단기 두 모드(공유/배타) 래치. 교착 감지 없음, SQL에 보이지 않음.
- 헤비웨이트(정규) 락 테이블 — SQL 수준 락 매니저(
LOCK/PROCLOCK해시,AccessShareLock~AccessExclusiveLock). 완전한 waits-for 교착 감지기 포함. - SSI 서술 락 —
SIReadLock과 Serializable Snapshot Isolation(직렬화 가능 스냅샷 격리) 장치. 독자를 블록하지 않고SERIALIZABLE을 구현한다.
- 래치와 시그널 — 깨움 구조:
SetLatch/WaitLatch,WaitEventSet멀티플렉서,procsignal, 그리고 시그널을 안전하게 지연된 동작으로 전환하는 인터럽트 핸들러. - 보조 프로세스와 백그라운드 워커 프레임워크 — 클라이언트가 아닌 주민들(startup, checkpointer, bgwriter, walwriter, syslogger, PG18 I/O 워커)과, 병렬 질의·논리 apply·확장 기능이 추가 프로세스를 띄울 때 쓰는
RegisterBackgroundWorkerAPI.
명확한 경계 — 이 섹션이 다루지 않는 것. 이 서브카테고리는 조율 프리미티브와 프로세스 컨테이너를 담당하고, 페이로드 서브시스템은 모두 이웃 섹션으로 미룬다.
txn-recovery로. 여기서 다루는 락 계층은 락 메커니즘이다. 락의 트랜잭션적 의미 — 스냅샷, 락 대기가 참조하는 procarray, WAL, 커밋/중단, 복구 — 는txn-recovery에 있다. SSI는 잠금 메커니즘으로 여기서 문서화하고, 그 격리 의미론은txn-recovery의 스냅샷 모델과 연결된다.storage-engine으로. LWLock이 버퍼 헤더와 버퍼 풀을 보호하지만, 버퍼 매니저와 WAL-before-flush 규칙은storage-engine범위다. 이 섹션은 “LWLock이 프리미티브”라는 사실까지만 다루고, 무엇을 보호하는지는 보호 대상 구조체가 사는 섹션에서 설명한다.query-processing으로. 백엔드가 파싱→플래닝→실행 파이프라인을 돌리고, 병렬 질의가 이 섹션의shm_mq와 백그라운드 워커를 소비하지만, 파이프라인 자체와Gather/execParallel장치는query-processing소유다.replication-ha,monitoring-stats,ddl-schema로.walsender/walreceiver,autovacuum, 누적 통계 서브시스템, DDL은 모두 postmaster가 fork하는 역할이거나 sinval 큐의 소비자이지만, 그 동작은 각 섹션이 담당한다. 이 라우터는 그것들을BackendType주민으로 명시하고 해당 섹션을 가리킨다.- 캐시 무효화(
sinval) 는 같은 공유 메모리 기반 위에 얹히지만system-catalog(postgres-cache-invalidation.md)가 소유한다. 이 섹션은 큐가 여기서 크기가 정해진 세그먼트 안에 있다는 사실만 언급한다.
기반 구조
섹션 제목: “기반 구조”이 다이어그램은 이 서브카테고리의 모듈 문서들이 어떻게 연결되는지 보여 준다. postmaster가 공유 세그먼트의 크기를 정하고 생성한 뒤 주민들을 fork하면, 주민들은 IPC 기반, 세 가지 락 계층, 래치/시그널 구조로 조율한다. 노드 레이블은 postgres-*.md 문서 이름이다.
이 다이어그램에서 독자가 가지고 나가야 할 구조적 사실이 두 가지 있다. 첫째, 락 계층은 강도의 위계가 아니라 서로 다른 세 서브시스템이다. README는 LWLock, 헤비웨이트 락, 서술 락이 별개의 메커니즘임을 명확히 한다. 교착 감지는 헤비웨이트 계층에만 있고, 서술 잠금은 SSI에만 있다. 둘째, 여기서 다루는 모든 것은 PGPROC을 매개로 한다. 백엔드의 헤비웨이트 락 대기 큐, 래치, proc-signal 슬롯은 모두 PGPROC 항목에 매달린다. 그래서 proc.c가 락 매니저 문서와 공유 메모리 IPC 문서 양쪽에 등장한다.
읽는 순서
섹션 제목: “읽는 순서”상호 참조 우선 순서: 그 위에 서 있는 것보다 기반을 먼저 읽고, 락 정책보다 락 프리미티브를 먼저 읽는다.
postgres-shared-memory-ipc.md— 기반. 세그먼트,PGPROC/ProcGlobal슬롯, 동적 dsm/dsa/shm_mq 계층은 이 섹션의 모든 문서가 참조한다.postgres-postmaster.md— 세그먼트를 만들고 주민을 fork하는 주체.BackendType/child_process_kinds레지스트리.postgres-backend-lifecycle.md— fork된 클라이언트 백엔드가 실제로 하는 일(InitProcess→InitPostgres→ 메시지 루프). 이후 메커니즘에 구체적인 소유자를 부여한다.postgres-lwlock-spinlock.md— 락 프리미티브. 그 위에 얹힌 계층을 읽기 전에 먼저 본다.postgres-lock-manager.md— 헤비웨이트 테이블과 교착 감지기. LWLock 프리미티브와PGPROC대기 큐에 의존한다.postgres-ssi-predicate-locking.md— 서술 잠금과 SSI. 헤비웨이트 매니저 뒤에 읽는다.lmgr프레임을 재사용하기 때문이며, 격리 절반을 위해txn-recovery스냅샷 문서와 나란히 읽는다.postgres-latch-signals.md— 락 대기와 보조 프로세스가 블록하는 깨움 구조.postgres-aux-processes.md이어서postgres-background-workers.md— 나머지 주민들. 위의 모든 것을 소비하므로 마지막에 읽는다.
세부 문서 요약
섹션 제목: “세부 문서 요약”전방 참조 — 아래 모듈 문서들이 아직 존재하지 않을 수 있다. 설명은 각 문서의 계획된 범위다.
| 모듈 문서 | 한 줄 범위 |
|---|---|
postgres-postmaster.md | 단일 fork 부모: PostmasterMain → ServerLoop, child_process_kinds 레지스트리와 BackendType 역할, postmaster_child_launch(fork_process vs EXEC_BACKEND 재실행), 크래시·재시작 감독. |
postgres-backend-lifecycle.md | 클라이언트 백엔드의 fork부터 종료까지: InitProcess(PGPROC 확보), InitPostgres(DB 연결, 캐시 구축), PostgresMain 읽기-파싱-실행 메시지 루프, 리소스 오너와 on-shmem-exit 콜백을 통한 정리. |
postgres-shared-memory-ipc.md | IPC 기반: 고정 세그먼트 크기 계산(CalculateShmemSize → CreateSharedMemoryAndSemaphores), ShmemAlloc/ShmemInitStruct, PGPROC/ProcGlobal 슬롯 풀, 동적 계층 — dsm 세그먼트, dsa 할당자, 병렬 워커가 쓰는 shm_mq 단일 리더/라이터 큐. |
postgres-lock-manager.md | 헤비웨이트(정규) 락 매니저: 락 태그로 파티셔닝된 LOCK/PROCLOCK 공유 해시, 락 모드와 충돌 테이블, fast-path 잠금, LockAcquire/LockRelease, PGPROC 대기 큐, DeadLockCheck waits-for 사이클 감지기. |
postgres-lwlock-spinlock.md | 경량 계층: 하드웨어 기반으로서의 스핀락과 port/atomics, LWLockAcquire/LWLockRelease, 공유·배타 모드, 트랑슈와 이름 있는 LWLock, 이 계층에 교착 감지나 SQL 가시성이 없는 이유. |
postgres-ssi-predicate-locking.md | Serializable Snapshot Isolation: 다중 세분도의 SIReadLock 서술 락, rw-충돌 추적(SerializableXact), 직렬화 가능성을 유지하기 위해 트랜잭션 하나를 중단시키는 위험 구조 감지, predicate.c / README-SSI 설계. |
postgres-latch-signals.md | 깨움 구조: Latch와 SetLatch/WaitLatch, 소켓·래치·시그널에 걸치는 WaitEventSet 멀티플렉서, ProcSignal 크로스 백엔드 시그널링, 인터럽트 패턴(ProcessInterrupts, 지연된 CHECK_FOR_INTERRUPTS). |
postgres-background-workers.md | bgworker 프레임워크: RegisterBackgroundWorker(정적) vs RegisterDynamicBackgroundWorker, BackgroundWorkerInitializeConnection, postmaster 슬롯 수명 주기, 병렬 질의와 논리 복제 apply가 dsm/shm_mq를 이용해 이 프레임워크에 올라타는 방식. |
postgres-aux-processes.md | 고정 보조 프로세스들: startup(복구 드라이버), checkpointer, bgwriter, walwriter, syslogger, PG18 I/O 워커 — 각각 AuxiliaryProcessMainCommon으로 진입하며, 각자 서비스하는 것과 소유한 공유 구조체. |
인접 섹션
섹션 제목: “인접 섹션”| 섹션 개요 | 인접한 이유 |
|---|---|
postgres-overview-txn-recovery.md | 가장 깊은 경계선. 여기서 다루는 락 계층은 메커니즘이고, 그 트랜잭션적 의미 — 락 대기가 참조하는 스냅샷(procarray), WAL, 커밋/중단, 복구 — 는 그쪽에 있다. SSI의 격리 의미론도 그 스냅샷 모델과 연결된다. |
postgres-overview-storage-engine.md | LWLock이 버퍼 헤더와 공유 버퍼 풀을 보호하고, 버퍼 매니저·smgr·WAL-before-flush 규칙은 그쪽 소유다. 이 섹션은 락 프리미티브를 제공하고, 그쪽은 보호 대상 구조체를 설명한다. |
postgres-overview-query-processing.md | 백엔드(수명 주기 문서)가 질의 파이프라인을 돌리고, 병렬 질의가 이 섹션의 shm_mq와 백그라운드 워커를 소비한다. Gather/execParallel 장치 자체는 그쪽 소유다. |
postgres-overview-system-catalog.md | sinval 캐시 무효화 큐는 여기서 크기가 정해진 공유 메모리 위에 얹히지만, 무효화 루프와 relcache/catcache는 postgres-cache-invalidation.md가 담당한다. |
postgres-overview-replication-ha.md | walsender/walreceiver와 슬롯 동기 워커는 postmaster가 fork하는 BackendType 주민이고, 복제 동작은 그쪽 소유다. |
postgres-overview-monitoring-stats.md | 누적 통계 서브시스템은 공유 메모리 안에 살고 백엔드들이 드레인하지만, 여기서 정의한 LWLock·헤비웨이트 대기를 이름으로 쓰는 대기 이벤트 보고는 그쪽 소유다. |