SGI Allocator内存管理(一)
2016-01-11 20:41
309 查看
最近啃了下侯大师的<STL源码剖析>,受益匪浅,研究了下SGI空间配置器的源码,这里总结下它的空间管理策略。
SGI Allocator要解决的空间分配问题如下:
1.向系统堆(system heap)要求空间。
2.考虑多线程(multi-threads)状态。
3.考虑内存不足时的应变措施。
4.考虑过多“小型区块”可能造成的内存碎片问题。
SGI空间配置器分为两级配置器:
1.第一级配置器:__malloc_alloc_template;
2.第二级配置器:__default_alloc_template.
这篇博文先讨论__malloc_alloc_template的分配策略:
先看它的部分代码(以下代码皆参考自《STL源码剖析》):
template<int inst>
class __malloc_alloc_template{
private:
static void* oom_malloc(size_t); //allocate无法满足内存分配需求时,调用oom_malloc进行相应处理
static void* oom_realloc(void*,size_t); //reallocate无法满足内存重配置需求时,调用oom_realloc进行相应处理
static void (* __malloc_alloc_oom_handler)(); //new handler机制:用户指定的处理函数
public:
static void* allocate(size_t); //分配内存
static void deallocate(void* ,size_t); //释放内存
static void* reallocate(void*,size_t,size_t); //重配置内存
static void (* set_malloc_handler(void(*f)()))(); //设置__malloc_alloc_oom_handler
};
策略:
1.allocate直接调用malloc分配内存;deallocate直接调用free释放内存;reallocate直接调用realloc重配置内存。
1)若__malloc_alloc_oom_handler设置成0,则抛出“bad_alloc”异常或者exit(1);
2)否则,不断调用(*__malloc_alloc_oom_handler)()处理例程,释放已用内存,直到满足内存分配需求。
同理,当realloc无法重配置内存时,它会调用oom_realloc函数采用相同策略处理。
SGI Allocator要解决的空间分配问题如下:
1.向系统堆(system heap)要求空间。
2.考虑多线程(multi-threads)状态。
3.考虑内存不足时的应变措施。
4.考虑过多“小型区块”可能造成的内存碎片问题。
SGI空间配置器分为两级配置器:
1.第一级配置器:__malloc_alloc_template;
2.第二级配置器:__default_alloc_template.
这篇博文先讨论__malloc_alloc_template的分配策略:
先看它的部分代码(以下代码皆参考自《STL源码剖析》):
template<int inst>
class __malloc_alloc_template{
private:
static void* oom_malloc(size_t); //allocate无法满足内存分配需求时,调用oom_malloc进行相应处理
static void* oom_realloc(void*,size_t); //reallocate无法满足内存重配置需求时,调用oom_realloc进行相应处理
static void (* __malloc_alloc_oom_handler)(); //new handler机制:用户指定的处理函数
public:
static void* allocate(size_t); //分配内存
static void deallocate(void* ,size_t); //释放内存
static void* reallocate(void*,size_t,size_t); //重配置内存
static void (* set_malloc_handler(void(*f)()))(); //设置__malloc_alloc_oom_handler
};
策略:
1.allocate直接调用malloc分配内存;deallocate直接调用free释放内存;reallocate直接调用realloc重配置内存。
static void* allocate(size_t n) { void *result = malloc(n); if(0==result) result = oom_malloc(n); return result; } static void deallocate(void*p,size_t n) { free(p); } static void* reallocate(void*p,size_t old_sz,size_t new_sz) { void* result = realloc(p,new_sz); if(0==result) result = oom_realloc(p,new_sz); return result; }2.若allocate无法满足内存分配需求,实施new handler机制:allocate调用oom_malloc函数,在oom_malloc函数中,通过用户设定的__malloc_alloc_oom_handler来处理内存配置无法满足的问题:
1)若__malloc_alloc_oom_handler设置成0,则抛出“bad_alloc”异常或者exit(1);
2)否则,不断调用(*__malloc_alloc_oom_handler)()处理例程,释放已用内存,直到满足内存分配需求。
同理,当realloc无法重配置内存时,它会调用oom_realloc函数采用相同策略处理。
static void(* set_malloc_handler(void(*f)()))() { void (*old)() = __malloc_alloc_oom_handler; __malloc_alloc_oom_handler = f; } void* oom_malloc(size_t n) { void (*my_malloc_handler)(); void* result; for(;;) { my_malloc_handler = __malloc_alloc_oom_handler; if(0==my_malloc_handler){__THROW_BAD_ALLOC;} (*my_malloc_handler)(); result = malloc(n); if(result) return result; } }
相关文章推荐
- HDU 1494 跑跑卡丁车 (分段DP)
- 训练指南(白书)第二章:数学基础
- python 列表和元组
- POJ_P1274 The Perfect Stall(二分图匹配+匈牙利算法)
- CocoaPods 的个人使用总结
- Git版本恢复命令reset
- 序列化机制
- 【剑指offer】4.3举例让抽象问题具体化——面试题23:从上往下打印二叉树
- 【银行家算法】操作系统课程设计
- 【jsp】The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
- ContentProvider实现两个程序间共享数据
- 创建数据库普通临时表和创建数据库全局变量表和俩者的区别
- 《从零开始自学iOS》_02
- Android studio 开发环境搭建
- Android四大组件---Activity之启动模式及启动模式的应用场景
- 正则表达式
- ORACLE伪列探究
- 【剑指offer】4.3举例让抽象问题具体化——面试题22:栈的压入、弹出序列
- 颜色的相关知识及转换方法
- eclipse使用全解