嵌入式系统里不能干的几件事

1. IO要大块读写

误解:IO时要尽量多的攒一大批数据,然后一次性IO,因为IO的性能比较低,减少IO次数可以提高IO效率。

纠正:之前的认识本身没错,但大块数据IO往往伴随着CPU冲高(虽然IO本身不需要太多CPU参与,但是数据准备等内存操作都需要消耗CPU)。嵌入式系统中如果CPU资源已经很紧张,这种冲高会导致部分线程卡顿,造成性能问题。

结论:嵌入式系统的一大特点是要求实时性高,对CPU冲高是很忌讳的,所以当有大块IO需求时,将其拆分成适当的小块(也不能太小),可以把CPU冲高的点拉平。

2. 交换内存无所不能

误解:操作系统可以将暂时不被访问的内存置换到硬盘中,这样我虽然申请了很多内存,但只要不经常访问它,就不会占用很多物理内存。

纠正:只有个人PC或者编译服务器这种供个人使用的系统才会配置交换空间。 这些机器的特点是任务不固定。有的任务可能跑一会儿就挂起了,好长时间后才又开始跑,这时候把它的内存置换出去是合理的;嵌入式系统一般不会配置交换空间,因为这种系统的任务是固定的,而且是要求性能比较高的,所以不会进行内存置换。

结论:在嵌入式系统中,不要想着只要我内存中的数据不经常访问,就可以长时间占用物理内存,这是非常错误的做法。

3. 低估了内存碎片的影响

误解:我释放内存后(free/delete),操作系统很快就会回收这块内存,或者等其他程序要用的时候会回收这块内存。

纠正:只有大块内存才会被操作系统回收,小的内存碎片很难回收,这个影响是非常大的(100M碎片话内存可能只有10%能被回收)。虽然很多内存分配器号称对内存碎片有优化,但实际测下来效果还是很差。

结论:嵌入式系统中,内存本身就比较紧张,加只碎片化后的内存无法回收,很容易造成内存的浪费。

最后总结下:不同系统针对的任务是不同的,所以内核采用的内存回收、CPU分配策略都有所不同,总是在各种指标(吞吐量、内存、CPU)之间寻找一个平衡点。

4. OOM是内存泄漏了

误解:一些人一看到OOM就下意识到内存泄漏,再深入点儿的会反应到可能是内存用太多了

纠正:其实OOM机制是当系统发现可用内存(物理内存)耗尽后,用一个算法(会参考所用内存,优先级等信息)找出最应该被kill的那个进程,然后kill掉。所以被kill的进程只能说是用的内存相对比较高,并不一定真的存在内存问题。

结论:OOM不一定是内存泄漏了,甚至不一定是内存用的多了,系统里有1万个进程,可能你的进程只用2M内存就会把你kill掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值