物理内存管理
[TOC]
体系结构
- 非一致内存访问(Non-Uniform Memory Access,NUMA):
- 内存被划分成多个内存节点的多处理器系统
- 访问一个内存节点花费的时间取决于处理器和内存节点的距离
- 每个处理器有一个本地内存,访问本地内存速度比较快
- 对称多处理器(Symmetric Multi-Processor,SMP):
- 一致内存访问
- 所有处理器访问内存花费时间相同
- 每个处理器仅在内核初始化的时候不平等,0 号处理器作为引导处理器负责初始化内核。
内存模型
内存模型:
- 平坦内存(Flat Memory):内存的物理地址连续
- 不连续内存(Discontiguous Memory):内存的物理地址空间存在空洞,可以高效处理空洞
- 稀疏内存(Sparse Memory):内存的物理地址空间存在空洞,支持内存热拔插
出现空洞的原因:
- 多块物理内存
- 一块内存也可能存在空洞
为什么需要多个内存模型:
平坦内存会为空洞分配page
结构体,会浪费内存;不连续内存可以高效处理空洞;稀疏内存可以支持内存热插拔。
内存管理三级结构
节点(node)、区域(zone)和页(page)
内存节点(node)
- NUMA 系统的内存节点,根据处理器和内存的距离划分
- 在具有不连续内存的 UMA 系统中,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点
内存节点使用一个pglist_data
结构体描述内存布局
内存区域(zone)
内存区域类型:
- ZONE_DMA
- ZONE_DMA32
- ZONE_NORMAL
- ZONE_HIGHMEM
- ZONE_MOVABLE
- ZONE_DEVICE
物理页(page)
- 每个物理页对应一个 page 结构体,称为页描述符
- 在系统启动时会初始化所有物理页对应的
page
物理内存管理_2021-09-30-10.36.38.excalidraw
- SECTION:稀疏内存模型的段编号
- NODE:节点编号
- ZONE:区域类型
- FLAGS:标志位
伙伴分配器
内核初始化后,使用页分配器管理物理页,当前使用的页分配器是伙伴分配器,该算法简单且高效。
基本概念
- 页块(page block):连续的物理页
- 阶(order):页的数量单位,个连续页称为 阶页块
- 伙伴(buddy):满足以下条件的两个阶页块
- 两个页块相邻,即物理地址连续
- 页块的第一页的物理页号是的整数倍
- 如果合成为(n+1)阶页块,第一页的物理页必须是的整数倍
- 每个分区有其独享的伙伴分配器
分配算法
伙伴分配器分配和释放物理页的数量单位是阶。
分配阶页块的过程可以分为查找阶空闲页块,分配阶空闲页块两个步骤:
查找阶空闲页块过程如下:
查看是否有空闲的阶页块:
- 如果有,则直接返回该空闲阶页块
- 如果没有,则递归查找空闲阶页块,并将阶页块分裂成两个阶页块,一个插入到空闲阶页块链表,一个返回。
释放阶页块过程:
查看其伙伴是否空闲:
- 如果伙伴不空闲,则插入到空闲阶页块链表
- 如果伙伴空闲,则合并成阶页块,并释放阶页块。