虽然有点不太明白,转过来慢慢琢磨。。。

 

关于ios的多任务以及内存管理
  看了很多人为自己的可用内存是350mb还是380mb纠结。为了多优化出一点可用内存费脑筋。
  ios的任务管理和内存管理,跟windows是有很大差别的。很多人习惯于用
windows的思维去看待ios。
  windows大家都知道,窗口开的越多,系统越慢,为什么呢?因为所有窗口都在运行,cpu占用率高;并且都占内存。可用内存不足还会迫使系统使用硬盘充当虚拟内存,硬盘频繁读写当然会多耗电,并且硬盘速度也比较慢。
  ios则不同。首先ios的后台任务,除了极少数可以后台运行之外(比如音乐播放),绝大多数在后台都是挂起的。比如极品飞车,切到后台后马达轰鸣声就没有了,切换回来后得点“继续”才能继续跑。这类软件让它后台继续运行除了徒增耗电之外,没有任何意义。你总不希望极品飞车在切到后台时赛车还继续横冲直撞吧?
  既然软件在后台挂起,当然就不占用cpu,也就不会耗电。
  软件在后台挂起,不占cpu,但总该占内存吧?多占内存会不会耗电?会不会拖慢系统
  ?
  答案仍然是:不会。
  ios没有为ipa准备虚拟内存。如果前台软件内存不够用,ios会直接释放后台软件所占用的内存,并不会像windows那样用硬盘虚拟内存(引起耗电增加)。而释放一块内存很简单,就是把内存块的某个标志由“占用”改为“空闲”即可,内存的内容直接废弃丢掉,不用交换到闪存,速度很快。
  可见,我们使用windows的经验不适用于ios。
  释放后台哪个软件的内存也有讲究。
  有些后台软件被释放后会有严重后果,比如游戏软件,被释放后软件就结束了,切换回来就等于重新开始,游戏进度丢失。
  有些软件则无关紧要。比如电子书软件,保留内存被释放后,软件可以只保留一个书签,切换回来可以重新加载内容,继续阅读。比如sarafi浏览器,所占内存被释放,切换回来无非是页面重新加载,不会引起严重后果。
  ios会优先释放那些对内存不敏感的后台软件。
  对于已经切换到后台,既不占cpu并且内存又被释放的软件,事实上软件已经结束了,这样的后台软件更加不可能耗电。双击home看到的后台任务列表,大多数是这样的软件。
  说了那么多,就是说明:ios可以任意开软件而不用刻意去结束它。
  事实上ios软件连个退出功能都没有,以至于有的人抱怨,苹果ios设计怎么一点都不人性化?要退出一个软件,得双击home,再长按下面的图标,图标抖动后再按叉叉,麻烦死了。其实看了前面说的就知道了,ios的软件根本不需要退出。
  其实苹果ios多任务设计的目的,是让你忘掉多任务的存在,像ios
3.x的单任务一样使用多任务,想运行哪个软件就运行它,不想运行就直接按home,无论后台开多少个软件,都不会拖慢前台软件(这本来嘛,后台都挂起状态不占cpu)。这一点对windows来说是难以想象的,但苹果的确是做到了。
  并不是windows无能,而是因为windows是用来干活用的,需要全能的多任务,ios只是一个手机操作系统,侧重点不同。
  —
  部分人对ios内存空载和满载的耗电相同有疑问,认为:内存空载省电,满载多耗电。
  这种看法是不对的。
  所谓空载和满载,是对操作系统来说的。而对于内存芯片电路而言,看到的只是0和1,就算是空闲的内存单元,也有0和1在里面,它必须忠实地保存所有数据,iphone4有512mb的内存,只要一开机,芯片就必须一直保存通电以保存512mb的数据。不可能会因为操作系统认为有空闲内存,就会去切断那些空闲内存单元的电来省电。
  以电脑为例,你有两根内存条,一开机这两根内存条就得全部通电。不会因为你有大量空闲内存,主板就对其中一条内存条断电,然后再因为系统需要更多的内存空间而对其重新加电。
  认为内存满载就会增加耗电,仍然是windows的惯性思维。再说一遍:windows系统中,内存满载,系统就会使用硬盘做虚拟内存,所以耗电增加并且速度减慢;ios却不会使用硬盘做虚拟内存,而是直接释放部分后台软件占用的内存,直到内存够分配为止。
  因此内存空载与满载,对于ios来说耗电没有区别。由于内存释放时是直接释放,其内容直接丢弃而不需要保存到硬盘(这跟windows不一样),因此内存空载与满载对ios来说,速度也没有区别。
  —-
  部分人以开不开后台耗电有明显区别为依据。
  关于这一点,我再说一下:
  论坛上有人关闭所有后台,关闭通知,甚至开了飞行模式,一晚上待机仍然不见10%以上的电。百思不得其解。也有人什么都不懂什么都不管什么都不关,傻人有傻福,一晚上待机仍然100%的电。
  耗电问题因人而异,不能一概而论。
  就我自己而言,只开2g信号待机,开通知,故意留几个大型游戏在后台不关闭,一晚上掉1%。
  事实上,后台游戏你切换回来,全部会处于暂停状态,全部得点屏幕上的resume才能继续,事实就可以说明:游戏在后台是暂停的。一个完全暂停的后台任务如果还能让它继续跑电做无用功,你也太小看苹果的系统设计师了。
  比如植物战僵尸的游戏,切换到后台再切换回来的画面,看到game
