2011-07-04

iOS與Android的多工機制

很多人說iOS是假多工,沒錯,而Android一開始是真多工,但是到2.2之後也開始有假多工了,為什麼?



這邊先定義一下真假多工:
假多工:占用記憶體、不占用CPU、程式被關閉(釋放記憶體)後仍可繼續執行
真多工:占用記憶體、占用CPU、程式被關閉(釋放記憶體、CPU)後無法繼續執行

這邊可以看到假多工的優勢:
1.省電:因為背景不占用CPU
2.省記憶體:因為記憶體被釋放也可繼續執行,所以系統可以任意釋放記憶體而不ˋ影響使用
3.順暢:前景程式可以用到100%的CPU與記憶體,這也是iPhone支援周期較長的原因之一,舊硬體仍可以跑得很順
4.易於管理:因為背景不消耗資源,跟關了沒兩樣,所以「關閉程式」的概念就消失了,不必手動管理背景程式。

假多工的缺點:
1.在背景時,無法執行系統預設服務以外的程序(如大檔傳輸、音樂轉檔)。
2.無法同時開啟多個服務(同時播放兩首音樂)
3.程式撰寫需要技術,開發者必須通曉iOS或Android的API才能啟用假多工,但真多工不必這麼麻煩。

假多工的原理:
多工其實是很簡單的技術,iOS上也不是沒有真多工,只是真多工只有系統能用而已,假多工是對App而言。 一隻App在背景跑,使用者怎麼知道App有沒有在跑呢?
1.聲音播放
2.網路連結
3.該程式有時續性(即程式畫面回隨著時間改變)
4.周邊互動,如GPS、藍芽、USB存取等

真多工要滿足上述4點可以說是易如反掌,但假多工就要多費一點功夫,聲音播放跟周邊互動可以實作成系統API,讓程式被切換到背景前就先呼叫API,工作就不會中斷,因此背景導航、語音播放、音樂播放都不是什麼難事。

第2點就比較麻煩,iOS在2009年推出APNS,Android在2010推出C2DM,其原理很簡單,以下以APNS為例,有些程式背景會不斷 的存取伺服器(輪詢),來判斷有沒有新的訊息,如MSN,APNS就會把這個「存取伺服器」的動作丟到一個APNS伺服器,由APNS伺服器來幫你存取網 路上的訊息,有消息再通知,如此一來就可以節省手機的傳輸資源。這是一個很聰明的作法,因為手機資源有限,將許多網路存取繁重的工作丟到APNS上,你可 以跑一堆社群程式卻步消耗記憶體與CPU,因此,Google在Android 2.2開始使用APNS,所以從這版開始,Android變快了、變順了,拜假多工所賜。但很可惜,這技術無法使用在大檔傳輸,如FTP。

第3點要達成,其實寫程式用一點技巧就可以了,比對程式關閉與開啟的時間,計算出當下應該顯示的畫面即可,可惜的是如果該程式是轉檔、磁碟掃描等大量 運算的程式,就無法用假多工達成,但這種高耗能的程式,也不會有人放在背景跑吧?或許有人會說,那把這種高耗能程式放背景,跑很慢,讓前景可以全速跑,那 其實就跟假多工的背景凍結差不多了。

Android上,將播放音樂的程式丟到背景,如果音樂中斷了就可能是真多工(被系統踢掉了),如果音樂沒中斷就可能是假多工,iOS上一律假多工,所以比較單純。

Android的使用者可以發現,有些程式在背景會消耗資源,導致前景程式變得很頓,特別是賣場那些被開了一堆程式的展示機,要使用者去一一關閉這些 程式既辛苦又麻煩,關閉程式時要一直按back鍵,來確保程式釋放資源,借別人手機後要檢查有沒有開了什麼軟體,免得兩三小時後手機就沒電了。

手機不是一般的電腦,以現在手機的CPU效能、記憶體大小、電池續航力、網路頻寬來看,跑一兩隻程式就已經捉襟見肘了,更別提如同桌機般動輒數十支、 數百支程式在跑,桌機擁有手機10倍以上的資源,真多工當然大行其道,但像手機這種行動裝置,有智慧的管理資源的假多工才是趨勢。

其實,單核心的電腦上,真多工其實也是「模擬」出來的,只有一顆CPU,怎麼可能同時做兩件事?其實也是快速地交換執行的程式,讓你覺得是同時執行。 電腦裡的「超執行緒」也是讓四核心看起來像八核心,也不是真的有八個核心,所以,不是假的就是不好,真的就一定好,很多技術一開始都是「假XX」,後來就 變成「真XX」,總有一天也會被某個新的「假XXX」取代,電腦工程就是如此不斷進步下去的。

沒有留言:

張貼留言