OSE的HEAP和POOL的管理

来源:互联网 发布:淘宝万斯旗舰店真的吗 编辑:程序博客网 时间:2024/06/06 00:08


1         OSEHEAP管理

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等几部分构成。

同一个sizebuffer在释放后将自动构成链表。

用户域的前四个字节将用在指向下一个空闲缓冲区的指针。缓冲区分配后,此四个字节将存放有效数据。控制头将对此指针进行校验码计算,这样可以有效检查缓冲区损坏等问题;

Endmark将用于检测缓冲区覆盖问题;

Owner可得到缓冲区的分配者,便于定位问题;

当需要调试信息时,可添加附加字段文件名及行号等信息;

当两个空闲缓冲区在地址上连续时可以自动组合成一个更大的buffer块,挂接到新的空闲链表上,这样可以有效减少内存碎片

 

多个缓冲区在内存上的关系如下图,当缓冲区分配出去时,给用户的是Userdata的首地址,当释放时,将此指针前移特定字节时即可获得相关的控制信息,便可得到此缓冲区的大小,从而将其挂接到相关的空闲缓冲区链表上。

 

缓冲区释放时,将会检查此指针是否有效,有以下几个标准:

是否对齐,在设计实现上,OSEheap缓冲区一般是8字节对齐的;

缓冲区地址需要在HEAP的有效地址空间内。

 

2         OSEPOOL管理

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的分配示意如下图:

 

由于8size大小无法控制,其由配置文件决定,因此内核无法根据缓冲区大小自动进行合并和分拆操作,缓冲区一经分配,释放后即使空闲也不能重组。当反复的分配释放后,可能造成新分配缓冲区时,细小的缓冲区无法满足大块缓冲区的需求,造成内存空间耗尽的假象。

 

因此pool size的大小应该合理选取,均匀分布,根据实际情况调整size的配置,以达到最佳的pool利用率。

原创粉丝点击