paused的字样没有?游戏在后台完全暂停了。知道直到你点resume,才会继续。
所有支持原生后台的的游戏,都是这样。
  这种多任务管理机制的好处就是不会拖慢系统运行速度,开很多东西,一样非常流畅。弊端qq不能真正后台(所以才有了push通知),下载任务会暂停之类的。不过iphone上有backgrounder这样强悍的后台软件。不知道wp7上有没有backgrounder这样的软件。
其实大家用习惯了wp7
  或者iphone的话
  发现其实也没必要真后台。qq推送做好了其实也一样。
软件之类的只要支持芒果后台,切换出去就可以暂停,切换回来继续。。
  wp7限制后台5个是因为256系统内存下单个应用可用内存上限是90,目前的机器o都是512内存,单个可用内存为90+256,差不多能同时跑4个应用,再考虑到一般应用并不总是会占满90的内存,所以同时跑5个是比较合理的数字
  所谓不影响只是大体的说法,原理是新app请求的内存不够自动清之前程序的,虽然是自动清,但这仍然是个系统自动判断的过程
  实际应用之中有时候是能感觉出来的,尤其是打开一个大app,会闪退,然后重新进就好了
  推送其实你可以理解为移动给你发的短信,其实理论上是即时的。
  其中的代表就是wp7自带的messenger,就是短信里面集成的那个,可以24小时在线,耗电也不会有什么变化,该待机2天还是两天,只要你不选离线,别人的wp7上的messenger联系人看你24小时都在线,而且任何时候发信息给你也是像短信一向即时收到的。
  推送并不是什么靠手机端的软件去不停刷新数据,例如30秒一次,1分钟一次,或者两分钟一次,这种方式,电池根本耗不起,延迟也大。
  而wp7的messenger24小时在线,耗电一点感觉都没有,该两天还是两天。
  推送本身来理论上说应该是即时的,但肯定不如socket的长连接即时,因为中间造成延时的环节较多。
  qq的推送,第一个延迟的环节,tx的服务器本身对消息的处理,tx使用微软的推送服务,那么tx的服务器又要连微软服务器可能延迟,最后是微软推送消息,最后是手机靠网络连接取得消息。。。
  反正就是推送可能延迟的环节有点多,socket哪像socket直连tx服务器,就像qq以前版本推送很抽风,但新版就好多了,就是tx改进了自己所胜任的环节。
  messenger是微软自家的东西,少了些不可控的环节,延迟控制得也比较好。
  像国外的某软件就能做到比较稳定的推送,微软自家的messenger更不说了,qq嘛,还需要努力,解决好网络的延迟问题,就像我们访问live都死慢,商店都抽风,所以微软不在国内弄服务器,这个推送的不可控因素就比较多。
  其实,除了黑莓以外的推送,以及find
