Solaris Slab Allocator–Magazines[4]

Dynamic Magazine Resizing

现在来讨论一下,magazine中的rounds M是如何确定的。M越大,cache命中率越高,但是内存消耗越大。solaris使用的是自适应的方法:

  1. 给M设定一个比较小的初始值,depot layer中维护一个变量contention_rate表示cache miss的程度
  2. 每次试图访问depot的时候,注意depot是所有的CPU共享的,我们先试图加一个non-blocking trylock…
  3. 如果加锁失败,说明出现竞争,contention_rate++
  4. 如果contention_rate超过某个阈值的时候,我们就增加magazine的M
  5. magazine的M是有上限的,以免失控!

umem_depot_alloc
{
    umem_magazine_t *mp;
    if(mutex_trylock(&cp->cache_depot_lock)!=0){ //如果non-block lock失败
          (void)mutex_lock(&cp->cache_depot_lock);
          cp->cache_depot_contention++;

    }
    …
    (void)mutex_lock(&cp->cache_depot_lock);
}

注意,这里并没有增加magazine的代码,solaris是专门有一个update线程来定时检查并完成magazine自适应的工作的。

你可能感兴趣的:(工作,cache,Solaris,layer)