Solaris Slab Allocator–Magazines[3]

原创 2011年01月07日 16:40:00

Object Construction

经典的slab allocator在slab创建的时候给slab中的每个object应用constructor。这样当从slab中申请object的时候,拿到的object都是初始化好的。但是我们看这样一个极端的情况:假设每个object是8个字节大小,如果一个slab含有一个8K的页面,那一个slab可以容纳1024个object,如果该object的构造函数中为每个object申请1K 内存,那当这个 slab创建的时候一共分配了1M的内存。但是如果这个slab中只有很少的一部分object被实际使用,那很多的内存就被浪费了!

当引入magazine之后,solaris的策略是:

  1. slab中维护raw buffer,将object construction操作从slab layer上升到magazine layer中进行。
  2. 在 buffer 进入到magazine layer的时候进行construction。
  3. 当object 从magazine 还回slab layer时进行destruction,从而变成raw buffer。

不能迷信别人说的话,我们来看看实际的代码:umem_cache_alloc

    //情况4:从magazine layer分配full magazine失败, 我们试图slab layer取一块raw buffer
 
      buf = umem_slab_alloc(cp, umflag); //注意,返回的buffer是没有应用过构造函数的
        …
      if (cp->cache_flags & UMF_BUFTAG) {
          
           //Let umem_cache_alloc_debug() apply the constructor for us.
           if (umem_cache_alloc_debug(cp, buf, umflag) == -1) {
                if (umem_alloc_retry(cp, umflag)) {
                   goto retry;
                }
                return (NULL);
            }
            return (buf);  //一切顺利的话,返回构造好的object。
       }

注意到在umem_cache_alloc的情况4中并没有分配full magazine的代码哦!那full magazine是怎么产生的呢?首先我们要区分两个概念:

  1. Object Allocation: 在分配时,如果depot layer没有full magazine了,我们直接从slab layer取并应用constructor.
  2. Magazine Allocation: 在释放时,如果depot没有empty magazine,我们分配一个magazine。

Magazine只是一个管理容器。我们从不显式的分配full magazine,因为这没有必要 。当application释放objects的时候,就会将empty magazine填充成full magazine。

来看一下umem_cache_free 的代码:

_umem_cache_free(umem_cache_t *cp, void *buf)
{
      …
      for(;;){
               //情况1:当前magazine不是full magazine ,直接把object归还
               //情况2:当前magazine是full但是previous magazine为空,交换cur和prev后重试
               //情况3:cur和prev magazine都是full,从depot上取一个empty magazine…
               …
               //情况4:  1,2,3都失败了以后,试图分配empty magazine
               umem_magazine_t *emp = _umem_cache_alloc(mtp->mt_cache,UMEM_DEFAULT);
               if(emp!=NULL)
               {
                      umem_depot_free(cp, &cp->cache_empty,emp); //将分配的 empty magazine加到depot中
                      continue; //重试,于是下一轮会落入情况3
                }
                break; //如果分配empty magazine都失败了,我们只好调用slab_free直接返回给slab了。
         }
         umem_slab_free(cp,buf);
}

对于为什么从不显式分配full magazine我不是非常理解。我的猜测是:magazine其实是个容器,所谓full magazine,不过是先分配empty magazine,然后预先填充M个objects。如果 magazine的rounds=M,相当于要事先调用M次constructor,而其中M-1次都是负担。但是如果没有分配full magazine,就会使得cache miss rate上升啊??希望有同学可以解答我的疑问-:)    

Slab Allocator内存管理原理

原始出处:http://blog.sina.com.cn/s/blog_72995dcc01018t2t.html Slab Allocator(对象缓存分配) The fun...
  • wfreehorse
  • wfreehorse
  • 2017年03月13日 11:30
  • 155

【C++11新特性】 - 空间配置allocator类

今天我们来讲讲C++的allocator类。allocator类是一个模板,定义在头文件`memory`中,用于内存的分配、释放、管理,它帮助我们将内存分配和对象构造分离开来。具体地说,allocat...
  • Xiejingfa
  • Xiejingfa
  • 2016年03月22日 15:57
  • 4213

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

作为这个系列的第一篇,我先来描述一下slab系统。因为近些天有和同事,朋友讨论过这个主题,而且觉得这个主题还算比较典型,所以就作为第一篇了。其实按照操作系统理论来讲,进程管理应该更加重要些,按照我自己...
  • dog250
  • dog250
  • 2015年09月16日 05:08
  • 4856

slab分配器原理

SLAB分配器 用一句话来描述的话,slab的框架就是讲内存按照
  • shybrian
  • shybrian
  • 2014年05月02日 22:16
  • 3186

Linux系统内存消失与slab使用之谜

http://tech.foolpig.com/2012/07/11/linux-memory-slab-inode/ Linux系统内存消失与slab使用之谜 JUL ...
  • c453787298
  • c453787298
  • 2014年02月10日 17:21
  • 2964

memcache学习——内存管理机制slab allocator

大致浏览了一下memcached的源码,但是并没有对相关的知识点进行总结和记录,所以很快就忘了,这次打算将memcached的源码再学习一遍,并进行总结归纳。 memcached模块化设计比较好...
  • ranyongqing
  • ranyongqing
  • 2014年10月11日 10:37
  • 338

遵照std::allocator实现自定制的内存分配器

下面是标准库STL中allocator的实现 template class allocator : public _Allocator_base { // generic allocator ...
  • davidsu33
  • davidsu33
  • 2014年05月13日 22:50
  • 1380

C++ 内存分配allocator类

new有一些灵活性的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起。我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在...
  • u010984552
  • u010984552
  • 2016年10月24日 17:41
  • 621

solaris挂载iso镜像\制作\复制

挂载 bash-3.00# lofiadm -a /export/home/root/software/iso/slax-6.0.0pre3.iso /dev/lofi/1 bash-3.00#...
  • zhaojian1988
  • zhaojian1988
  • 2013年04月16日 15:36
  • 1233

详解slab机制

http://blog.csdn.net/u010246947/article/details/10133101 目前有很多讲slab的文章,要么是纯讲原理画一堆图结合源码不深导致理解困难,要么是纯...
  • cosmoslhf
  • cosmoslhf
  • 2015年01月15日 16:34
  • 9940
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Solaris Slab Allocator–Magazines[3]
举报原因:
原因补充:

(最多只允许输入30个字)