BlueStore源码分析之愚蠢分配器

  

前言

  

前面介绍了   BlueStore的位图分配器,我们知道新版本的   <代码>位图分配器的优势在于   。在这里我们了解一下基于区间树的   愚蠢<代码> 分配器(类似于Linux巴迪内存管理算法),并对比分析一下其优劣。

  

目录

  
      <李>   李伙伴算法   <李>   李数据结构   <李>   李初始化   <李>   李插入删除   <李>   李空间分配   <李>   李空间回收   <李>   李优劣分析
  

伙伴算法

  

Linux内存管理算法为了能够快速响应请求,尽可能的提高内存利用率同时减少外部内存碎片,引入了伙伴系统算法   <代码>伙伴系统> 1、2、4、8、16、32、64128256512、1024年个连续的页框块,每个页框块的第一个内存页的物理地址是该块大小的整数倍。   ,具体内存分配和内存释放可自行谷歌。

  

  

  
      <李>较好的解决外部碎片问题,不能完全解决。   <李>针对大内存分配设计,可以快速的分配连续的内存。
  

  

  
      <李>合并的要求过于严格,只能是满足伙伴关系的块才可以合并。   <李>一块连续的内存中仅有一个页面被占用,就导致整个内存不具备合并的条件。   <李>算法页面连续性差,DMA申请大块连续物理内存空间可能失败,此时需要> <代码> CMA   <李>浪费空间,可以通过板,kmem_cache等解决。
  

数据结构

  

愚蠢分配器使用了区间树组织数据结构,高效管理   <代码>程度(偏移量、长度)

     时间:
 class  StupidAllocator  public  Allocator  {
  ,,,CephContext *,有条件现金转移支付;
  ,,,//,分配空间用的互斥锁
  ,,,std:: mutex 锁;
  ,,,//,空闲空间总大小
  ,,,int64_t  num_free;
  ,,,//,最后一次分配空间的位置
  ,,,uint64_t  last_alloc;
  ,,,//,区间树数组,初始化的时候,免费数组的长度为10,即有十颗区间树
  ,,,std:: vector,免费;
  ,,,//,程度:抵消,,长度
  ,,,typedef 池::bluestore_alloc: pool_allocator<,,,,,,,pair比;
  ,,,,,,,allocator_t;
  ,,,//,有序的,btree 地图,按顺存放程度。
  ,,,typedef  btree: btree_map
  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,allocator_t>, interval_set_map_t;
  ,,,//,区间树,主要的操作有,插入、删除等。
  ,,,typedef  interval_set, interval_set_t;
  
};   

每颗区间树的下标为   <代码>指数(0 - 9)> [2 ^(索引1)* bdev_block_size 2 ^(指数)* bdev_block_size) ,

  
      <李>自由[0]:[0,4 k)   <李>自由[1]:[4 k、8 k)   <李>自由[2]:[8 k、16 k)   <李>自由[3]:[16 k, 32 k)   <李>自由[4]:[32 k, 64 k)   <李>自由[5]:[64 k, 128 k)   <李>自由[6]:[128 k, 256 k)   <李>自由[7]:[256 k, 512 k)   <李>自由[8]:[512 k, 1024 k)   <李>自由[9]:[1024 k, 2048 k)
  

初始化

  

初始化愚蠢分配器后,调用者会向分配器中加入或者删除空闲空间。

     
//,增加空闲空间
  void  StupidAllocator:: init_add_free (uint64_t ,抵消,uint64_t 长度),{
  ,,,std:: lock_guard, l(锁);
  ,,,//,向,free 中插入空闲空间
  ,,,_insert_free(抵消,,长度);
  ,,,//,更新空闲空间大小
  ,,,num_free  +=,长度;
  }//,删除空闲空间
  void  StupidAllocator:: init_rm_free (uint64_t ,抵消,uint64_t 长度)
  {
  ,,,std:: lock_guard, l(锁);
  ,,,interval_set_t  rm;
  ,,,rm.insert(抵消,,长度);
  ,,,for  (unsigned 小姐:=,0;,小姐:& lt;, free.size (),,,, ! rm.empty ();, + + i), {
  ,,,,,,,interval_set_t 重叠;
  ,,,,,,,overlap.intersection_of (rm,免费[我]);
  ,,,,,,,//,删除相应空间
  ,,,,,,,if  (! overlap.empty ()), {
  ,,,,,,,,,,,自由[我].subtract(重叠);
  ,,,,,,,,,,,rm.subtract(重叠);
  ,,,,,,,}
  ,,,}
  ,,,num_free  -=,长度,,//,更新可用空间
  }
  

插入删除

BlueStore源码分析之愚蠢分配器