【转】OSAL内存管理1

来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/06/05 17:13

【转】OSAL内存管理1

(假设我们不对源代码进行处理讨论内存的分配算法)我们把固定长度分配区域分开讨论

在固定长度分配区域内存的分配的算法:由于在固定长度分配区域中它不存在内存单元的合并(因为它所需的分配长度都小于或等于固定长度的分配单元的长度),所以它只需从开始处开始查找有没有非处于使用状态的内存单元, 如果在固定分配区域中存在则修改它的内存分配块头的使用状态(OSALMEM_IN_USE)并返回指向此内存单元的指针(在源程序中hdr++是为了跳过内存分配块头把指针指向分配的内存),如果在固定分配区域没有查找到,它就会返回NULL。 OSAL还提供了另一个函数,void osal_mem_kick( void ); 它将使FF1跳过固定长度区域, 指向FF2(s可变长度区域), 也就是这个意思:如果在固定分配区域中没有申请内存成功, 调用此函数后它将修改指向固定分配区域的指针使指针指向可变分配区域, 然后再调用osal_mem_alloc 它将在可变长度分配区域中进行内存分配。不必担心对FF1指针的修改,因为如果在固定长度分配区域中产生内存的释放, 它将修改ff1的值。

固定长度分配区域和可变长度分配区域是怎样分离开的? 因为在void osal_mem_init( void ); (内存初使化函数中) 它进行了下列语句的调用:

ff1 = tmp; //temp 指向的是可变区域的第一个分配单元;

ff2 = osal_mem_alloc( 0 );

ff1 = (osalMemHdr_t *)theHeap;

上述语句将在固定长度分配区域和可变分配区域之间申请一个0大小的内存块, 相当于在固定分配区域和可变分配区域之间保留了一个一直处于使用状态,但是指向长度为0的一个内存分配控制块。 这个内存块的是将两个分配区域隔离开,以免和可变长度分配区域合并。

在可变长度分配区域的分配算法:在可变区域中申请内存,必须是申请内存的大小大于固定长度分配内存的大小 或者是 固定长度分配的内存已经使用尽的情况 才在可变区域中申请内存。

在可变区域中申请内存时也使用内存分配控制块头(一个16位的数),它的最高位标记的是这一个内存块是否处于使用状态,剩余的15位标记的是以它开头的内存块的大小。

OSAL内存管理2: http://blog.sina.com.cn/s/blog_4c8287230100d5i2.html

Thanks moolight!!

本文是moolight(QQ :329836790)原创,转载必须保证文章的完整性并标明出处,请尊重作者,支持原创。

0 0
原创粉丝点击