linux slub参考资料

来源:互联网 发布:淘宝客赚钱是真的吗 编辑:程序博客网 时间:2024/05/01 20:34

对slub感兴趣,搜集下来,供参考

https://www.ibm.com/developerworks/cn/linux/l-cn-slub/

http://blog.csdn.net/vanbreaker/article/details/7694648

slub基于slab分配器算法进行了改进,在linux 2.6.22加入内核,性能上提高了10%-20%,内存节省了50%,因此是更优秀的算法。嵌入式系统中,还有对应的slob分配器,是简化版本的。


下面转的这篇文章的博主有好多篇论述,要仔细看看

转载自http://blog.csdn.net/vanbreaker/article/details/7694648   

       Slab分配器一直处于内核内存管理的核心地位,尽管如此,它还是拥有自身的缺点,最明显的两点就是复杂性和过多的管理数据造成的内存上的开销。针对这些问题,linux引入了slub分配器,slub分配器保留了slab分配器的所有接口,实际上slub分配器的模型和slab分配的模型是基本一致的,只不过在一些地方进行了精简,这也使得slub分配器工作起来更为游刃有余。两者主要的区别如下:

  • slab分配器为了增加分配速度,引入了一些管理数组,如slab管理区中的kmem_bufctl数组和紧随本地CPU结构后面的用来跟踪最热空闲对象的数组,这些结构虽然加快了分配对象的速度,但也增加了一定的复杂性,而且随着系统变得庞大,其对内存的开销也越明显。而slub分配器则完全摒弃了这些管理数据,个人觉得这也是slub分配器最精髓的地方,至于slub分配器的具体做法是怎样的,后面再做分析;
  • slab分配器针对每个缓存,根据slab的状态划分了3个链表--full,partial和free. slub分配器做了简化,去掉了free链表,对于空闲的slab,slub分配器选择直接将其释放;
  • slub分配器摒弃了slab分配器中的着色概念,在slab分配器中,由于颜色的个数有限,因此着色也无法完全解决slab之间的缓存行冲突问题,考虑到着色造成了内存上的浪费,slub分配器没有引入着色;
  • 在NUMA架构的支持上,slub分配器也较slab分配器做了简化。

下面来看slub分配器涉及到的主要数据结构

缓存描述结构:

[cpp] view plaincopy
  1. <span style="font-size:12px;">struct kmem_cache {  
  2.     /* Used for retriving partial slabs etc */  
  3.     unsigned long flags; /* cache属性的描述标识 */  
  4.     int size;        /* 分配给对象的内存大小,可能大于实际对象的大小 */  
  5.     int objsize;         /* 对象的实际大小 */    
  6.     int offset;          /* 存放空闲对象的偏移,以字节为单位 */  
  7.     struct kmem_cache_order_objects oo;/* oo用来存放分配给slab的页框的阶数(高16位)和 
  8.                                                 slab中的对象数量(低16位) */  
  9.   
  10.     /* 
  11.      * Avoid an extra cache line for UP, SMP and for the node local to 
  12.      * struct kmem_cache. 
  13.      */  
  14.     struct kmem_cache_node local_node;/* 本地节点的slab信息 */  
  15.   
  16.     /* Allocation and freeing of slabs */  
  17.     struct kmem_cache_order_objects max;  
  18.     struct kmem_cache_order_objects min;  
  19.     gfp_t allocflags;      /* 分配时用的GFP标识 */  
  20.     int refcount;          /* 缓存中存在的对象种类数目,因为slub允许缓存复用, 
  21.                                   因此一个缓存中可能存在多种对象类型 */  
  22.     void (*ctor)(void *);  /* 创建对象的构造函数 */  
  23.     int inuse;             /* 元数据的偏移 */  
  24.     int align;         /* 对齐值 */  
  25.     unsigned long min_partial;/* partial slab链表中的最小slab数目 */  
  26.     const char *name;     /* 缓存名 */  
  27.     struct list_head list;    /* 用于将缓存链入slab_caches全局缓存链表 */  
  28. #ifdef CONFIG_SLUB_DEBUG  
  29.     struct kobject kobj;      /* For sysfs */  
  30. #endif  
  31.   
  32. #ifdef CONFIG_NUMA  
  33.     /* 
  34.      * Defragmentation by allocating from a remote node. 
  35.      */  
  36.     int remote_node_defrag_ratio;   /* 该值越小,越倾向于从本节点分配对象 */  
  37.     struct kmem_cache_node *node[MAX_NUMNODES];/* NUMA架构下每个节点对应的slab信息 */  
  38. #endif  
  39. #ifdef CONFIG_SMP  
  40.     struct kmem_cache_cpu *cpu_slab[NR_CPUS];  /* SMP系统下每个CPU对应的slab信息 */  
  41. #else  
  42.     struct kmem_cache_cpu cpu_slab; /* 单核系统下CPU对应的slab信息 */  
  43. #endif  
  44. };  
  45. </span>  


节点的slab信息描述结构:

[cpp] view plaincopy
  1. <span style="font-size:12px;">struct kmem_cache_node {  
  2.     spinlock_t list_lock;       /* Protect partial list and nr_partial */  
  3.     unsigned long nr_partial;   /* partial slab链表中slab的数量 */  
  4.     struct list_head partial;   /* partial slab链表表头*/  
  5. #ifdef CONFIG_SLUB_DEBUG  
  6.     atomic_long_t nr_slabs;      /* 节点中的slab数 */  
  7.     atomic_long_t total_objects; /* 节点中的对象数 */  
  8.     struct list_head full;       /* full slab链表表头 */  
  9. #endif  
  10. };</span>  


 

本地CPU的slab信息描述结构:

[cpp] view plaincopy
  1. <span style="font-size:12px;">struct kmem_cache_cpu {  
  2.     void **freelist;    /* 指向本地CPU的第一个空闲对象 */  
  3.     struct page *page;  /* 分配给本地CPU的slab的页框 */  
  4.     int node;           /* 页框所处的节点,值为-1时表示DEBUG */  
  5.     unsigned int offset;    /* 空闲对象指针的偏移,以字长为单位 */  
  6.     unsigned int objsize;   /* 对象的大小 */  
  7. #ifdef CONFIG_SLUB_STATS  
  8.     unsigned stat[NR_SLUB_STAT_ITEMS];/*用以记录slab的状态*/  
  9. #endif  
  10. };</span>  


 

用下图可以描述这些slub分配器的核心数据结构之间的关系

 

至此已大概介绍了slub分配器的一些概念和涉及到的核心数据结构,具体的实现细节和原理在后面分析各个部分的代码时再做交代!


0 0
原创粉丝点击