memcached中对cache的操作原来是借鉴了linux slab中对通用缓冲区分配的思想。
下面具体讲下我对slab的理解。
Caches_size , 里面根据缓冲区的大小分成若干队列。即如下结构体。在内核linux-2.4.0中按照大小分配了32-66536大小的缓冲池。
下面是caches_size的具体结构。
- /* Size description struct for general caches. */
- typedef struct cache_sizes {
- size_t cs_size;
- kmem_cache_t *cs_cachep;
- kmem_cache_t *cs_dmacachep;
- } cache_sizes_t;
- static cache_sizes_t cache_sizes[] = {
- #if PAGE_SIZE == 4096
- { 32, NULL, NULL},
- #endif
- { 64, NULL, NULL},
- { 128, NULL, NULL},
- { 256, NULL, NULL},
- { 512, NULL, NULL},
- { 1024, NULL, NULL},
- { 2048, NULL, NULL},
- { 4096, NULL, NULL},
- { 8192, NULL, NULL},
- { 16384, NULL, NULL},
- { 32768, NULL, NULL},
- { 65536, NULL, NULL},
- {131072, NULL, NULL},
- { 0, NULL, NULL}
- };
上面的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) |