嵌入式内存优化
姓名:汪如胜
学号:1215115032
班级:移动一班
专业:软件工程
嵌入式安全使用内存
对于任何一个应用程序,其内存使用的方式都对整个程序的运行效率、稳定性有重大的影响。
例如:对于资源紧张的嵌入式系统,如果编写的程序造成内存泄露,运行的初始阶段可以正常运行,但是当因内存泄露的积累而造成内存资源耗尽时,该应用程序便会崩溃;如果是一个资源相对丰富的嵌入式系统,引起内存泄露的应用程序可能可以稳定运行较长时间后才出现资源耗尽情况,此种情况在测试应用程序时期难以发现,但对实际应用会有重大影响。
一般来讲,Linux 的内存的分配方式有以下几种:
1、从静态存储区域分配:该部分内存在程序编译的时候已经分配完成,在程序的整个运行期间都存在,一般用于全局变量。
2、从栈分配:一般来讲,函数内的局部变量的存储单元都可在栈上创建,函数执行完成后,相应的存储单元会自动释放。
栈内存分配功能内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3、从堆分配:该种分配方式就是所谓的动态内存分配,使用该种分配方式是提高程序效率的基础。
该部分内存需要程序员使用
malloc 或者new 来申请任意大小的内存,同时,程序员必须负责在内存使用完成后用free 或者delete 来释放内存,使用非常灵活,但是很容易出现问题,实际上,应用程序使用内存出现的问题几乎都出在该种分配方式上。
在使用动态内存的过程中,一定要先保证内存能够成功的分配,即在使用内存之前首先要检查该内存指针是否为NULL;同时,若该内存区域可以使用,则使用前一定要对该区域内存进行初始化,因为内存的默认初值目前还没有统一的标准。
内存在正常使用中,一定要防止操作越过内存的边界,即所谓的内存溢出。
内存溢出容易使程序运行紊乱,并且可能直接导致应用程序崩溃。
在内存使用完成后,必须使用相应的语句来释放该部分内存,否则该部分内存即产生内存泄露。
在实际的代码书写过程中,可以通过查询分配内存语句和释放内存语句的个数来检查是否存在内存泄露。
若分配内存的操作次数和释放内存的操作次数相等,则内存一般不会产生泄露,若不相等,则内存肯定存在泄露,必须查明原因,修改相应代码,否则该应用程序很可能会出现问题。
性能分析
程序性能的问题,有很多原因,需要对症下药。
导致软件性能低下,主要有下面3种原因。
(1)程序的运算量很大,导致CPU过于繁忙,CPU是瓶颈。
可以在设备上运行“top”命令,如果某个进程的CPU利用率很高,则说明CPU是性能瓶颈。
(2)程序需要做大量的I/O,读写文件、内存操作等等,CPU 更多的是处于等待,I/O部分成为程序性能的瓶颈。
运行“top”命令,系统内进程的CPU利用率并不高,这时可以通过proc目录下的相关文件(后面将会讲到)查看系统I/O情况。
如果系统存在大量的I/O,则可以断定I/O为性能瓶颈。
(3)程序之间相互等待,结果CPU利用率很低,但运行速度依然很慢,程序间的共享与死锁制约了程序的性能。
如果系统的CPU利用率并不高,而且也不存在大量的I/O操作,那么很可能是多个线程之间相互等待造成的,这时就需要对程序进行大规模的重构。
proc目录
通过proc目录,能够了解到CPU和IO设备的工作状况,从而能够帮助分析导致程序性能低下的原因。
1.系统相关
还是先通过proc目录,了解整个系统的性能。
因为嵌入式设备中一般只有一个CPU,所以这里只关注第一行。
cpu 5116 0 7801 249195 60 41 55
cpu后面数值分别代表着CPU在不同状态下所用的时间,其单位为jiffy(0.01s),7个数值的含义分别是:
user(5116):从系统启动开始累计到当前时刻,用户态的CPU 时间,不包含nice值为负的进程。
nice(0):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。
system(7801):从系统启动开始累计到当前时刻,内核所占用的CPU时间。
idle(249195):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其他等待时间。
iowait:从系统启动开始累计到当前时刻,硬盘IO等待时间。
irq:从系统启动开始累计到当前时刻,硬中断时间。
softirq:从系统启动开始累计到当前时刻,软中断时间。
由此可以推断出:
CPU时间=user+system+nice+idle+iowait+irq+softirq
根据CPU的利用率,可以知道当前系统的CPU的负载情况。
(3)系统和Flash、内存等有大量的交互和等待,从而导致系统性能下降,可以通过IO利用率来了解。
通过这些数据,可粗略定位系统的瓶颈为何种类型,从而进行有目的的优化。
还有一个与程序性能有关的指标。
虽然能够通过proc目录获得绝大部分进程的运行信息,但对于程序员来讲还不是很直观,好在Linux上有一些现成的工具可以供我们使用。
top是最常用来监控系统范围内进程活动的工具,它提供运行在系统上的与CPU关系最密切的进程列表,以及许多有意义的统计值,例如负载平均、进程数量以及使用的存储器和页面空间的数量。
一般使用top命令来查看进程的CPU利用率的问题。
在某一刻,系统突然变得很慢,这时候我们的第一反应就是运行top,来查看是哪一个进程占用了大量的CPU。