页框
内核使用struct page 结构体描述每个物理页,也叫页框
伙伴算法
内核在很多情况下都需要申请连续的页框,数量不等。
实现:linux把所有的空闲页框分组为11个块链表,每个链表上的页框块是固定的,第i条链表中每个页框块都包含2的i次方个连续页。
实现了多个物理页的分配和管理
页框操作函数
static inline struct page *alloc_pages(gfp_t gfp_mask,unsigned int order)
分配2的order个连续的物理页,并返回一个指针,指向第一个页的page结构体
void *page_address(const struct page *page)
返回page页面所映射的虚拟地址
slab实现了内存分配和管理
slab层把不同的对象划分为所谓的高速缓存(cache)组,其中每个高速缓存都存放不同类型的对象
每种对象对应一个高速缓存
例如一个高速缓存存放task_struct结构体,而另外一个高速缓存存放struct inode结构体
slab由一个或者多个物理上连续的页组成,每个高速缓存由多个slab组成
slabs_full:分配完成的
slabs_partial:部分分配的
slabs_free:还没分配的
优点:
1 减少伙伴算法在分配小块连续内存时产生的内部碎片
2 将频繁使用的对象缓存起来,减少分配,初始化和释放对象的时间开销
3 通过着色技术调整对象以更好的使用硬件高速缓存
函数
struct kmem_cache*
kmem_cache_create(const char *name,size_t size,size_t allgn,unsigned long flags,void(*ctor)(void*))
建立自己的高速缓存
void *kmem_cache_alloc(struct kmem_cache*cachep,gfp_t flags)->slab_alloc
void kmem_cache_destroy(struct kmem_cache *s)