0%

OS Physical Memory Management

参考: 中国科学院大学 2025年秋《高级操作系统教程》课件

引入虚拟内存后,物理内存分配主要在以下四个场景出现

  1. 用户态应用程序触发 on-demand paging(延迟映射)时
    此时内核需要分配物理内存页,映射到对应的虚拟页
  2. 内核自己申请内存并使用时
    如用于内核自身的数据结构,通常通过 kmalloc() 完成
  3. 内核申请用于设备的 DMA 缓存时
    DMA 缓存通常需要连续的物理页
  4. 发生换页(swapping)时
    通过磁盘来扩展物理内存的容量

物理页分配: alloc_page()

物理内存分配器的指标:

  1. 资源利用率
  2. 分配性能

简单实现: bitmap 位图

用位图记录物理页是否空闲: 每个 bit 记录一个物理页的空闲状态

  • 分配时,通过 bitmap 查找空闲物理页,并在 bitmap 中标记非空闲
  • 回收时,在 bitmap 中,把对应的物理页标记成空闲

问题:导致外部碎片问题

伙伴系统(buddy system)

当一个请求需要分配 $m$ 个物理页时,

  1. 伙伴系统将寻找一个大小合适的块,
    该块包含 $2^n$ 个物理页,且满足 $2^n − 1 < m \le 2^n$
  2. 并将剩余的空闲块放到相应的链表中

合并过程

高效地找到伙伴块

  • 互为伙伴的两个块的物理地址仅有一位不同
  • 块的大小决定是哪一位

指标评估

  • 资源利用率
    • 外部碎片程度降低(但依旧存在)
    • 内部碎片依然存在
  • 分配性能
    • 分配的时间复杂度: $O(list-num)$
    • 合并的时间复杂度: $O(list-num)$