【Android Linux内存及性能优化】(十) 进程冷启动和热启动的区别

【Android Linux内存及性能优化】十 进程冷启动和热启动的区别

本文接着
【Android Linux内存及性能优化】(一) 进程内存的优化 - 堆段
【Android Linux内存及性能优化】(二) 进程内存的优化 - 栈段 - 环境变量 - ELF
【Android Linux内存及性能优化】(三) 进程内存的优化 - ELF执行文件的 数据段-代码段
【Android Linux内存及性能优化】(四) 进程内存的优化 - 动态库- 静态库
【Android Linux内存及性能优化】(五) 进程内存的优化 - 线程
【Android Linux内存及性能优化】(六) 系统内存的优化
【Android Linux内存及性能优化】(七) 程序内存泄漏检查工具
【Android Linux内存及性能优化】(八) 系统性能分析工具
【Android Linux内存及性能优化】(九) 进程启动速度优化篇

四、进程冷启动和热启动的区别

很多个会发现,在程序第一次启动(冷启动)退出后,接下来程序启动(热启动)速度明显要比第一次启动快,这是为什么呢?

其实这和Linux 操作系统的内存 Cache 机制有关。

在程序第一次启动、退学出后,进程虽然被销毁了,但是进程代码段所占用的物理内存并没有被销毁,
而是被 LINUX 缓存起来了,保存在Cache 中。

这样当程序再次被启动时,在进程运行过程中,指令不必再从Flash 中读取到内存中,而是直接使用LInux 内核Cache 缓存的代码,
这样减少了在程序启动过程中所产生的page fault ,从而加快了进程的启动速度。

因此,进程冷启动和热启动速度上的差别,主要在于启动进程中其所动行到的进程和动态库的代码段所产生的page-fault 的多少,这与代码段的大小有关,也与该动态库是否被其他进程加载并使用有关。


在进程启动过程中:

  • (1)进程冷启动时,如果运行的指令相对较多,则出现的page fault 会较多,影响进程的启动速度。
    这时,要高度关注代码中所用到的只读的大数组,他们在代码段的.rodata 节,如果启动过程中要用这些数据较多,
    则会产生较多的page fault 而降低进程的启动速度。

  • (2)进程所依赖的某些动态库可能已经被 一些守护进程所加载,其代码段已经在内存中,故这种动态库对进程的冷启和热起的影响不大。

  • (3)某些动态库只是被该进程所加载,那么在冷启动之前,这个动态库的代码不会被 加载到内存,故这些动态库的代码如果在进程启动过程中用到,则会产生page fault 影响进程的启动速度。 对于这类动态库,可以考虑将其改为静态库,减少加载动态库的数量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章