my
phone功能,其他都不是真正意义的推送。还是通过伪长连接或定时获取数据的,包括iphone,wp以及android
  黑莓是和运营商有特定的类似短信的发送协议,需要运营商的系统支持,其他的其实都是客户端主动轮询。但是由于push服务器统一,所以减少了链接数,从而达到省电的目的。每台设备都有特定的设备id和证书,从推送服务器获取数据时会用这个证书来验证身份
  (注:ram保存数据是耗电的。每个ram的位保持为”1″都需要给电路隙地充电,否则电路的漏电会让这一位电位下降。)
  就记着一句话,车多都碍道!不然双向2车道分配调度好就ok了,还要毛8车道。。。
  理论上内存一直加电,电压是恒定的,所以数据交换并不会产生所谓的功耗增加。不像硬盘一样,寻道和不寻道时候能耗是不一样的。同样cpu会随着运算的负载多少而频率产生变化并产生功耗的变化。但有一点要清楚,程序本身占用内存,只是为了执行一部分数据,内存最大的功能就是预先缓存,直接又快速的交换数据。但是本质上,软件打开还是要读取数据卡或者闪存芯片上存储的数据,这时候就相当于处于寻道中,并且cpu一定会分出一部分资源来预处理这些。
  再怎么后台,原始的数据只要被运行就存在于底层,一直在向所需资源发出i/o请求。所谓系统,这时候只是按照设定好的逻辑规则来排列i/o的优先等级。cpu只是根据逻辑命令来调度资源,执行,运算。
  有后台时候,并不是完全的拒绝i/o请求,只是根据优先级分配资源把i/o请求延后或者说是押后再处理,所以一定会占用一些资源,只是根据系统架构和自身逻辑指令的不同而占用的资源的多少不同罢了。
  不管是那种后台机制,只要存在后台运行,就一定会占资源,只是系统,硬件之间相互配合,也就是优化的好,就相当于调度机制好的话,同样的2车道同样间段能过10量车,而调度不好的话可能只过5辆车。说到底系统就是起到一个硬件资源的整合,分配,调度,执行效率的问题。windows的多任务机制,确实是为了全面工作而设计的,本身系统的架构和设计理念就不同,所谓兼容性更多的是指对硬件各方面的,对于软件来说就是在更多更复杂的硬件上能运行,且同时运行更多的软件而不相互冲突,并有一个折中的,好的效率。mac
os是基于什么系统架构的大家应该清楚吧,并且以前mac机的cpu架构大家都了解是怎么一回事吧?特定的系统针对特定的硬件做出来的,是一对一地。所以mac
os最多只能和windows对比。ios只能和wm,wp7对比。ios确实和以前的wm不同,如果说是对比windows,那更是完全没有可比性。ios的后台机制本质上个人觉的和wp7还是有区别的,甚至某种程度上不如wp7效率高。因为ios的后台机制相当于把被后台的整个程序需要的资源只是打上了终止的标签,所以才能在触发阀值后快速终结并释放资源。但是这种终止是很滑头的终止,ios相当于你把文件删除了,就是说只是放入回收站了。需要的随时可以还原,但是需要你手动点回收站还原文件并确认。放入回收站的文件大家都知是要占用空间吧?也就是资源。而wp7更像是把运行的任务中止后把必要的数据打包做了个快照而存储,注意这时候是“中止”。然后步骤就是直接删除并清空回收站,但是数据这时候其实还在硬盘上,只是逻辑上的删除,只要不写,也就是物理上的更改填充,那么这部分数具依然存在并且可恢复。这时候程序所需的进程和资源其实在被后台的时候已经被释放了。我理解的所谓墓碑机制。挖坑,埋掉,填平,只是有个墓碑表明是怎么回事。不需要那自然已经死了的,不浪费资源。如果需要,有原始信息,就像克隆一样,恢复就可以了。唯一关注的只是复活时候的效率和保证数据正确的校验问题。有的朋友可能明白不过来,说这样岂不是更麻烦更耗费资源?熟悉磁盘存储原理或者说明细raid应用的朋友应该很容易就看明白,数据本身就是一堆0和1,raid1或者5就是在读写,更改时候加入标记校验信息,在磁盘损坏恢复数具的时候根据这些信息来完全回复数据的。但是有一点要清楚,这个程序的原始数据包,也就是程序安装后的数据文件本身是没有被删除的,所以并不需要被完全记录或者完全恢复,只是运行时候产生更改和关联的必要数据被记录了,所以恢复时候并不需要太过于大动干戈。qq在ios下做到时刻保持请求网络连接的合法性,自然就等于优先于系统终止触发的阀值,也就顺理成章的被后台了。所以像qq这类时刻需要刷新内存数据并对磁盘数据也做出修改的东东,wp7显得没有宽容性。因为wp7下,除了微软许可的可以被后台的,其它程序你一旦被后台,就代表要把你打包埋掉,不管你啥需要,啥优先,一视同仁埋掉再说。微软所谓5个允许后台的限制恐怕也就是为了给自己方便。。。那些微软内定的后台接口将来被xx了,软件就能冒名顶替的被真正后台了。墓碑机制是微软windows
phone
7手机操作系统中的一个程序运行规则。说简单点,就是手机上一个任务被迫中断时(如有电话打入),系统记录下当前应用程序的状态后,(像把事件记录在墓碑上一样),然后中止程序。当需要恢复时,根据“墓碑”上的内容,将程序恢复到中断之前的状态。这样的一种机制就是“墓碑机制”
  编辑本段墓碑机制具体表现
    微软在今年发布了全新的windows
