在频繁调用的底层函数中使用malloc的影响分析

近来,测试中发现一个问题,ipcam会自动重启。经过定位,是增加了一个外部i2c timer作为看门狗引起的。
看了ex-wdt keep alive的code后发现,调用了一个i2c_WriteBytes()函数,这个Func中调用了两次malloc申请内存,并且,对malloc分配的
指针未作NULL的检查。我认为问题就出在这里,原因是这样:
1、虽然在这个Func中,malloc与free是配对使用的,但是,在一个多任务的环境中,这个Func可能被抢占,也就是说,先malloc后,接着是
其它进程去malloc,因此,malloc申请小的内存,仍然可能导致碎片化及整理内存的开销日益增大。这与测试中发现的现象可以吻合。
首先,测试中发现ipcam在重启前变得越来越慢,这是整理内存开销越来越大导致的,malloc/free执行时间会变得很长。其次,用两个进程来
keep ex-wdt alive,结果ipcam重启变得更频繁了,一晚上16台有6台重启。这是因为调用i2c_WriteBytes()函数变得更加频繁,压力之下加
速了该问题的发生。
2、对malloc申请的指针不作检查,如果不幸申请到null指针直接使用,同时有送进内核使用。这必然导致linux kernel crash,进而导致
watchdog复位。

针对上面的分析,可以用下面的方法进行验证:
1、压力测试:每秒feed一次ex-wdt,启动N个(N=10)进程来keep ex-wdt alive。其它进程仍然全部启动。
预期结果:几小时内出现CPU占用率不断升高,然后内核crash,进而watchdog复位。
2、对比测试:驱动函数取消malloc/free,同样进行压力测试。
预期结果:CPU占用率不会持续升高,内核不会crash并导致watchdog复位。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值