# 物理内存管理
Date: 2019-11-03


#### 物理内存组织方式

- SMP: CPU 通过总线访问内存, 称为 SMP 对称多处理器, 采用平坦内存模型, 物理页号连续, 总线成为瓶颈
- NUMA: CPU 都有本地内存, 访问内存不用总线, 称为 NUMA 非一致内存访问 采用非连续内存模型，页号不连续
- 稀疏内存模型

下面以NUMA 为例.

#### 节点

- 数据结构 pglist\_data 表示 NUMA 节点 包括 id，page 数组,起始页号, 总页数, 可用页数

#### 区域 zone

- 节点分为多个区域 zone ZONE\_DMA; ZONE\_NORMAL; ZONE\_HIGHMEM, ZONE\_MOVABLE
    
- 数据结构 zone 表示 区域 包含第一个页页号; 区域总页数; 区域实际页数; 被伙伴系统管理的页数; 用 per\_cpu\_pageset 区分冷热页(热页, 被 CPU 缓存的页)
    

#### 页

- 数据结构 page 表示, 分配方式：
    
    - 匿名页分配;
    - 分配小块内存:
    - Linux 采用 slab allocator 技术; 申请一整页, 分为多个小块存储池, 用队列维护其状态(较复杂)
    - slub allocator 更简单
    - slob allocator 用于嵌入式
    - page 记录: 第一个 slab 对象; 空闲列表; 待释放列表

#### 页分配

- 使用伙伴系统 进行管理分配
- Linux 把空闲页分组为 11 个页块链表, 链表管理大小不同的页块(页大小 2^i \* 4KB)

