任意大小的内存管理是根据用户需要为其分配内存,即用户需要多大内存就通过acoral_malloc2()为之分配多大内存,同时每块分配出去的内存前面都有一个控制块,控制块里记录了该块内存的大小。
同时未分配出去的内存也有一个控制块,寻找空闲内存块要进行遍历。
由于分配和回收的顺序和内存大小是没有规律的,如果不断分配和回收后,会将内存分为很多块,产生很多内存碎片。
任意大小内存的管理机制是:“一分为二”,将一块分为两块,一块分配给用户使用,剩下一块留给后续使用,同时改变大小标志。可见用户不断调用acoral_malloc2()会产生很多内存碎片。
若刚开始内存只有一块,其大小为x1,则全部空闲,当用户调用acoral_malloc2()后,内存分布如图b。这里x1=x2+x3。
当用户多次调用acoral_malloc2()后,内存分布如图c所示,此时有两个空闲的内存块,一块大小128B,另一块大小56B。如果用户预申请80B的内存,则后面那个56B不够,这时就必须从头开始搜索空间,然后一分为二,找到128B。
从上面可以看出这种分配方式,时间不确定,搜索时间与块的个数、当前内存使用情况有关。
aCoral内存管理初始化
在aCoral内存管理机制能正确工作签,需要对其进行初始化,该工作是在启动aCoral时,内核模块acoral_module_init()中进行的,如代码,这里调用了acoral_mem_sys_init()
void acoral_mem_sys_init()
{
acoral_mem_init((unsigned int)&heap_start, (unsigned int)&heap_end); //伙伴系统初始化
#ifdef CFG_MEM2
acoral_mem_init2();
#endif
acora_res_sys_init();//资源池系统初始化
}