linux内存管理 之 slab分配器

来源:互联网 发布:linux测试网络通不通 编辑:程序博客网 时间:2024/05/12 00:17

1、页面分配器是页面级的内存分配工具,能分配2的order次幂的连续物理内存。

     linux在页面级内存分配的基础上,开发了小内存分配方案--slab、slob、slub。

     后两者分別针对大型系统和嵌入式系统。

 

2、slab分配器的思想

      先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需要。

    

3、slab的数据结构

      struct kmem_cache

      struct slab

      malloc_sizes[]

      他们的结构关系如下图:


4、kmalloc kzalloc

      void *kmalloc(size_t size, gfp_t flags)

      代码流程:现利用size参数在malloc_sizes数组中找到大于等于size的值,通过它找到一个对应的slab分配器的kmem_cache,然后在它上面分配内存。

      不会分配ZONE_HIGHMEM区域的内存。

      static inline void *kzalloc(size_t size, gfp_t flags)

      把分配出来的内存清零



5、kcalloc


static inline void *kcalloc(size_t n, size_t size, gfp_t flags)

     

6、kfree

     void kfree (const void *objp)

     代码流程:根据要释放的内存指针objp调用virt_to_page来获得objp所在页面对象的指针*page

                       调用_cache_free来释放内存。




原创粉丝点击