您的位置:首页 > 其它

uc/os-II的内存改进与实现TLSF算法的详解,移植实现(一)

2014-12-26 09:55 274 查看
经过了一周的时间,终于成功将TLSF算法移植到uc/os-II上,并移植成功。这一周,茶不思饭不想,女朋友都要分手了。这一周对uc/os系统有了深刻的了解,同时也对经典的TLSF算法的结构有个更加清晰的认识吧。好,正题来了。看我娓娓道来哈!

1.配置环境及软件要求(下载地址在文章最后):

vs2013,us/os-ii(pc上可运行),TLSF算法(有中文注释)。ps:我都提供下载地址哈,大家不要担心。

2.先来看下RTOS的DSA概览。(转载网上的啦,不过还是值得了解的)

按照记录以及合并空闲内存块的方法,可将RTOS的DSA分成顺序搜索、索引搜索、分类搜索、位图搜索以及伙伴算法等。这些DSA算法都具有分配真实内存,立即合并空闲内存等特点。

2.1 顺序搜索算法

顺序搜索算法采用单向或双向链表维护空闲内存。该算法的时间花费与空闲内存链表长度成正比,时间花费是有界的,但会随着空闲内存块增多而增加,在嵌入式实时系统中并不宜使用。

2.2 索引搜索算法

索引搜索算法用一种比链表复杂的数据结构来记录空闲内存。常见的如排序二叉树,树中每一个节点代表某一个尺寸的空闲内存,存储该尺寸的空闲内存链表指针。索引搜索算法的数据结构和分配、合并内存较为复杂。

2.3 分类搜索算法

分类算法把所有空闲内存按其尺寸范围划归不同的类,同一类内的内存块链接成一个空闲自由内存链表。所有的空闲内存头指针统一由另一个数组链表维护,每个空闲内存头指针对应该数组一个元素。值得注意的是,属同一类的自由内存,并不要求其物理上是相邻的。

分类搜索算法中的链表可以是按空闲内存尺寸排序的,也可以是不排序的。分类算法较为复杂,但不必搜索即可查找合适空闲内存,时间花费不随空闲内存的数量而变化,适合于嵌入式系统采用。

2.4 位图搜索算法

位图搜索算法用一个位图来查找空闲内存,该算法查找空闲内存所需的信息全部存储在一小块内存中,查找响应速度很快。

3.uc/os-ii的DSA不足之处

UC/OS-II中的内存管理模块把动态管理的内存分成多个内存区,每一个内存区又分成一定数量相同尺寸的内存块。具体的UC/OS-II中,DSA由OS_MEM.c实现,总共只包含5个函数OSMenInit,,OSMemCreate,OSMemGet,OSMemPut 与OSMemQuery,约100行代码,十分精炼。正是由于其精炼,UC/OS-II的DSA提供的功能十分有限,存在以下不足:
1) 动态管理的内存块尺寸须在编译时指定,运行时不能更改,限制了系统以后扩展应用程序的灵活性,也造成内存浪费。

2) 由于同一分区只能提供唯一尺寸的内存块,而应用中一般需使用到不同尺寸的内存块。为了减少资源浪费,此时则需建立两个以上的内存区,加大了维护开销。

3) 不可能提供确定不同内存区的内存块之间尺寸差距的方案,使内存的浪费不可避免。这是由于系统中可能的应用千变万化,而他们申请的内存块尺寸也不尽相同。

4) UC/OS-II的DSA可以归类为2.3中的分类搜索算法,但其并未提供如何搜索到合适分类的方法,也未提供向某一分类申请内存失败后如何向下一分类申请内存的方法,而需要程序员自己提供,加重了程序员负担的同时更是降低了程序的可靠性与稳定性。

4.TLSF 基本原理及结构

TLSF 是一种二级隔离拟合算法,使用位图与链表相结合的方式对内存池进行管理,利用隔离拟合的方法来实现TLSF。我们采用空链表数组并将数组设计为二级数组,第一级数组按照2 的幂(16,32,64,128 等)将空内存块分级,分级的数目称为FLI(First Level Index)。第二级数组将第一级的结果进一步线性划分,用户可自行配置分级的数目SLI(Second Level Index)。每一个链表数组都有一个相关联的位图来记录哪一些列表为空,哪一个列表包含空内存块。TLSF数据结构代码:

typedef struct TLSF_struct {
/* the TLSF's structure signature */
u32_t tlsf_signature;

#if TLSF_USE_LOCKS
TLSF_MLOCK_T lock;
#endif

#if TLSF_STATISTIC
/* These can not be calculated outside tlsf because we
* do not know the sizes when freeing/reallocing memory. */
size_t used_size;
size_t max_size;
#endif

/* A linked list holding all the existing areas */
area_info_t *area_head;

/* the first-level bitmap */
/* This array should have a size of REAL_FLI bits */
u32_t fl_bitmap;

/* the second-level bitmap */
u32_t sl_bitmap[REAL_FLI];

bhdr_t *matrix[REAL_FLI][MAX_SLI];
} tlsf_t;
TLSF的数据结构如图:



未完待续!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: