空间配置器

2018-08-12  本文已影响0人  寿寿_32206

空间的配置和释放

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)  硬生生得终止程序

第二配置器 多了一些机制,避免太多得小额区块造成内存碎片,以及配置时候得额外负担(无法避免),区块越小,额外负担所占得比例就越大,显得越浪费

上一篇下一篇

猜你喜欢

热点阅读