一、概述
伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux在基于伙伴系统的基础上引入了基于对象(也叫内存区,Memory Area,是一个具有任意大小的以字节为单位的连续内存块)的内存管理(比如传统经典通用的SLAB、适用于嵌入式的SLOB、适用于大规模并行系统的SLUB,这里主要介绍SLUB)。基于对象的内存管理还有一个好处,就是尽量减少直接调用伙伴系统的API,因而对硬件高速缓存更加友好。
需要注意只能在基于线性映射的物理区域(比如ZONE_DMA、ZONE_NORMAL区)分配内存分配,因为ZONE_HIGHMEN区还没有虚拟地址。
1)核心思想
它的组织结构可以分为三层:对象object,slab(因为对象有不同的类型所以slab也有不同的类型),快速缓存(Cache,这里的快速缓存是一个纯软件的概念与CPU的硬件高速缓存完全不同。快速缓存也具有不同的类型,所有不同类型的快速缓存组织在一个名为slab_caches的双向链表中)。
创建的每个快速缓存由多个大块组成,一个大块是一个或多个连续的物理页,每个大块包含多个对象。也就是说它采用了面向对象的思想,基于对象类型管理内存,每种对象