首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于内存碎片有关问题

2012-04-20 
关于内存碎片问题最近在写一个网络程序客户端。客户端需要从服务器端接收数据并进行处理。我是采取消息队列

关于内存碎片问题
最近在写一个网络程序客户端。客户端需要从服务器端接收数据并进行处理。我是采取消息队列的方式处理收到的包的,每收到一个包,就malloc一个链表节点来保存数据,并把这个节点加入到消息队列中,另外一个线程从消息队列中取出一条消息进行处理并把处理过的节点从队列中删除(free掉)。现在的问题是,由于每收到一个包就会malloc一次(大概12字节),运行久了可能造成很多内存碎片,影响系统性能,但又不能在一启动的时候就分配一块大内存专门存消息(嵌入式uclinux系统,内存有限啊)。有没有什么比较好的解决办法?求指点

[解决办法]
就算内存紧张,事先划出几兆(不行几百K总行把)来不行么?
[解决办法]
你可以估算一下需要多大的空间才能满足处理要求,然后就给它那么多好了。既然用动态分配能够满足要求,那用静态的只会更节省。只是失去了灵活性了。

估算不出的话,也可以用插入码去观察你设备的运行,看看它最多用到了多少空间。
[解决办法]
1. 你确定那些结点一定要释放而不能重用么?
2. 进一步,你确定你不能阻塞上游而保证队列最大长度么?
[解决办法]
在程序初始化时malloc一个足够大的buffer,在主循环中不要动态创建销毁任何对象,结束程序前free
[解决办法]
重用:不free单元,而是用链表把它们保存起来。下次需要时从链表上摘取。

需要写两个函数来处理单元分配/回收。
[解决办法]
写一个简单的内存池。循环利用。

热点排行