空间的配置和释放
1、考虑到小型区块所可能造成的内存破碎问题,SGI 设计了双层级配置器 a: 第一级配置区块超过128kb 用malloc() free() ,第二级 小于128 采用复杂的memory pool(内存池),又称为次层配置
第一级配置器
template<int inst>
class _malloc_alloc_templae{...}
其中:1、 allocate() 直接使用malloc dealallocate 使用 free() 2、模拟的c++ 的set_new_hander()处理内存不足的状况
第二级配置器
template<bool threads, int inst>
class _default_alloc_template {};
其中: 1、维护16 个自由链表(free lists),负责16种小型区块的次配置能力。 内存池(memory pool )以malloc() 配置而得,如果内存不足,转调用第一级配置器 。2、如果需求区块大于128 ,就转调用1级
注意:
第一级配置器的allocate() 和realloc() 都是在调用 malloc() 和 realloc() 不成功后改调用oom_malloc() 和 oom_realloc(),后者都有内循环,不断调用 “内存不足的处理例程” ,期望在某次调用后,获取足够得内存,完成任务。如果未被客户端设定,oom_malloc() 和oom_realloc() ,则程序会调用_THROW_BAD_ALLOC 丢出bad_alloc 异常信息,或者利用exit(1) 硬生生得终止程序
第二配置器 多了一些机制,避免太多得小额区块造成内存碎片,以及配置时候得额外负担(无法避免),区块越小,额外负担所占得比例就越大,显得越浪费
网友评论