今天整理以前的东东.发现这个,突然想到
/***************** Variable Size -Memory Management*****************/ 2005/7 /************************************************************************ 由于uC/OS提供的内存管理服务一次只能够从某内存分区中得到固定字节数 (一个内存块)的连续地址空间,而且即使连续申请的两个或多个内存块也不一定连续。 如果当前的一个内存块的大小为32个字节,那么一次最多只能申请32个字节,当然前 提是得到需要的内存一定连续。所以当程序中有申请内存大小大于32个字节时,就麻 烦了。在程序中需要对每个得到的内存块之间进行检查是否连续。如果想避免这样的 检查,就尽可能创建足够大的内存块。这样做似乎很不合理。
事实这是为了避免内存碎片而使用的定长内存分配形式固有的特点.完美的内存管理似乎 不应该存在, 这才有了多种内存管理"算法".才有没最好只有最适合.
UCOS本身的定长内存分配已经足够好.
由于动态内存分配的必要性. 参考LWIP的内存分配方案...很简单. ========================================================================== 2006
有网友搞定了..只接拿来用..
LWIP中所使用的应该是一种经典的内存分配策略(见源码).问题就是: 1.对所分配的内存使用越界时,用于内存管理的数据也随之被破坏,大多数情况下对内存的动态分配来
说是灾难性的.实际上这只能是对应用程序的限制,而不能说是缺点.因为内存管理程序的实现是为了能
有效的使用有限的内存,而不用来使应用程序能够犯错误而不希望造成问题(这种政治家的游戏不应该
在这里出现), 所以越界使用内存块是绝对不能出现在这种分配策略的应用里面.事实无论那种分配策略
都不希望这种情况发生. 2.见如下代码: void main(void) { uchar *p1...*pn; mem_init();//memory poll =ALIGN(4096+SIZEOF_STRUCT_MEM) p1=malloc(1012); p2=malloc(1012); p3=malloc(1012); p4=malloc(1012); free(p2); p5=malloc(1012);
}//每分得一块内存1012字节,要付出管理成本12字节(这是可配置的,这里举典型),也就是说用了1024
字节.
p4能够成功吗?看上去内存刚好.可实际上是不能的.而且 这时p5本来可能会以为原来p2的内存块会分配给它,但从源码来看不是这样的,释放p2所得的内存块在
LWIP的策略里不能满足P5,虽然分配大小是一样大的.因为在任何一个空闲块中再分配内存时, ============================================================================= if (!mem->used && mem->next - (ptr + SIZEOF_STRUCT_MEM) >= size + SIZEOF_STRUCT_MEM) ============================================================================= 这个空闲块一定会被分成两块,块1给应用,块2作为下一个空闲块.并与分配前时的空闲块的 下一块 以
链表形式连起来.
如果这个空闲块的大小不足以分成size+SIZEOF_STRUCT_MEM 和 SIZEOF_STRUCT_MEM这两块.那么则不
能满足当前分配,继续寻找.
一种极端情况就是如果可供使用的内存大小为4096+end.那么在上述main的代码中,不但p4不能分配成
功,而且释放P3,P5也不能分配成功.
这种情况可修改代码来避免,但分配时间也会变长,是否值得是需要考虑的. 反正我是改了.
|