linux 内核内存管理办法简介(下)

     伙伴系统算法,设和与申请以页框为单位的大块内存请求。而当申请几十字节的内存时,采用伙伴系统,分配一个页框,显然是浪费空间。实际上,内核采用了slab分配器进行管理。

     采用slab分配器,是基于以下假设:
     1> 内核会经常申请若干种同样大小的内存,如分配一个新的进程描述符,为一个磁盘文件分配一个新的inode对象,dentry对象等
     2> 这些对象会经常申请和释放,如进程结束时,文件关闭或被删除时。如果每次申请或释放都将内存交给操作伙伴系统,将会造成抖动,影响性能。
     3> 碎片问题。如果第一次分配了100字节,第二次分配60字节,大小各不相同,当某个对象释放时,将会出现各种碎片,不易于管理。

     基于以上原因,内核采用slab分配器,基本思路为:
     1> 为常用到的内存申请,如inode,dentry,分别申请inode高速缓存和dentry高速缓存,专门用来管理inode和dentry的申请和释放(这就是slab的作用)。
     2> 同一个高速缓存中,申请的空间大小是固定的,如inode高速缓存,每次都申请sizeof(struct inode)大小的空间。
     slab分配器的组成如下图所示。

      高速缓存代表创建的各种高速缓存,如inode高速缓存等,由kmem_cache_t类型的struct来描述;
      slab为高速缓存包含的slab,每个高速缓存包含多个slab,实际上,每个slab都处于满的slab中,空的slab中,部分满的slab中;
      对象为实际分配给应用程序的,如inode对象等,每个slab包含1到多个对象。
     
     从上面的分析中,可以看出, slab可以称得上是专用高速缓存,只能分配固定大小的内存空间。在使用时,过程如下:
      kmem_cache_create(char *name ,size_t size,size_t offset,unsigned long flags,void(*constructor)(***),void(*destructor)(***));
     size:存储区域的大小,为一个固定的值
     offset:页面中第一个对象的偏移量,用来确保对已分配的对象进行某种特殊的对齐,常用之为0
     flag:常用值为SLAB_NO_HEAP(保护高速缓存在系统寻找内存的时候不会被减少。设置该标志通常不是个好主意)
               SLAB_HWCACHE_ALIGN,要求所有数据对象跟高速缓存行对齐,可能会浪费一些空间
               SLAB_CACHE_DMA,要求每个数据对象都从以用于DMA的内存区段中分配
     用法:
          kmem_cache_t *cache;
          cache = kmem_cache_create("tmp",sizeof(struct XXX),0,SLAB_HWCACHE_ALIGN,NULL,NULL);
          
          p=kmem_cache_alloc(cache,GFP_KERNEL);
          
          kmem_cache_free(cache,p);

          kmem_cache_destroy(cache);

     使用slab,可以加快专用内存空间分配速度,并且减少了系统碎片,但是每种对象都采用这种专用高速缓存分配,如需要存放文件名,由于文件名大小不固定,采用专用高速缓存显然是不合理的。内核中提供了普通高速缓存(内核中的kmalloc函数分配空间就是从通用高速缓存中获取的):
     1>内核建立了13个按照几何分布的空闲内存区,大小从32字节到131072字节(即128K,不同的操作系统,这个值可能不一样,这也就解释了为什么malloc申请空间是有上限的)
     2>每次申请空间时,根据程序输入的要分配的地址,找到最接近的空间,如申请33字节,则查找64字节对应的分配区(对于分配区的管理,其实也是按照slab中的方法,因为每个分配区分配的字节数是相同的),进行内存的分配。
     3> 对于每种大小,都有两个高速缓存:一个适应于ISA DMA分配,另一个适用于常规分配。

我们可以通过cat /proc/slabinfo命令查看系统中slab的使用情况。关于slab部分,还有内外部描述符,slab着色(为创建slab高速缓存使用,与页高速缓存类似),这里就不多介绍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值