内核内存分配方式:Buddy and Slab System

分类:Operating System, 发布于:2019-03-20 11:02:00, 更新于:2019-04-19 00:09:40。 评论

Plain System

定义

保持一个顶部指针,每个内存对象相互链接。

优点

  • 分配快速
  • 实现简单(kmalloc只要10行)

缺点

  • 瞬间爆炸

Buddy System

定义

伙伴系统通过把一块大的内存分为两个等大小的部分(也有Fibonacci、带权重的版本),找到适合所需长度的最适合的内存块。

例如总内存为128,需要16的内存,可以将总内存分为64+64,进而将第一块分为32+32,然后再分为16+16,将此时的第一块标记为已用并返回。

被释放的内存只能和他对应的伙伴合体合并,恢复成一个大的可用内存块。

优点

  • 实现简单,使用二叉树来管理内存状态
  • 内存分配快速,开销很小
  • 与朴素的分配方法相比仅仅造成小幅度的内存碎片化

缺点

  • 分配大内存时会造成严重的碎片化。如33在普通的伙伴系统中只能由64满足,浪费了31的空间。

Slab System

定义

在slab系统中,cache用于存储同一种大小的内存空间对象,每一个cache中含有多个slab,每个slab管理一个或者多个内存页面。cache、slab和页面对象使用多级链表相互链接。

分配内存(alloc)时,首先找到分配大小所对应的cache对象,然后找到cache中有空闲位置的slab,将slab中的一个空对象取出,标记为已被占用。释放内存(free)时,直接将对应的内存对象标记为空闲即可,下次使用时直接重新使用该对象。

如果cache没有slab或者全部已满,则创建一个新的slab,根据内存占用大小分配一个或多个内存页面,此时预先处理好内存页面的所有可分配对象,来提高后面分配内存的速度,这个过程成为增长(grow)。如果内存空间紧缩,可以通过收割(reap)函数来收回所有完全空闲的slabs。(然而好像 内 存 很 大 完全够用)

优点

  • 无内存浪费
  • cache的预处理使得内存分配快速
  • 内存回收简单高效,可以废物再利用循环使用内存空间

References

评论