如何理解Android的多進(jìn)程

平時的工作中,有時會遇到多進(jìn)程編程,也會涉及到多進(jìn)程之間的通信,那么Android的多進(jìn)程到底是怎么回事,該如何理解Android的多進(jìn)程呢?
在讀本篇文章之前還需要明確一點,這兒說的多進(jìn)程是指一個應(yīng)用中存在多個進(jìn)程的情況。而在理解Android多進(jìn)程之前,先來介紹一些簡單的概念。

區(qū)分線程與進(jìn)程的概念

根據(jù)所查資料,先分別介紹下它們的概念:

  • 進(jìn)程:是一個具有獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運(yùn)行活動。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位。可以申請和擁有系統(tǒng)資源,是一個動態(tài)的概念,是一個活動的實體,是一個“執(zhí)行中的程序”。不只是程序的代碼,還包括當(dāng)前的活動。
  • 線程:線程是進(jìn)程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨立運(yùn)行的基本單位。線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對它的調(diào)度所用資源小,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度。

簡單的來說就是:進(jìn)程包含線程,同時一個進(jìn)程可以包含多個線程。
Android沿用了Java的線程模式,線程分為主線程和子線程,而在Java中默認(rèn)情況下一個進(jìn)程只有一個線程,即主線程。主線程又叫UI線程,主要用于處理界面交互相關(guān)的邏輯,而用戶隨時都會和界面發(fā)生交互,因此主線程在任何時候都必須有較高的響應(yīng)速度,這就要求主線程中不能執(zhí)行耗時的任務(wù),否則會有界面卡頓現(xiàn)象甚至造成界面無法響應(yīng)(ANR),因此耗時操作就由子線程來執(zhí)行。
到這兒有關(guān)線程和進(jìn)程的基本概念就介紹完了,下面我們來步入今天正題:

理解Android的多進(jìn)程

我們都應(yīng)該知道當(dāng)應(yīng)用安裝到設(shè)備后都運(yùn)行在自己的安全沙箱內(nèi):

  • Android 操作系統(tǒng)是一種多用戶 Linux 系統(tǒng),其中的每個應(yīng)用都是一個不同的用戶;
  • 默認(rèn)情況下,系統(tǒng)會為每個應(yīng)用分配一個唯一的 Linux 用戶 ID(該 ID 僅由系統(tǒng)使用,應(yīng)用并不知曉)。系統(tǒng)為應(yīng)用中的所有文件設(shè)置權(quán)限,使得只有分配給該應(yīng)用的用戶 ID 才能訪問這些文件;
  • 每個進(jìn)程都具有自己的虛擬機(jī) (VM),因此應(yīng)用代碼是在與其他應(yīng)用隔離的環(huán)境中運(yùn)行;
  • 默認(rèn)情況下,每個應(yīng)用都在其自己的 Linux 進(jìn)程內(nèi)運(yùn)行。Android 會在需要執(zhí)行任何應(yīng)用組件時啟動該進(jìn)程,然后在不再需要該進(jìn)程或系統(tǒng)必須為其他應(yīng)用恢復(fù)內(nèi)存時關(guān)閉該進(jìn)程。

Android 系統(tǒng)通過這種方式實現(xiàn)最小權(quán)限原則。也就是說,默認(rè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 進(jìn)程中運(yùn)行,并共享同一 VM,而這時兩個應(yīng)用還要必須使用相同的證書簽署。

Android為每個應(yīng)用都分配了一個獨立的虛擬機(jī)(VM),確切說是為每個進(jìn)程都分配了一個獨立的虛擬機(jī),不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間,這樣在不同的虛擬機(jī)(即進(jìn)程)中訪問同一個類的對象時就會產(chǎn)生多份副本,而這些副本之間也是相互獨立,互不影響的。所以當(dāng)一個應(yīng)用中運(yùn)行在不同進(jìn)程的四大組件,只要它們之間需要通過內(nèi)存來共享數(shù)據(jù),都會共享失敗,因為它們共享的數(shù)據(jù)都是它們各自所在進(jìn)程分配的內(nèi)存中的數(shù)據(jù),這也是不同進(jìn)程需要用特殊的方式來進(jìn)行通信的原因。
當(dāng)應(yīng)用內(nèi),一個組件需要跑在一個新的進(jìn)程中時,由于系統(tǒng)需要在創(chuàng)建新的進(jìn)程同時分配獨立的虛擬機(jī),所以這個過程其實就是啟動一個應(yīng)用的過程,啟動時自然會創(chuàng)建一個新的Application,所以運(yùn)行在不同進(jìn)程中的組件是屬于不用的虛擬機(jī)和Application的??偨Y(jié)一下可以這么說,在多進(jìn)程模式中,不同進(jìn)程的組件會擁有相互獨立的虛擬機(jī)、Application和內(nèi)存空間。
所以我們可以更簡單的理解同一個應(yīng)用間的多進(jìn)程:兩個不同的應(yīng)用使用相同的 UID 來共享資源文件(data目錄、組件信息等);

通過以上的分析,關(guān)于 應(yīng)用、進(jìn)程、虛擬機(jī)之間的關(guān)系可以更加明了:

  1. 一個應(yīng)用可以有多個進(jìn)程,所以會有多個虛擬機(jī),也就會有多塊內(nèi)存空間。
  2. 一個進(jìn)程可以屬于多個應(yīng)用,多個應(yīng)用可以共用同一個虛擬機(jī),所以可以共用同一塊內(nèi)存空間。

今天在這兒談一下自己對多進(jìn)程的理解,由于自身經(jīng)驗有限,如果有不對的地方還請大神指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容