Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350928
  • 博文数量: 63
  • 博客积分: 1412
  • 博客等级: 中尉
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 23:07
文章分类

全部博文(63)

文章存档

2012年(42)

2011年(21)

我的朋友

分类: C/C++

2012-05-22 11:36:15

这几天重新看了下linux slab 分配机制。
memcached中对cache的操作原来是借鉴了linux slab中对通用缓冲区分配的思想。
 
下面具体讲下我对slab的理解。

Caches_size 里面根据缓冲区的大小分成若干队列。即如下结构体。在内核linux-2.4.0中按照大小分配了32-66536大小的缓冲池。

下面是caches_size的具体结构。

点击(此处)折叠或打开

  1. /* Size description struct for general caches. */
  2. typedef struct cache_sizes {
  3.     size_t         cs_size;
  4.     kmem_cache_t    *cs_cachep;
  5.     kmem_cache_t    *cs_dmacachep;
  6. } cache_sizes_t;

  7. static cache_sizes_t cache_sizes[] = {
  8. #if PAGE_SIZE == 4096
  9.     { 32,    NULL, NULL},
  10. #endif
  11.     { 64,    NULL, NULL},
  12.     { 128,    NULL, NULL},
  13.     { 256,    NULL, NULL},
  14.     { 512,    NULL, NULL},
  15.     { 1024,    NULL, NULL},
  16.     { 2048,    NULL, NULL},
  17.     { 4096,    NULL, NULL},
  18.     { 8192,    NULL, NULL},
  19.     { 16384,    NULL, NULL},
  20.     { 32768,    NULL, NULL},
  21.     { 65536,    NULL, NULL},
  22.     {131072,    NULL, NULL},
  23.     { 0,    NULL, NULL}
  24. };

 

上面的kmem_cache_t,即struct kmem_cache_s这个结构体含有3个队列,分别是满的slab队列,部分空闲的slab队列和空闲slab队列。struct kmem_cache_s这个结构体其相当于我们常说的链表头,管理着所有的slab。见下图中的slabs_full,slabs_partial,slabs_empty


 

 

从上面可知,

(1)cache_sizes这个数组是linux slab缓冲区管理总的入口数组。数组中的每个元素包括了slab大小和struct kmem_cache_s结构体(该结构体是slab_t结构体的表头结点)。

(2)struct kmem_cache_s结构体管理着其下所有的满的、部分空闲的和空闲的所有slab

(3)Slab具体管理其对象。

 

阅读(4118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~