伙伴系统、slab、malloc辨析

版权声明:版权所有,转载请注明出处 https://blog.csdn.net/songchuwang1868/article/details/89521003

伙伴系统

伙伴系统用于管理物理页,主要目的在于维护可用的连续物理空间,避免外部碎片。所有关于内存分配的操作都会与其打交道,buddy是物理内存的管理的门户。

Slab

slab的目的在于避免内部碎片。从buddy系统获取的内存至少是一个页,也就是4K,如果仅仅需要8字节的内存,显然巨大的内部碎片无法容忍。

slab从buddy系统申请空间,将较大的连续内存拆分成一系列较小的内存块。申请空间时从slab中获取大小最相近的小块内存,这样可以有效减少内部碎片。在slab最大的块为8K,slab中所有块在物理上也是连续的。

上面说的用于内存分配的slab是通用的slab,主要用于支持kmalloc分配内存。

slab还有一个作用就是用作对象池,针对经常分配和回收的对象比如task_struct,可以分配一个slab对象池对其优化。这种slab是独立于通用的内存分配slab的,在内核中有很多这样的针对特定对象的slab。

在内核中想要分配一段连续的内存,首先向slab系统申请,如果不满足(超过两个页面,也就是8K),直接向buddy系统申请。如果还不满足(超过4M,也就是1024个页面),将无法获取到连续的物理地址。可以通过vmalloc获取虚拟地址空间连续,但物理地址不连续的更大的内存空间。

malloc

malloc是用户态使用的内存分配接口,一般通过mmap实现。但是最终还是向buddy申请内存,因为buddy系统是管理物理内存的门户。申请到大块内存后,再像slab一样对其进行细分维护,根据用户需要返回相应内存的指针。

猜你喜欢

转载自blog.csdn.net/songchuwang1868/article/details/89521003
今日推荐