Android 是如何管理进程的
在Android里,进程和程序是两回事,程序可以一直保留在系统里,但是没有任何进程在 后台“运行”,也不消耗任何系统资源。所有的程序保留在内存中,所有可以更快的启动回到它 之前的状态。当你的内存用完了,系统会自动帮你杀掉你不用的任务。 需要明白的是,Android用RAM的方式,跟windows啥的是两回事。在Android的世界里 面,RAM被用满了是件'好'事。它意味着你可以快速打开之前打开的软件,回到之前的位置。 所以Android很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的电 话。而实际上,是你的CPU——当你的软件真正运行时用到的东东——才是拖慢手机的瓶颈。
为啥说进程管理软件是祸害
很流行的各种进程管理软件都说帮你释放内存是件好事,但这是不正确的。打开这些软件 时,他们告诉你“运行”的软件和杀死他们的方法。你也可以在“服务”里面看到到底程序的哪些 部分在“运行”,占用了多少内存,剩余多少内存。所有的这些都告诉你,杀掉这些程序能够释 放内存。但是这些软件都没有告诉你这些程序到底消耗了多少CPU时钟,而仅仅告诉你能释放 多少内存。要知道,用满了内存实际上是件好事,我们要注意的是CPU,真正消耗你的手机资 源,消耗电池的东东。 因此,杀掉程序通常是没有必要的(尤其是用"autokill"方式杀掉程序)。更严重的是, 这样做会更快的拖垮你的手机能力和电池性能。不管是手动杀掉进程,还是自动的杀掉进程, 重新打开程序,你实际上是在用CPU资源来做这件事。 事实上,这些进程管理软件消耗了系统资源。而且,这些软件会莫名其妙的杀死其他程序 造成乱七八糟的结果(尤其对些小白来说)。所有的这些,告诉我们,你的手机在用它自己的 方式工作,特别是你只是个小白用户,用这些进程管理软件耽误的事情比得到的要多。
那么你应该怎么做呢
这么说吧,各种程序开发水平是不一样的。很多人以前或者现在使用这些进程管理软件, 释放内存,感觉手机快了那么一点。造成这个问题的原因是,你用的软件本身程序写得太烂 了,比如,有得程序完全没有必要联网时,还在联着。这个时候,杀掉这些程序,你能得到好 处,就是说,只有你知道你在干什么得时候,杀掉让你爱但是很烂的程序才能帮上你。 事实上 ,很多开发者,包括ROM开发者,如果用了进程管理程序,当你提交bug报告 时,看都不会看一眼(Cyanogen 时这么干的,我不知道MIUI是不是),所以能不用就不要 用了,除非你真的知道你在干什么。 如果你真关系你的手机的表现和进程,还是多关注下系统进程,看看里面说各种程序都消 耗了多少资源,如果某个程序消耗太多,时不时杀掉它可能会有那么一点帮助。 总的来说,进程管理软件正确的用途是杀那些出错的程序、会导致死机有BUG的进程以及 疑似病毒进程等,而不是一味地追求内存空得多程序在内存里放着,CPU不调用,它就是死 的,一般程序你退出了它就不再运行了,不占用CPU资源(占用了CPU时间这个才是要耗电 的),这就是2.2以上版本系统那个“快速启动”的工作原理。
首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统(linux是啥都不知道自己去百度吧),而linux系统的内存管理有其独特的动态存储管理机制。不过Android系统对Linux的内存管理机制进行了优化,Linux系统会在进程活动停止后就结束该进程,而Android把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。
如果你懂java,就会更容易理解Android系统的内存管理机制。与java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阈值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。Android系统有六类进程:前台进程、可见进程、次要服务、后台进程、内容供应节点、空进程。对于高手而言可以用MinFreeManager之类的软件进行进程管理,分别为六类进程设定不同的阈值来操纵系统的内存分配机制。不过对于一般用户而言,Android系统默认的分配机制已经可以满足使用需要,因此也不需要再去调整。
安卓的内存管理机制:
1.系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,
赋予各个进程;(系统会根据“oom_adj”来判断需要结束哪些进程,一般来说,“oom_adj”的值越大,该进程被系统选中终止的可能就越高)
2.前台程序的“oom_adj”值为0,这意味着它不会被系统终止,
一旦它不可访问后,会获得个更高的“oom_adj”,我们推测“oom_adj”的值是根据软件在LRU列表中的位置所决定的;
3.Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制性,
可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。这给了进程管理脚本的编写以更多的选择。
Android将进程分为六大类:
1.前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。
举例来说,Dialer Storage,Google Search等系统进程就是前台进程;
再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground)
但一旦你按home回到主界面,浏览器就变成了后台程序(background)。我们最不希望终止的进程就是前台进程。
2.可见进程(visible):可见进程是一些不再前台,但用户依然可见的进程,
举个例来说:widget、输入法等,都属于visible。
这部分进程虽然不在前台,但与我们的使用也密切相关,
我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)
3.次要服务(secondary server):目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),
举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。
这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止
4.后台进程(hidden):虽然作者用了hidden这个词,但实际即是后台进程(background)
就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。
当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),
一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。
后台进程的管理策略有多种:有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;
也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。
这里就需要用户根据自己的使用习惯找到一个平衡点
5.内容供应节点(content provider):没有程序实体,进提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权
6.空进程(empty):没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,
依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。这部分进程无疑是应该最先终止的。
对于一些内存很低的低端Android机而言,系统默认的内存分配机制无法实现很完善的内存调配。所以在运行大型游戏时需要先清理一下内存。
有人说后台挂着程序很费电,事实上Android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。至于QQ、音乐播放之类的程序可以在后台运行,是因为这些程序在后台开启了服务,而服务可以后台运行,所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源。
Android系统这样的设计不仅非常适合移动终端的需要,而且减少了系统崩溃的可能,确保了系统的稳定性。老想着清理内存的同学完全是因为被塞班或者Windows毒害太深,事实上,经常用Taskiller之类的软件关闭后台所有进程,很容易造成系统的不稳定。很多时候出现问题,只要重启就能解决,其原因也在于此。
Android系统进程管理(基本原理:后台管理和自动释放优先级低的进程换取空闲RAM)
当一个程序放到后台时,系统可能将数据保存起来而让程序进行休眠,或者仅仅运行部分服务,仅仅当收到相关的申请时才恢复部分进程,处理完之后结束进程而保留服务——这些都是自动处理的,也就是说,如果用户运行的软件都是按照Android思想而设计的,那么除了明确有退出按键的一部分大型程序外,其他程序是都可以运行后扔到后台不用再管了的,当某个程序需要更多RAM时,系统会自动释放掉一些不重要且最近没有使用的程序;而当你打开某个曾经打开的程序时,系统会先检查RAM里是不是有这个程序的部分进程,然后进行恢复,这样可以更快打开它。
当然了,如果智能手机本身RAM很小而且CPU不给力,系统自然会很频繁的终止进程释放内存,这就使得许多小内存的手机用起来感觉一卡一卡的了。于是很多论坛都开始讨论怎么样使得全杀过后空闲内存更大、怎样禁止自动启动某些进程——结果空闲RAM确实大了,用起来反而更卡了——随便切换个程序(如看书的时候来了个电话)系统都要重新启动几乎所有相关的进程,怎么能反应不迟钝。
Android用RAM的方式,跟Windows、Windows Phone、Symbian是两回事。在Android里,RAM被用满了是件好事。它意味着你可以快速打开之前打开的软件,回到之前的位置。所以Android很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。而实际上,退出后重启这些程序才真正拖慢了手机的响应。而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。
这个问题最终我觉得应该埋怨程序员。许多国内的Android程序员编写的程序根本就没有对进程进行分类,总是试图将所有进程都保留在内存里(例如某著名手机浏览器)!这就使得这些程序即使放到后台了,它也不许系统对其进程进行释放。WM、Sybiam系统里的内存管理没有这么智能,于是习惯了这种方法的程序员以及用户就把这种内存管理方式和使用习惯用到了Android上。所以这里建议,对于很多国内软件,用完之后还是按一下退出吧,而对于规范化的程序,以及系统自带的那些程序(例如谷歌程序基本都没有退出),用过之后放后台就好。
PS:
1.养成良好的软件使用习惯,不用了就退出(左键菜单退出、亦或程序关闭按钮、亦或直接右键返回桌面,切忌中间HOME键!)
2.关闭第三方杀软不必要的防火墙(比如来电防火墙、短信防火墙、邮件防火墙,前提你不是专门做电子商务的,一般情况下哪有那么多骚扰)别盲目的认为全部开启是最安全的,要知道每道防火墙就是一个常驻进程,一直处于活跃状态,撇开RAM不谈,耗电量也不容小视!
普及知识:
多工系统,Multi-task System
这个字眼其实是针对使用者和程式开发者多于系统本身,因为这世上没有一个系统不是多工的。
那么,为什么又会有这个术语?
原因很简单,因为其实多工指的并非系统本身,而是操作环境。
多工和非多工的操作环境有何分别?
系统在执行一个程序时,会有以下几个步骤:
1. 把主程式放到 RAM 中
2. 在 RAM 中执行程序
3. 依照程序的需要,把 RAM 分给该程序使用
在执行程序时,多工和非多工操作环境是没有分别的,而分别在程序结束时。
多工操作环境:
1. 把分给该程序使用的 RAM 回收
2. 如程序本身没有设定自行关闭的话,会把主程式留在 RAM 中
3. 如该程序没有工作的话,就会在背景待命,否则就是背景执行。
非多工操作环境:
1. 强制关闭该程序
2. 把分给该程序使用的 RAM 回收
3. 把主程式从 RAM 中移除,取回记忆体
说到这里,多工与非多工的分别大家就会很清楚了。
这是非多工环境的 Iphone、Featured Phone 和多工环境的 Windows Mobile(WM)、Symbian、Android 最大的分别。
Iphone 永远有足够的 RAM 去给系统运作,所以永保系统运作的顺畅度。
而 WM、Symbian、Android 这类多工系统,在执行一定数量的程序后,系统便会变钝。
联系客服