SGI STL内存管理

SGI STL采用双层配置器

第一极配置器直接使用malloc和free,申请内存大于128字节时调用,第二节配置器采用内存池的方式来管理。分配器都需要实现两个接口allocator和deallocator

分配器的实现:
维护了16个free list,每个list上集合着大小分别为8,16,24,...128的内存块。如果请求的内存块大于128bytes,就转用调用第一级配置器。使用了链表结构管理内存块。

union obj{  
    union obj* free_list_link;  //当作为自由链表的一个结点时,存储其下一个节点的地址  
    char client_date[1];        //当其作为返回值时,返回的正好是分配内存的首地址  
}  

内存申请流程:

大于128字节,使用第一级配置器向系统申请,malloc不成功会调用set_new_handler来处理异常。
小于128字节,使用第二级适配器。如果有对应大小的free_list内存块,正常返回;如果free_list没有:

2.1 向内存池要20个块大小的内存,内存池尽量满足;如果内存池也没有足够的内存:
2.2 调用malloc从系统heap中申请内存,申请大小 bytes_to_get=2*total_bytes+ROUND_UP(heap_size>>4),如果申请成功了并且内存池中有剩余内存,会将内存池的剩余内存非配给free_list。
如果2.2失败,会求助于第一级配置器,主要是想借助于第一级配置器里的异常处理,例如out_of_memory中申请到一点内存。如果这一步也失败,那么就是彻底失败了。

posted @ 2022-09-14 20:22  WetYu  阅读(8)  评论(0)    收藏  举报