phone 7手机操作系统,但令人不解的是,wp7却不支持多任务运行。据了解,wp7并不是严格的单任务,比如wp7中微软自家的ie和zune就能同时运行。

    首先来说一些wp7系统程序运行的基本规则,微软不允许任何第三方应用程序在wp7的后台运行,特定时间内只有一个应用程序的在前台运行,如果你的应用程序没有在前台显示,就表示这些程序并没有运行,这样就不耗费运行内存和处理器资源。这样做主要是为了延长电池续航时间,并保证响应一致的用户体验。

    但是所有的wp7手机都将配备返回按钮硬件,这个按钮除了有返回导航功能之外,还将支持应用程序之间的切换,比如当你在某个应用程序时点击了里面的网页链接,然后调用内置浏览器进行查看,在查看完毕之后就可以按返回键重新返回刚才的程序。

    现在问题就出来了,当前的应用程序切换回之前的应用时,究竟是恢复了一个应用还是重新打开了这个应用呢?因为刚才已经说过了,wp7不允许后台运行程序,而两者的区别就是,重新打开时不会保持刚才的使用状态,恢复是可以延续使用状态的,这就要说到微软的墓碑(tombstone)机制了。

    墓碑是微软为wp7切换应用程序状态的一种处理机制,以使用过程为例,当用户正在使用一个应用程序,比如游戏或者新闻阅读,这时有电话打进来,来电提示和通话页面将会在前台显示,正在运行的游戏就会消失,但是wp7不允许后台运行应用,这时候墓碑机制就会触发,游戏的运行状态包括画面、进度等等数据会冻结保存,相当于暂停,但是游戏确实没有运行,这也是墓碑名字的含义:应用程序已经死了,但是墓碑上记录有临终前的所有状态。当通话结束后,游戏操作系统会将应用程序进程重新启动,并将状态数据传递为应用进行恢复,这也相当于应用从墓地里面爬出来,并按照墓碑上记录的状态进行还原。

    在程序代码示例中,微软给出了单个应用程序的运行状态代码,共有四个app.xaml.cs文件,这些直接关系到执行模式的代码分别是application_
launching、application_ activated、application_ deactivated、application_
closing,分别是启动、复活(激活程序恢复状态)、停用(记录墓碑数据)、关闭(彻底关闭)。开发者们需要注意的是,在开发过程中需要使用微软给出的工具和相关代码才能让自己的应用支持墓碑机制,否则当用户正在使用的时候突然一个电话过来之后就得再次手动打开程序重头再来,这会让用户非常不爽。

    在早期的wp7系统中,微软并没有在程序不运行的时候将进程彻底杀死,而是将其暂停,但是这种情况导致了后台运行堆栈的混乱,api和事件触发经常会出现问题,所以微软才决定使用墓碑机制。

    不过完全实行墓碑机制将会影响到电话的某些功能,比如短信、即时通信、天气等需要时刻保持运行和更新的应用,微软同样给出了推送通知服务(push
notification services)的api,允许应用程序调用该接口保持实时更新。

 

原文地址【http://www.kaiyx.com/redirect.php?tid=2489&goto=lastpost

 

版权声明:本文为crazypig原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/crazypig/archive/2012/06/06/2538703.html