写一些自己对于Android进程管理以及进程线程相关知识学习的体会。
首先我们知道,Android操作系统是基于Linux内核的,但是它的进程管理机制却不同于Linux。Linux对于进程的管理策略是这样的:当进程活动停止后,就结束这进程。但是在Android中,当进程的活动停止之后,并不会结束这些进程,而是把它们驻留在内存中,直到系统需要更多的内存。这样做得目的是:驻留在系统中得进程并不会影响系统的整体运行速度,反而当用户重新激活这些进程时,会提升进程的启动速度。所以我们在使用Android操作系统时人为的关闭进程是没有太大必要的。但是当内存剩余很小时,开启耗内存的大型程序会很慢,这是因为系统剩余内存不够支撑大型程序开启,会触发系统的进程调度机制,关闭一些进程。所以在开启大型程序时,关闭一些进程,是可取的。
那么系统将在何时选择结束进程?并且结束哪个进程?
简单的说,Android进程管理依赖于一个LRU(Least Recently Used 近期最少使用)进程队列。详细来说:
- 系统会对进程的重要性进行评估,并且将重要性以"oom_adj"这个数值表示出来,富裕各个进程,然后系统根据“oom_adj”来判断结束哪些进程,一般来说“oom_adj”的值越大,该进程被系统选中的可能性就越高。
- 前台程序的“oom_adj”的值为0,意味着它不会被系统终止,一旦它不可被访问后,会获得更高的“oom_adj”,"oom_adj"的值可能是根据进程在LRU队列中得位置决定的。
- Android可以根据“oom_adj”来决定进程调度策略。
Android将进程分为六大类:
- 前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。举例来说,当你的浏览器在屏幕上显示时,浏览器属于前台进程,当我们按home键回到主界面之后,浏览器就变成了后台进程(background)。我们最不希望终止的就是前台进程。
- 可见进程(visible):可见进程是一些不在前台,但是用户依然可见的进程。比如说:输入法,widget(比如说天气、闹钟等桌面控件)。这些进程虽然不在前台,但是跟我们的使用密切相关,我们也不希望它被终止。
- 次要服务(secondary server):目前正在运行的一些服务。(主要服务,如拨号等,是不会被进程管理程序终止的)。
- 后台进程(hidden):后台进程(也可以叫background),就是我们通常意义上理解的被切换到后台的进程,比如说浏览器,阅读器,当程序在屏幕上显示时是前台进程,一旦我们按了home键返回到主界面,程序就驻留在了后台,成为了后台程序。
- 内容提供节点(content provider):没有程序实体,提供内容供别的程序去用,在终止程序时有较高的优先级。
- 空进程(empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行作用往往是提高程序下次的启动速度,或者时记录程序的一些历史信息,是最应该被终止的。
所以进程结束的有限顺序是:
- empty>Content
- Provider>Hidden>Secondary
- Server>Visible>Foreground