内存池(memory pool)

1749阅读 0评论2011-10-20 lthyxy
分类:C/C++

1.以end_free - start_free来判断内存池的水量.
2.如果水量充足.就直接调出20个区块返回给free_list.如果不足20,但是能提供一个以上.就拔出这些.这时,其nobjs就被修改为实际的供应的区块数.nobjs传的是引用 .如果一块也不能供应 ,此时就必须利用malloc()从heap中配置内存,再加上一个越来越大的附加量.
3.万一山穷水尽,整个system heap空间都不够了,malloc()行动失败, chunk_alloc()就四处寻找有无"尚有未用区块.且区块足够大之 free_list.找到就挖出.找不到就调用一级适配器,那里有out-of-memory处理机制.
  1. //内存池
  2. //从内存池中取出空间给 free list 使用,是chunk_alloc()的工作
  3. template <bool threads, int inst>
  4. char * _default_alloc_template<threads, inst>::chunk_alloc(size_t size,int & nobjs)
  5. {
  6.   char *result;
  7.   size_t total_bytes = size*nobjs;
  8.   size_t byte_left = end_free - start_free;//内存池剩余的空间
  9.   if (bytes_left >= tetal_bytes)//内存池剩余空间完全满足需求量
  10.   {
  11.     result = start_free;
  12.     start += total_bytes;
  13.     return result;
  14.   }
  15.   else if (bytes_left >= size)//内存池剩余空间不能完全满足需求量,但是能够供应一个以上的区块
  16.   {
  17.     nobjs = byte_left/size;
  18.     total_bytes = size*nobjs;
  19.     result = start_free;
  20.     start_free += total_bytes;
  21.     return result;
  22.   }
  23.   else//一个都无法提供
  24.   {
  25.     size_t bytes_to_get = 2*total_bytes + ROUND_UP(heap_size >> 4);
  26.     
  27.     //这部分是充分利用剩余的零头
  28.     if (bytes_left > 0)
  29.     {
  30.       obj * volatile * my_free_list = free_list + FREELIST_INDEX(bytes_left);
  31.       ((obj*)start_free) -> free_list_link = *my_free_list;
  32.       *my_free_list = (obj *)start_free;
  33.     }
  34.     
  35.     //配置heap空间,用来补充内存池
  36.     star_free = (char *)malloc(bytes_to_get);
  37.     if (0 == start_free)//heap空间不足,malloc失败
  38.     {
  39.       int i;
  40.       obj * volatile * my_free_list,p;
  41.       for (i = size; i <= _MAX_BYTES; i += _ALIGN)
  42.       {
  43.         my_free_list = free_list + FREELIST_INDEX(i);
  44.         p = *my_free_list;
  45.         if ( 0 != p)
  46.         {
  47.           *my_free_list = p -> free_list_link;
  48.           start_free = (char *)p;
  49.           end_free = start_free +i;
  50.           return chunk_alloc(size,nobjs);//递归调用,修正nobjs
  51.         }
  52.       }
  53.       end_free = 0;
  54.       start_free = (char *)malloc_alloc::allocate(byte_to_get);
  55.     }
  56.     
  57.     heap_size += bytes_to_get;
  58.     end_free = start_free + bytes_to_get;
  59.     return chunk_alloc(size,nobjs);//递归调用,修正nobjs
  60.   }
  61. }

上一篇:SGI 第一级置配器 _malloc_alloc_template 剖析
下一篇:ubuntu 下编译安装新内核