| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1809 人关注过本帖
标题:一个类嵌入式系统采用的buffer pool管理模块
只看楼主 加入收藏
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:11 
一个类嵌入式系统采用的buffer pool管理模块
我闲着无聊写了个这个经常用到的memory pool管理模块。
在嵌入式系统中用的比较多。如果有错误请指正。

memory_management.rar (38.78 KB)

搜索更多相关主题的帖子: 模块 系统 嵌入式 pool buffer 
2009-11-06 23:37
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:10 
先收点,后研究

我可好玩啦...不信你玩玩^_^
2009-11-06 23:39
タンポポ
Rank: 2
等 级:等待验证会员
帖 子:30
专家分:97
注 册:2009-11-6
收藏
得分:10 
me too
2009-11-06 23:41
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
打个广告:我们公司招收Windows CE和Andriod软件工程师,要求是至少一年以上工作经验,重点大学毕业,薪水10w以上。
如果有这个实力可以回帖联系我。



要练习算法就来http:///!!有挑战哦!!
2009-11-06 23:48
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
收藏
得分:10 
收藏
2009-11-07 10:41
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
收藏
得分:10 
有没有广告找我啊
2009-11-07 10:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:10 
果然只是一个pool阿……

一个小小的疑问:为什么所有的调试信息不是assert,也不是fprintf(stderr, 呢?

另外,一般在需要内存池的时候(大规模的内存分配占用大量系统资源),都是只需要分配同一个大小的内存的。管理多个大小的内存池是低效以及臃肿的。我看你还不如设计一套API,根据传入的初始大小做一个内存池。做得时候用块状链表实现,删除和分配效率会很高(别忘了在内存中设置空闲块链)。

最后,一个成熟的商业内存管理系统,所有的管理信息都是不另占用空间的,而是使用空闲内存的空间,这样比较节省,你可以考虑这样改进。

可以尝试这样一套API:
mpool_T memory_pool_new(size_t size);
void *memory_pool_alloc(mpool_T mp);
void memory_pool_free(mpool_T mp, void* mem);
void memory_pool_delete(mpool_T mp);

其中mpool_T是不透明的指针,你在头文件作前置声明,然后在实现文件里面定义,防止关键数据被修改。


专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 11:29
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
回复 7楼 StarWing83
谢谢给出意见,学习了。

我写的很多程序都不是在电脑上运行的,所以可能有点不同。
ARM9嵌入式系统应用程序的常用buffer很多都是预留出来,比如MMI常用的buffer都是这样分配出来的。
这样做的好处是可以对每个task需要的buffer进行预估,避免系统的SRAM-DRAM不足。
同时常用buffer经常malloc和free显得效率低下。

至少手机的软件大多是这么做的。

同时assert只是debug时候的有用,在实际系统运行时,这个需要系统支持才能真正可以得到assert信息,比如让
数字电视蓝屏死机,并打印debug信息(assert or fatal error or data abort...)出来。或者让手机死机等等。。

在电脑上用这个来跑,就没有必要assert了。



要练习算法就来http:///!!有挑战哦!!
2009-11-07 12:12
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:20 
恩,我明白了,那么一个程序预先使用的内存数目是一定的咯?

我并没有否认这一点呀,我是说,一个pool只管理一种大小的buffer会比较好,你当然也可以预留这么多的空间拉,比如:
mpool_T *memory_pool_new(size_t size, size_t capacity);

另外,关于assert,这里用的确不太合适。因为malloc是个运行时的东西,不好意思~~~assert用来检测一些“必定成立”的事实还是合适一些。不过还是建议输出错误信息到stderr,比较合理一点。

最后我还是有点疑问,ARM9上面的编程有没有机制能够在load的时候就分配足够内存?我觉得一进去就malloc也不是很快。另外,不一定要malloc阿,用操作系统的机制一次分配一个页然后慢慢用不行么?ARM9支持MMU和换页么?如果支持的话就应该支持虚存,这样就一定有能申请一页的内存的API(我知道WinCE是用的固定大小的Shot,不过Linux在这方面应该不会太差)。

最后的最后就是,现代malloc的算法也很先进了,如果你真的需要分配多种大小的内存,又不信任操作系统库中的malloc(那些malloc通常都是申请一个页作堆,然后管理的,速度很快,不是你想的每次申请都找系统要内存),你也可以在网上找老外写的高效malloc链接进去,据说很NB~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 12:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:20 
另外,如果系统使用的内存数目是一定的,那么“不能用光内存”对程序来说就是一个既定事实了,这时在alloc里面倒是可以使用assert的哦(你当然不希望这种错误出现在运行时吧?你可以放一个assert,然后return 0;)

额……还是不对………………这里的确不能assert…………
在内存用完,直接return 0,模拟no memnory,这种策略比assert好很多……算我多话了~~~


[ 本帖最后由 StarWing83 于 2009-11-7 12:49 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-07 12:48
快速回复:一个类嵌入式系统采用的buffer pool管理模块
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016061 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved