伙伴系统和slab内存分配机制详解

  • 内容
  • 评论
  • 相关

当在用户模式下运行进程请求额外内存时,从内核维护的空闲页帧列表上分配页面。这个列表通常使用页面置换算法来填充,如前所述,它很可能包含散布在物理内存中的空闲页面。也要记住,如果用户进程请求单个字节内存,那么就会导致内部碎片,因为进程会得到整个帧。

用于分配内核内存的空闲内存池通常不同于用于普通用户模式进程的列表。这有两个主要原因:

  1. 内核需要为不同大小的数据结构请求内存,其中有的小于一页。因此,内核应保守地使用内存,并努力最小化碎片浪费。这一点非常重要,因为许多操作系统的内核代码或数据不受调页系统的控制。
  2. 用户模式进程分配的页面不必位于连续物理内存。然而,有的硬件设备与物理内存直接交互,即无法享有虚拟内存接口带来的便利,因而可能要求内存常驻在连续物理内存中。

下面讨论两个策略,以便管理用于内核进程的空闲内存:“伙伴系统”和 slab 分配

伙伴系统

伙伴系统从物理连续的大小固定的段上进行分配。从这个段上分配内存,采用 2 的幂分配器来满足请求分配单元的大小为 2 的幂(4KB、 8KB、16KB 等)。请求单元的大小如不适当,就圆整到下一个更大的 2 的幂。例如,如果请求大小为 11KB,则按 16KB 的段来请求。

让我们考虑一个简单例子。假设内存段的大小最初为 256KB,内核请求 21KB 的内存。最初,这个段分为两个伙伴,称为 AL 和 AR,每个的大小都为 128KB;这两个伙伴之一进一步分成两个 64KB 的伙伴,即 BL 和 BR。然而,从 21KB 开始的下一个大的 2 的幂是 32KB,因此 BL 或 BR 再次划分为两个 32KB 的伙伴 CL 和 CR。因此,其中一个 32KB 的段可用于满足 21KB 请求。这种方案如图 1 所示,其中 CL 段是分配给 21KB 请求的。


伙伴系统分配
图 1 伙伴系统分配

本文标题:伙伴系统和slab内存分配机制详解

本文地址:https://www.hosteonscn.com/3639.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注