• iOS和Android后台机制对比


    转自:http://blog.csdn.net/zsch591488385/article/details/27232881

    一、iOS的“伪后台”程序

    首先,先了解一下ios 中所谓的「后台进程」到底是怎么回事吧?

    Let me be as clear as I can be: the iOS multitasking bar does not contain "a list of all running apps". It contains "a list of recently used apps". The user never has to manage background tasks on iOS.

    首先我们得搞清楚的是,iOS 中所谓的「后台驻留」并不是指「执行中的程序」,而是「最近使用过的程序」,也可以瞧瞧Apple 的知识库文章怎么写的:
    按两下主画面按钮后,显示的是「最近用过的应用程序」,所以别把它想成Mac OS X 中的Command + Tab 键所显示的切换程序列;你可以试试看将iPhone 关机再开机,然后按两下Home 键,应该会发现先前那些程式还是出现在那里,因为它其实是你最近使用过的程序使用记录,或像是浏览器中的浏览记录)。
    如果你一个一个去清除 "后台驻留" 的程序,就像是一笔一笔删除浏览记录中的项目一样,是没有太大意义的(除非你不想让其他人看到你曾经用过什么程式,或者想杀时间、太无聊了),也不会对电力或记忆体有什么帮助。
    iOS 的多任务处理其实是很聪明的,系统会自动中止在背景执行的程序,在有需要时,也会将被中止的程式suspended(注:"中止的程式"不是指关闭程序,而是指由前台转向后台的程序,程序在后台并不真正运行,不要和关闭程序混淆了) 从内存中移除。因此,iOS 装置的使用者根本就不需要担心怎么管理这些执行中或不在执行中的程序,尽管放心用、轻松玩就是了!

    一般说来,所有程式进入背景后都还有5 秒的执行缓冲时间,有些程序可以要求延长到10 分钟(这些当然是由开发人员在设计与提交程式时决定和声明);

    因此,在你按下Home 键后,本来的程式就会退到背景,如果它有额外的背景执行作业,超过10 分钟还是会被iOS 中止;所以,还是别担心了!

    但是,也有例外情况,某些特殊类型的程式是被容许在背景中持续执行的,像是会持续在背景播放音乐的程序、GPS 程序、VOIP 程序、Newsstand 以及周边配件附属的程序,不过只要这些程序不再执行动作,就会变成中止的程式,像是音乐拨完了、杂志下载完了... 因此,使用者其实也没必要太过留意这些程序。
    you do not have to manage background tasks on iOS. The   system handles almost every case for you and well written audio, GPS, VOIP, Newsstand and accessory apps will handle the rest.

    二、IOS的“多任务”发展史

    自从出现了操作系统以来,就没有过所谓真正的“多任务”。所谓多任务,无非是CPU速度够快而足以支撑极短时间内在多个进程内动作罢了。而所谓的“单任务”,无非是只能让当前任务独享资源罢了。

    简单来说,IOS 4 APP类型可以分为三种:

     1. 保存现场。

    即:按下Home键10秒内直接杀死进程,并释放内存。一般说来,所有程序进入背景后都还有5 秒的执行缓冲时间,有些程序可以要求延长到10 分钟(这些当然是由开发人员在设计与提交程式时决定和声明);因此,在你按下Home 键后,本来的程式就会退到背景,如果它有额外的背景执行作业,超过10 分钟还是会被iOS 中止。

    2. iOS支持的“多任务”。

    即:按下Home键转入多任务状态,保留在内存中,但只能系统允许的动作:比如GPS,比如VoIP,比如Streaming Music等等。

    3. 真正的桌面级别的多任务。

    即:只有Safari/Mail才是真正的多任务,苹果嫡系大都都不是。这个级别的app在后台是没有任何限制动作。(对于无限制动作的程序,一是会在用户无察觉的情况下耗光电力,二是会有安全上面的问题)。

    注意:对于上述三种级别,后两种会占用内存的APP,也会在任意时间从内存中被砍掉,取决于你是否动用了其它app而导致内存不足。真正不会被砍掉的后台,只有苹果那个通知系统。

    其实可以回顾一下iOS是怎么一步步引入现在这个机制的:
         1. 刚出生,什么都没有,单纯的单任务。
         2. iPhone OS 3.0,引入通知架构。几乎当年全部机型可用;Android晚了一年,2.2才有此功能,到这个时候相信才有90%上下机器用上。
         3. iOS 4.0+,引入有限制的后台多任务。

    搞这么复杂干嘛?直接像android一出生那样所有app一个小虚拟机,无任何限制动作,让根本没有内存管理经验和资源消耗概念的全世界最大民工群Java程序员们写的app任意地跑着吧!
    答案只有两个:电力,安全。安全不说,如何在保持多任务优势的同时,避免消耗过多电力,苹果花了很多心思;而不是像webOS/Android一样,简单粗暴桌面级的多任务。iPhone 4甚至在硬件上面也下了苦功,利用3D层叠技术组装A4芯片,内部元件高度集成,并把天线移至体表,增加内部电池空间。

    三、IOS的内存管理

    其实在iOS中,它的后台跟塞班,Windows不一样,苹果是伪后台。你双击Home键打开的列表,仅仅是打开一个叫做“近期打开程序列表”的东西。在塞班和Windows、安卓这些智能系统中,当你把一个程序放到后台,他是活动的,跟在前台没有区别。而iOS不一样,你将程序放到后台去之后,iOS是将此程序给停掉,包括联网等等,各种进程都给停掉(iOS只给一部分进程留有后台运行权限,比如音乐播放之类的)。也就是说,这个程序基本算是死了……这样带来的好处就是,苹果一直只能只有一个程序在工作,其他的都会停掉,所以非常流畅(基本可以这么说,某些特殊的进程可以在后台跑的)。当然,以前一直被苹果用户给诟病的就是QQ不能挂后台,一按Home键就掉线就是这个原因(当然,苹果通过推送来解决这个问题)。虽然说程序被停了,但是,程序并没有在内存中释放。而是继续放在内存中,这样带来的好处就是你再次打开程序的时候,会回复到你之前关闭程序的界面,程序快速的继续运行。

           那么,当内存中程序太多了,内存不够的时候怎么办?当内存不足的时候,iOS会依据自身判断出程序的优先级,之后清理程序占用的内存。比如音乐,应该就属于是优先级比较高的程序。iOS根据优先级,和使用次数来决定哪些程序首先清出后台。不只是简单的看时间。将程序踢出内存,就是所谓的挂起。从而释放内存,供新打开的程序使用。为了验证这一点可越狱机型的朋友可以专门下个插件(SwitcherMod),能将挂起的程序在后台显示为灰色透明,仍然在内存中的程序正常显示。


           而运行大型游戏及耗内存的应用之前,大家可能会明显的感到卡顿,这是因为系统在释放足够大型程序运行的内存,可能涉及到很多的APP,这需要耗费一些CPU资源及时间,因此会产生卡顿



    总结:你可以完全不去清后台,因为iOS会根据需求来自动释放不必要的内存。但是iOS在释放内存的时候,会占用CPU,导致短暂的卡顿。如果不在意这个,以后就直接忽略后台就好了。如果你觉得苹果是完美的,不能有卡顿。那就及时多清清没用的后台就好了。

    四、Android后台机制

    android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来就是android标榜的优势之一,如果人为去关闭进程,没有太大必要。特别是自动关进程的软件。 到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。所以,论坛上有个更改内存阀值的程序可以有一定改善。 但改动也可能带来一些问题,取决于值的设定。 那么,进程管理软件有无必要呢?有的。就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度。但一些小程序,完全可交由系统自己管理。谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电。我就说说 android后台的原理,你就明白了。android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重进会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务。服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,标签是service。至于广播什么的我就不涉及了。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢? 还有一个。为什么android一个应用看起来那么耗内存。大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。 以上这些设计确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要。大家不妨按我说的习惯来用用这个系统。最后推荐一款进程管理软件,systempanel,market上能搜到,界面友好启动快,功能也不错,用于手动关闭进程很好的软件。

    五、总结

    1、后台程序的运行状态

    IOS:分三类应用,大部分应用切换到后台会停止运行,部分应用(音乐、voip)在任务完成后也会停止,后台应用不耗cpu,但应用内存保持占用状态

    Android:切换后台后应用进入onstop()状态,不是真正停止,这种状态下也不消耗cpu,部分Android应用自带后台服务,后台服务不会停止,需要消耗CPU,应用内存都会保持占用状态

    2、后台应用内存管理

    IOS:后台应用内存保持,在新开启应用申请内存时会有一套完善机制(重要性、打开次数等)确定回收哪些应用的内存,并为新开启的应用分配足够的内存;

    Android:设置内存阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略十分消耗系统资源;每一个android都运行在一个虚拟机中,所以更耗内存

  • 相关阅读:
    Unix高级编程之文件权限
    gdb手册
    libev 使用
    Unix高级环境编程之fcntl函数
    设计基于锁的并发数据结构
    CPU占用分析
    atomic用法
    RESTful架构搜集
    神奇的VIM
    [转] boost:lexical_cast用法
  • 原文地址:https://www.cnblogs.com/yang-shuai/p/7306764.html
Copyright © 2020-2023  润新知