# Page Structure
A **Page** (or Block) is the fundamental unit of storage in PostgreSQL. By default, pages are **8KB** in size and are the unit of I/O between the disk and the shared buffer cache.
For the narrative explanation of this concept, see [[Chapter 1/1.3 - The Shipping Container (The Page)|1.2 The Page (The Shipping Container)]].
## Page Layout
Each 8KB page is aligned to 8-byte boundaries and consists of the following regions:
1. **Page Header (24 bytes)**: Contains metadata such as:
- `pd_lsn`: Log Sequence Number (LSN) of the last WAL record that modified this page.
- `pd_checksum`: CRC checksum for integrity verification.
- `pd_lower`: Offset to the start of free space.
- `pd_upper`: Offset to the end of free space.
- `pd_special`: Offset to the start of the special space region.
2. **Item Identifiers (Linp)**: An array of 4-byte `ItemIdData` pointing to the actual tuples.
3. **Free Space**: The unallocated gap between item identifiers and tuples.
4. **Items (Tuples)**: The actual data tuples, stored from the end of the page upward.
5. **Special Space**: Optional region at the end of the page used by index access methods (e.g., for B-Tree sibling pointers).
## Internal Mechanisms
- **Fillfactor**: A storage parameter that determines the percentage of a page to be filled during initial INSERTs, leaving space for future UPDATEs to minimize fragmentation.
- **FSM (Free Space Map)**: A separate fork that tracks the amount of free space in each page to speed up the search for insertion targets.
- **VM (Visibility Map)**: A separate fork that tracks which pages contain only tuples visible to all transactions, optimizing VACUUM and index-only scans.
## See Also
- [[Structures/Tuple|Tuple Structure]]
- [[Structures/Table|Table Access Methods]]
- [[Architecture/WAL|Write-Ahead Logging]]