PostgreSQL runs on a remarkable range of hardware and operating systems: x86-64 and ARM64 servers, 32-bit embedded boards, Linux, FreeBSD, macOS, Windows, and even Solaris. The platform layer is the set of abstractions that lets the rest of the codebase remain blissfully unaware of which CPU instruction set is generating its CRC checksums, which kernel interface is dispatching its asynchronous I/O, or whether a “semaphore” is really a POSIX semaphore, a SysV semaphore, or a Win32 Event object.
This chapter dissects the four pillars of PostgreSQL’s platform abstraction:
| Pillar | What it hides | Key benefit |
|---|---|---|
| Atomic operations | CPU memory ordering, compare-and-swap instruction sets | Lock-free shared-memory algorithms |
| SIMD / CRC / NUMA | SSE4.2, AVX-512, ARMv8 CRC, NEON, POPCNT, libnuma | Hardware-accelerated data integrity and search |
| I/O backends | io_uring, worker-based AIO, synchronous fallback | Asynchronous storage without OS lock-in |
| Portability shims | Win32 vs POSIX signals, semaphore flavors, VFD layer | Single codebase across all supported OSes |
+-----------------------------------------------------------------------+
| PostgreSQL Backend Code |
+-----------------------------------------------------------------------+
| | | |
v v v v
+---------------+ +-------------+ +---------------+ +----------------+
| Atomic Ops | | SIMD / CRC | | AIO Subsystem | | Portability |
| pg_atomic_* | | Vector8/32 | | PgAioHandle | | VFD, signals, |
| barriers | | pg_crc32c | | IoMethodOps | | semaphores |
+---------------+ +-------------+ +---------------+ +----------------+
| | | |
v v v v
+-----------------------------------------------------------------------+
| arch-x86.h SSE4.2/NEON io_uring/worker win32_port.h |
| arch-arm.h pg_popcount method_sync.c posix_sema.c |
| arch-ppc.h pg_numa.c sysv_sema.c |
| generic-gcc.h fd.c (VFD cache) |
+-----------------------------------------------------------------------+
| | | |
v v v v
+-----------------------------------------------------------------------+
| Operating System / Hardware |
| x86-64 TSO ARM64 weakly-ordered Linux io_uring Win32 API |
+-----------------------------------------------------------------------+
Performance. A single CRC-32C computation over an 8 KB page takes roughly 30 ns with hardware-accelerated SSE4.2 instructions versus 1200 ns with the software slicing-by-8 fallback – a 40x difference. Multiplied across every WAL record and every page checksum verification, the platform layer’s ability to dispatch to the fastest available instruction set is a measurable factor in overall throughput.
Correctness. On x86-64 (a TSO architecture), a store followed by a load to a different address can be reordered by the CPU. On ARM64 (weakly ordered), almost any pair of memory operations can be reordered. The atomics layer translates PostgreSQL’s memory-ordering requirements into the minimal set of barriers each architecture actually needs, preventing subtle concurrency bugs without paying for unnecessary fence instructions.
Portability. PostgreSQL’s process model depends heavily on fork(), shared
memory, and POSIX signals – none of which exist natively on Windows. The
portability shims in src/port/ and src/include/port/ paper over these
differences so that the rest of the code can use a single API.
| Path | Purpose |
|---|---|
src/include/port/atomics/ |
Architecture-specific atomic operation headers |
src/include/port/ |
Platform detection headers, SIMD, CRC, NUMA |
src/port/ |
Portable C implementations (CRC, popcount, NUMA, etc.) |
src/backend/port/ |
Semaphore and shared-memory backends |
src/backend/storage/aio/ |
Asynchronous I/O subsystem |
src/backend/storage/file/fd.c |
Virtual File Descriptor (VFD) cache |
pg_atomic_fetch_add_u32 for lock-free reference counting. The AIO subsystem’s read stream helper feeds directly into buffer pool reads.O_DIRECT + O_DSYNC for reduced latency.PAUSE instruction on x86 via pg_spin_delay().Vector8 / Vector32 operations accelerate text scanning and visibility-map checks in sequential scans.pg_numa_query_pages() to verify memory placement across NUMA nodes.