OSE的HEAP和POOL的管理
来源:互联网 发布:淘宝万斯旗舰店真的吗 编辑:程序博客网 时间:2024/06/06 00:08
1 OSE的HEAP管理
1.1 功能特性
Heap Manager的基本功能如下:
分配和释放数据缓冲区,用于存储内核数据及动态加载模块
释放孤儿缓冲区
列举heap的相关属性、内容
为每一个分配的缓冲区提供调试信息,如文件名及行号等信息,此项是编译可选的
Heap Manager的基本特性如下:
缓冲区分配释放时间有确定的最大值;
管理开销比较小,9或者17个字节,取决于是否需要调试信息;
缓冲区具备边界标识,便于发现异常、调试分析;
具备文件名及行号等信息;
私有或公共缓冲区属性,私有缓冲区在进程消亡时自动释放;
自动选择缓冲区大小,按照Fibonacci数列得到各个缓冲区大小,最小单元16个字节;
缓冲区自动分割及重组,最大限度的减少内存碎片。
1.2 缓冲区大小
固定开销最小为9个字节(4 bytes owner pid, 4 bytescontrol data and 1 byte endmark);
当需要调试信息时,需要额外8个字节(4 bytes of file pointer, 4bytes of line number);
实际大小将按照Fibonacci数列大小选择比有效数据大的最小缓冲区大小。Fibonacci数列共29种大小。
F(n) = F(n - 1) + F(n - 2), F(1) = 1, F(0) = 1
16, 16, 32, 48, 80, 128, 208, 336, 544, 880, 1424, 2304,3728, 6032, 9760, 15792,
25552, 41344, 66896, 108240, 175136, 283376, 458512, 741888,1200400, 1942288,
3142688, 5084976, 8227664
最小为16字节,最大为8227664,接近8M
1.3 缓冲区结构
每个缓冲区由控制头、用户数据、endmark等几部分构成。
同一个size的buffer在释放后将自动构成链表。
用户域的前四个字节将用在指向下一个空闲缓冲区的指针。缓冲区分配后,此四个字节将存放有效数据。控制头将对此指针进行校验码计算,这样可以有效检查缓冲区损坏等问题;
Endmark将用于检测缓冲区覆盖问题;
Owner可得到缓冲区的分配者,便于定位问题;
当需要调试信息时,可添加附加字段文件名及行号等信息;
当两个空闲缓冲区在地址上连续时可以自动组合成一个更大的buffer块,挂接到新的空闲链表上,这样可以有效减少内存碎片
多个缓冲区在内存上的关系如下图,当缓冲区分配出去时,给用户的是Userdata的首地址,当释放时,将此指针前移特定字节时即可获得相关的控制信息,便可得到此缓冲区的大小,从而将其挂接到相关的空闲缓冲区链表上。
缓冲区释放时,将会检查此指针是否有效,有以下几个标准:
是否对齐,在设计实现上,OSE的heap缓冲区一般是8字节对齐的;
缓冲区地址需要在HEAP的有效地址空间内。
2 OSE的POOL管理
2.1 功能特性
POOL的基本功能如下:
为任务间的通信分配消息空间;
为任务分配动态栈空间。
和HEAP的相同点为:
都有消息控制头,都有endmark用于检查缓冲区覆盖问题;
空闲缓冲区都会用链表链接起来
和HEAP的不同点为:
Heap由单独的用户态的库来管理,运行在用户态;而Pool的管理由内核负责,属于系统调用;
Heap的大小个数为29个,其为Fibonacci数列,大小固定;而Pool的大小由配置文件决定,大小是可变的,共8种大小;
Heap中分配的缓冲区有文件名和行业等调试信息,而pool中分配的缓冲区没有;
Heap中分配的缓冲区只有owner,但pool中分配的缓冲区除了owner外还有sender,消息可在各个任务之间转发,只有消息的owner才能释放消息;
Heap的大小为Fibonacci数列,各个块之间大小有组合关系,支持连续的空闲块合并;而pool中分配的缓冲区组合或者拆分可能无法形成新的空闲块,因此一旦分配后不能重新合并,因此将增大内存碎片。
2.2 消息pool的管理
消息缓冲区的结构和heap缓冲区的结构基本一致,如下:
只是控制头中的信息稍有差别而已。
消息pool的分配示意如下图:
由于8个size大小无法控制,其由配置文件决定,因此内核无法根据缓冲区大小自动进行合并和分拆操作,缓冲区一经分配,释放后即使空闲也不能重组。当反复的分配释放后,可能造成新分配缓冲区时,细小的缓冲区无法满足大块缓冲区的需求,造成内存空间耗尽的假象。
因此pool size的大小应该合理选取,均匀分布,根据实际情况调整size的配置,以达到最佳的pool利用率。
- OSE的HEAP和POOL的管理
- String pool和heap
- 内存管理,stack和heap的区别
- Oracle 的 KEEP pool, RECYCLE pool和DEFAULT pool
- 内存分配的几种方式Stack, Heap, Pool
- 管理ceph的pool(快照,回滚)
- Shallow Heap 和 Retained Heap的区别
- boost的pool和object_pool
- select 和pool的区别
- Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- boost准模板库内存管理中pool和object_pool的使用
- Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
- OSE
- stack和heap的区别
- Heap和Stack的区别
- heap 和Stack的区别
- heap 和Stack的区别
- 兼容ie和火狐的javascript HTMLEncode HTMLDecode的完整实例
- SQL复制数据的强大命令集-BCP知识点之一(http://www.cnblogs.com/lify0407/articles/874170.html)
- ANSI,ASCII,Unicode的区别与联系
- C++中虚析构函数实例
- Javascript 给String对象扩展HTML编码和解码的方法
- OSE的HEAP和POOL的管理
- 读取文件每一行
- Word表格标题的重复打印
- PHP实用技巧
- Weblogic Server 10中文乱碼問題解决方法
- 小论成长方法(rev 2)
- 使用PHP对非法内容进行检查
- 硬盘安装ubuntu9.04
- 珍惜和企业的第一次亲密接触(转自jinxfei)