- 论坛徽章:
- 4
|
我印象深.
简单的说就是slab是不定长内存池(若干不同size的桶), 每个桶内有一个Lru链表, 有一个free链表, 链表每个node就是hash node, 正在被使用的Node存在于hashtable以及slab lru中.
每次set new key, 先到对应的slab桶内的lru找当前reference=0的最老的过期的Node进行重用并update到lru的头部, 找不到则从slab分配新node(或者从mempool摘一个chunk到桶里然后切一个Node出来, 或者free list有现成的), 如果这也失败, 那么试图找reference=0且最老的尚未过期的node争取重用并update到lru的头部, 如果这也失败, 就彻底失败了.
reference是一个带锁引用计数实现, 因为memcached采用libevent+one_event_per_thread的实现, 涉及到对hash表或者node的并发访问, 所以有两种加锁策略, 对于涉及哈希表node增删的处理需要加大锁, 对于访问与修改Node->data的操作, 则只需要reference+1 -> handle -> reference -1 (if reference == 0 then delete the node), 这样把锁粒度降低到只需要在reference+1/-1时才需要加锁.
zylthinking 发表于 2013-02-09 13:18
不记得有 lru, 要不是忘记了, 就是后面加上的, 一天绝对无疑, 不过把头看痛了也是真的。 |
|