雖然有點不太明白,轉過來慢慢琢磨。。。
關於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】