赚钱广告lwIP为基础结构提供了专用的内存池管理,比如netconn,protocol控制块,包缓存等。在memp.c下实现。
内存池的关键数据结构是struct memp_desc对应内存池节点,一个类型的内存池是一个节点,
前者是使用mem_malloc/mem_free实现内存池时使用,后者是单独实现时使用,我们重点关注后者。
比如size是8,但是数组的基地址则可能是任意地址,比如是0x0001,要保证地址4字节对齐,
那么只能往后移动实际用的地址是0x0004,那么前面就浪费了3字节,此时8+(4-1)多分配3字节则浪费了这3字节也能保证剩余8字节可用8+(4-1)-3=8。
如果地址是0x0002则浪费2字节,可用8+(4-1)-2>
8大于2字节,其他情况类似。
上述用链表形式每次malloc(出链表),free(入链表)都是堆链表尾,*desc->
tab操作,执行时间固定。
而bitmap需要使用for循环去查询空闲bit执行时间不固定,当然也可以使用类似ucOS优先级调度的查表法来优化。
数据结构中分析了LWIP_MEMPOOL_DECLARE宏,实际就是定义内存节点相关的变量(存储数组,统计变量,描述结构等)
注意每次memp_std.h中都undef了相关宏,所以不影响后续使用。
反过来定义宏MEM_USE_POOLS,mem.c也可以用memp.c内存池实现.所以可以看出LWIP的堆管理实现方式比较灵活的,可以根据实际应用配置。
可以看出,用户必须提供lwippools.h文件,申明对应的内存池节点。
其算法简单,执行时间固定,比较可靠。但是其存储是单独分配的静态数组,相当于需要固定分配一部分空间,不管对应的程序运行还是不运行,比较浪费空间。
LWIP内部实现了堆和内存池管理可以直接使用,也可以配置使用系统的堆管理,非常灵活,移植性也非常好。
|