進程
是系統(tǒng)資源物理空間分配的獨立單元
-
進程是程序的一次執(zhí)行過程。若程序執(zhí)行兩次甚至多次,則需要兩個甚至多個進程。
-
進程是是正在運行程序的抽象。它代表運行的CPU,也稱進程是對CPU的抽象。(虛擬技- - 術(shù)的支持,將一個CPU變幻為多個虛擬的CPU)
-
系統(tǒng)資源(如內(nèi)存、文件)以進程為單位分配。
-
操作系統(tǒng)為每個進程分配了獨立的地址空間
-
操作系統(tǒng)通過“調(diào)度”把控制權(quán)交給進程。
線程
是cpu調(diào)度的基本單元
-
在一個進程內(nèi)也需要并行執(zhí)行多個程序,實現(xiàn)不同的功能。
-
進程切換的代價、開銷比較大;
-
在進程內(nèi)創(chuàng)建、終止線程比創(chuàng)建、終止進程要快。同一進程內(nèi)的線程間切換比進程-間的切換要快,尤其是用戶級線程間的切換。線程之間相互通信無須通過內(nèi)核(同一進程內(nèi)的線程共享內(nèi)存和文件)
進程與線程區(qū)別
定義方面:進程是程序在某個數(shù)據(jù)集合上的一次運行活動;線程是進程中的一個執(zhí)行路徑。(進程可以創(chuàng)建多個線程)
角色方面:在支持線程機制的系統(tǒng)中,進程是系統(tǒng)資源分配的單位,線程是CPU調(diào)度的單位。
資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針,程序計數(shù)器等寄存器。
獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴于進程而存在。
開銷方面。進程切換的開銷較大。線程相對較小。(前面也提到過,引入線程也出于了開銷的考慮。)
進程間通信
為了解決進程見通信的問題,android采用binder機制實現(xiàn)IPC(Inter-Process Communication)
binder機制如圖:

binder.png
client通過binder驅(qū)動,在sm中找到server的注冊,通過與注冊類(可能就是代理類)的通信,實現(xiàn)和server的通信。
舉例:
android四大組件的底層通信機制都是基于Binder的。
client端和server是根據(jù)消息的發(fā)送和接收方不同,隨時在改變。
一下是我的猜測,可能不準(zhǔn)確。
以activity跳轉(zhuǎn)為例:
首先activity1要告訴ams我要進行跳轉(zhuǎn)了,跳轉(zhuǎn)的目的地是activity2。
- client:activity1;
- sm:ServerManager
- server:ActivityManagerService
- 代理類:ActivityManagerProxy
- ams接到消息后,會告訴activity1我知道了
- client:ActivityManagerService
- sm:ServerManager
- server:activity1
- 代理類:ApplicationThreadProxy
android系統(tǒng)在啟動的時候,本地的系統(tǒng)服務(wù)(SystemServer)都會注冊到ServerManager上。 我們常見的ActivityManagerServer、PackageManagerServer都屬于SystemServer