平時的工作中跳芳,有時會遇到多進程編程洲脂,也會涉及到多進程之間的通信杖刷,那么Android的多進程到底是怎么回事励饵,該如何理解Android的多進程呢?
在讀本篇文章之前還需要明確一點滑燃,這兒說的多進程是指一個應(yīng)用中存在多個進程的情況役听。而在理解Android多進程之前,先來介紹一些簡單的概念表窘。
區(qū)分線程與進程的概念
根據(jù)所查資料典予,先分別介紹下它們的概念:
- 進程:是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位乐严×鲂洌可以申請和擁有系統(tǒng)資源,是一個動態(tài)的概念昂验,是一個活動的實體捂敌,是一個“執(zhí)行中的程序”。不只是程序的代碼既琴,還包括當前的活動占婉。
- 線程:線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程比進程更小甫恩,基本上不擁有系統(tǒng)資源逆济,故對它的調(diào)度所用資源小,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度填物。
簡單的來說就是:進程包含線程纹腌,同時一個進程可以包含多個線程。
Android沿用了Java的線程模式滞磺,線程分為主線程和子線程升薯,而在Java中默認情況下一個進程只有一個線程,即主線程击困。主線程又叫UI線程涎劈,主要用于處理界面交互相關(guān)的邏輯,而用戶隨時都會和界面發(fā)生交互阅茶,因此主線程在任何時候都必須有較高的響應(yīng)速度蛛枚,這就要求主線程中不能執(zhí)行耗時的任務(wù),否則會有界面卡頓現(xiàn)象甚至造成界面無法響應(yīng)(ANR)脸哀,因此耗時操作就由子線程來執(zhí)行蹦浦。
到這兒有關(guān)線程和進程的基本概念就介紹完了,下面我們來步入今天正題:
理解Android的多進程
我們都應(yīng)該知道當應(yīng)用安裝到設(shè)備后都運行在自己的安全沙箱內(nèi):
- Android 操作系統(tǒng)是一種多用戶 Linux 系統(tǒng)撞蜂,其中的每個應(yīng)用都是一個不同的用戶盲镶;
- 默認情況下侥袜,系統(tǒng)會為每個應(yīng)用分配一個唯一的 Linux 用戶 ID(該 ID 僅由系統(tǒng)使用,應(yīng)用并不知曉)溉贿。系統(tǒng)為應(yīng)用中的所有文件設(shè)置權(quán)限枫吧,使得只有分配給該應(yīng)用的用戶 ID 才能訪問這些文件;
- 每個進程都具有自己的虛擬機 (VM)宇色,因此應(yīng)用代碼是在與其他應(yīng)用隔離的環(huán)境中運行九杂;
- 默認情況下,每個應(yīng)用都在其自己的 Linux 進程內(nèi)運行宣蠕。Android 會在需要執(zhí)行任何應(yīng)用組件時啟動該進程例隆,然后在不再需要該進程或系統(tǒng)必須為其他應(yīng)用恢復(fù)內(nèi)存時關(guān)閉該進程。
Android 系統(tǒng)通過這種方式實現(xiàn)最小權(quán)限原則植影。也就是說裳擎,默認情況下,每個應(yīng)用都只能訪問執(zhí)行其工作所需的組件思币,而不能訪問其他組件。 這樣便營造出一個非常安全的環(huán)境羡微,在這個環(huán)境中谷饿,應(yīng)用無法訪問系統(tǒng)中其未獲得權(quán)限的部分。不過妈倔,應(yīng)用仍然可以通過一些途徑與其他應(yīng)用共享數(shù)據(jù):可以安排兩個應(yīng)用共享同一 Linux 用戶 ID博投,在這種情況下,它們能夠相互訪問彼此的文件(比如data目錄盯蝴、組件信息等)毅哗。 為了節(jié)省系統(tǒng)資源,可以安排具有相同用戶 ID 的應(yīng)用在同一 Linux 進程中運行捧挺,并共享同一 VM虑绵,而這時兩個應(yīng)用還要必須使用相同的證書簽署。
Android為每個應(yīng)用都分配了一個獨立的虛擬機(VM)闽烙,確切說是為每個進程都分配了一個獨立的虛擬機翅睛,不同的虛擬機在內(nèi)存分配上有不同的地址空間,這樣在不同的虛擬機(即進程)中訪問同一個類的對象時就會產(chǎn)生多份副本黑竞,而這些副本之間也是相互獨立捕发,互不影響的。所以當一個應(yīng)用中運行在不同進程的四大組件很魂,只要它們之間需要通過內(nèi)存來共享數(shù)據(jù)扎酷,都會共享失敗,因為它們共享的數(shù)據(jù)都是它們各自所在進程分配的內(nèi)存中的數(shù)據(jù)遏匆,這也是不同進程需要用特殊的方式來進行通信的原因法挨。
當應(yīng)用內(nèi)骤铃,一個組件需要跑在一個新的進程中時,由于系統(tǒng)需要在創(chuàng)建新的進程同時分配獨立的虛擬機坷剧,所以這個過程其實就是啟動一個應(yīng)用的過程惰爬,啟動時自然會創(chuàng)建一個新的Application,所以運行在不同進程中的組件是屬于不用的虛擬機和Application的惫企∷呵疲總結(jié)一下可以這么說,在多進程模式中狞尔,不同進程的組件會擁有相互獨立的虛擬機丛版、Application和內(nèi)存空間。
所以我們可以更簡單的理解同一個應(yīng)用間的多進程:兩個不同的應(yīng)用使用相同的 UID 來共享資源文件(data目錄偏序、組件信息等)页畦;
通過以上的分析,關(guān)于 應(yīng)用研儒、進程豫缨、虛擬機之間的關(guān)系可以更加明了:
- 一個應(yīng)用可以有多個進程,所以會有多個虛擬機端朵,也就會有多塊內(nèi)存空間好芭。
- 一個進程可以屬于多個應(yīng)用,多個應(yīng)用可以共用同一個虛擬機冲呢,所以可以共用同一塊內(nèi)存空間舍败。
今天在這兒談一下自己對多進程的理解,由于自身經(jīng)驗有限敬拓,如果有不對的地方還請大神指正邻薯!