1、物理页分配和管理,页单位——伙伴系统,避免外部碎片
由于某些物理页位于内存中的特殊为值,因此所有物理页不能一视同仁,通过zone将物理页分区,跟据每个区域zone划分形成链表,2^n的页框构成free_area[MAX_ORDER](MAX_ORDER默认11)。内核中分配空闲页面的基本函数是get_free_page/get_free_pages,它们或是分配单页或是分配指定的页面(1、2、4、8…1024页)。
2、小于一页,slab技术——避免内部碎片
在伙伴分配器之上,进一步划分物理页面至小物理块。“存储池”核心思想,。内存片段(小块内存)被看作对象,当被使用完后,并不直接释放而是被缓存到“存储池”里,留做下次使用,这无疑避免了频繁创建与销毁对象所带来的额外负载。
Slab技术不但避免了内存内部分片(下文将解释)带来的不便(引入Slab分配器的主要目的是为了减少对伙伴系统分配算法的调用次数——频繁分配和回收必然会导致内存碎片——难以找到大块连续的可用内存),而且可以很好地利用硬件缓存提高访问速度。
slab中的对象分配和销毁使用kmem_cache_alloc与kmem_cache_free。
Linux 内核提供了 slab 层(slab 分配器),其扮演了通用数据结构缓存层的角色。slab 层把不同的对象划分为所谓高速缓存组,其中每个高速缓存组都存放不同类型的对象,每种对象类型对应一个高速缓存。例如,一个高速缓存用于存放进程描述符,而另一个高速缓存存放索引节点对象,然