打印

今天整理以前的东东.发现 以前我发过这个问题.不过顶不上

[复制链接]
1632|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
溜溜|  楼主 | 2007-8-9 22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 今天整理以前的东东.发现这个,突然想到 

/***************** 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也不能分配成功.

这种情况可修改代码来避免,但分配时间也会变长,是否值得是需要考虑的.
反正我是改了.

 
 

相关帖子

沙发
xwj| | 2007-8-10 07:02 | 只看该作者

是你的浏览设置不对,设定显示时间范围→全部主题即可

 设定显示时间范围→    5天内主题 15天内主题 1月内主题 3月内主题 半年内主题 全部主题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

60

帖子

1

粉丝