成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

02.Android之IPC機(jī)制問(wèn)題

Donne / 1493人閱讀

摘要:中為何新增來(lái)作為主要的方式運(yùn)行機(jī)制是怎樣的機(jī)制有什么優(yōu)勢(shì)運(yùn)行機(jī)制是怎樣的基于通信模式,除了端和端,還有兩角色一起合作完成進(jìn)程間通信功能。

目錄介紹

2.0.0.1 什么是Binder?為什么要使用Binder?Binder中是如何進(jìn)行線程管理的?總結(jié)binder講的是什么?

2.0.0.2 Android中進(jìn)程和線程的關(guān)系?什么是IPC?為何需要進(jìn)行IPC?多進(jìn)程通信可能會(huì)出現(xiàn)什么問(wèn)題?

2.0.0.3 Binder的工作流程是怎樣的?Binder主要能提供哪些功能?Binder通信機(jī)制原理是怎樣的?

2.0.0.4 Android中為何新增Binder來(lái)作為主要的IPC方式?Binder運(yùn)行機(jī)制是怎樣的?Binder機(jī)制有什么優(yōu)勢(shì)?

2.0.0.5 Android中跨進(jìn)程通訊的幾種方式?實(shí)際開(kāi)發(fā)中,有哪些場(chǎng)景使用Binder進(jìn)行數(shù)據(jù)傳輸?

2.0.0.6 Android中有哪些基于Binder的IPC方式?簡(jiǎn)單對(duì)比下?

2.0.0.7 為何說(shuō)Binder相比傳統(tǒng)的Socket性能更高效?為何說(shuō)Binder相比傳統(tǒng)IPC安全性更高?

2.0.0.8 Service Manager是如何成為一個(gè)守護(hù)進(jìn)程的?Server和Client是如何獲得Service Manager接口的?

好消息

博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開(kāi)發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長(zhǎng)期更新維護(hù)并且修正,持續(xù)完善……開(kāi)源的文件是markdown格式的!同時(shí)也開(kāi)源了生活博客,從12年起,積累共計(jì)500篇[近100萬(wàn)字],將會(huì)陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請(qǐng)注明出處,謝謝!

鏈接地址:https://github.com/yangchong2...

如果覺(jué)得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬(wàn)事起于忽微,量變引起質(zhì)變!所有的筆記將會(huì)更新到GitHub上,同時(shí)保持更新,歡迎同行提出或者push不同的看法或者筆記!

2.0.0.1 什么是Binder?為什么要使用Binder?Binder中是如何進(jìn)行線程管理的?總結(jié)binder講的是什么?

什么是Binder?

1.直觀來(lái)說(shuō),Binder是Android中的一個(gè)類,它繼承了IBinder接口

2.從IPC角度來(lái)說(shuō),Binder是Android中的一種跨進(jìn)程通信方式,Binder還可以理解為一種虛擬的物理設(shè)備,它的設(shè)備驅(qū)動(dòng)是/dev/binder,該通信方式在linux中沒(méi)有

3.從Android Framework角度來(lái)說(shuō),Binder是ServiceManager連接各種Manager(ActivityManager、WindowManager,etc)和相應(yīng)ManagerService的橋梁

4.從Android應(yīng)用層來(lái)說(shuō),Binder是客戶端和服務(wù)端進(jìn)行通信的媒介,當(dāng)你bindService的時(shí)候,服務(wù)端會(huì)返回一個(gè)包含了服務(wù)端業(yè)務(wù)調(diào)用的Binder對(duì)象,通過(guò)這個(gè)Binder對(duì)象,客戶端就可以獲取服務(wù)端提供的服務(wù)或者數(shù)據(jù),這里的服務(wù)包括普通服務(wù)和基于AIDL的服務(wù)。

為什么要使用Binder?技術(shù)博客大總結(jié)

在傳統(tǒng)的Linux上,我們還是有很多選擇可以用來(lái)實(shí)現(xiàn)進(jìn)程間通信,如管道、SystemV、Socket等。那么Android為什么不使用這些原有的技術(shù),而是要使開(kāi)發(fā)一種新的叫Binder的進(jìn)程間通信機(jī)制呢?

最簡(jiǎn)單的回答:性能:相比傳統(tǒng)的Socket更高效;安全:安全性高,支持通信雙方進(jìn)行身份驗(yàn)證。

詳細(xì)一點(diǎn)說(shuō),主要有兩個(gè)方面的原因:

性能方面

在移動(dòng)設(shè)備上(性能受限制的設(shè)備,比如要省電),廣泛地使用跨進(jìn)程通信對(duì)通信機(jī)制的性能有嚴(yán)格的要求,Binder相對(duì)出傳統(tǒng)的Socket方式,更加高效。Binder數(shù)據(jù)拷貝只需要一次,而管道、消息隊(duì)列、Socket都需要2次,共享內(nèi)存方式一次內(nèi)存拷貝都不需要,但實(shí)現(xiàn)方式又比較復(fù)雜。

安全方面

傳統(tǒng)的進(jìn)程通信方式對(duì)于通信雙方的身份并沒(méi)有做出嚴(yán)格的驗(yàn)證,比如Socket通信ip地址是客戶端手動(dòng)填入,很容易進(jìn)行偽造,而B(niǎo)inder機(jī)制從協(xié)議本身就支持對(duì)通信雙方做身份校檢,因而大大提升了安全性。

還有一些好處,如實(shí)現(xiàn)面象對(duì)象的調(diào)用方式,在使用Binder時(shí)就和調(diào)用一個(gè)本地實(shí)例一樣。

Binder中是如何進(jìn)行線程管理的?

每個(gè)Binder的Server進(jìn)程會(huì)創(chuàng)建很多線程來(lái)處理Binder請(qǐng)求,可以簡(jiǎn)單的理解為創(chuàng)建了一個(gè)Binder的線程池吧(雖然實(shí)際上并不完全是這樣簡(jiǎn)單的線程管理方式),而真正管理這些線程并不是由這個(gè)Server端來(lái)管理的,而是由Binder驅(qū)動(dòng)進(jìn)行管理的。

一個(gè)進(jìn)程的Binder線程數(shù)默認(rèn)最大是16,超過(guò)的請(qǐng)求會(huì)被阻塞等待空閑的Binder線程。理解這一點(diǎn)的話,你做進(jìn)程間通信時(shí)處理并發(fā)問(wèn)題就會(huì)有一個(gè)底,比如使用ContentProvider時(shí)(又一個(gè)使用Binder機(jī)制的組件),你就很清楚它的CRUD(創(chuàng)建、檢索、更新和刪除)方法只能同時(shí)有16個(gè)線程在跑。

總結(jié)binder講的是什么?

通常意義上來(lái)說(shuō),Binder就是指Andriod的通信機(jī)制;

對(duì)于服務(wù)端進(jìn)程來(lái)說(shuō),Binder指的是Binder本地對(duì)象,對(duì)于客戶端進(jìn)程來(lái)說(shuō),Binder指的是Binder代理對(duì)象。

對(duì)于傳輸過(guò)程來(lái)說(shuō),Binder是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象;

2.0.0.2 Android中進(jìn)程和線程的關(guān)系?什么是IPC?為何需要進(jìn)行IPC?多進(jìn)程通信可能會(huì)出現(xiàn)什么問(wèn)題?

Android中進(jìn)程和線程的關(guān)系?

一個(gè)APP一般對(duì)應(yīng)一個(gè)進(jìn)程和有限個(gè)線程

一般對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)然,可以在AndroidMenifest中給四大組件指定屬性android:process開(kāi)啟多進(jìn)程模式

有限個(gè)線程:線程是一種受限的系統(tǒng)資源,不可無(wú)限制的產(chǎn)生且線程的創(chuàng)建和銷毀都有一定的開(kāi)銷。

什么是IPC?

為何需要進(jìn)行IPC?

進(jìn)程間通信的必要性

所有運(yùn)行在不同進(jìn)程的四大組件,只要它們之間需要通過(guò)內(nèi)存在共享數(shù)據(jù),都會(huì)共享失敗。這是由于Android為每個(gè)應(yīng)用分配了獨(dú)立的虛擬機(jī),不同的虛擬機(jī)在內(nèi)存分配上有不同的地址空間,這會(huì)導(dǎo)致在不同的虛擬機(jī)中訪問(wèn)同一個(gè)類的對(duì)象會(huì)產(chǎn)生多份副本。技術(shù)博客大總結(jié)

多進(jìn)程造成的影響可總結(jié)為以下四方面

靜態(tài)變量和單例模式失效:由獨(dú)立的虛擬機(jī)造成

線程同步機(jī)制失效:由獨(dú)立的虛擬機(jī)造成

SharedPreference的不可靠下降:不支持兩個(gè)進(jìn)程同時(shí)進(jìn)行讀寫(xiě)操作,即不支持并發(fā)讀寫(xiě),有一定幾率導(dǎo)致數(shù)據(jù)丟失

Application多次創(chuàng)建:Android系統(tǒng)會(huì)為新的進(jìn)程分配獨(dú)立虛擬機(jī),相當(dāng)于系統(tǒng)又把這個(gè)應(yīng)用重新啟動(dòng)了一次。

2.0.0.3 Binder的工作流程是怎樣的?Binder主要能提供哪些功能?Binder通信機(jī)制原理是怎樣的?

Binder的工作流程是怎樣的?

1客戶端首先獲取服務(wù)器端的代理對(duì)象。所謂的代理對(duì)象實(shí)際上就是在客戶端建立一個(gè)服務(wù)端的“引用”,該代理對(duì)象具有服務(wù)端的功能,使其在客戶端訪問(wèn)服務(wù)端的方法就像訪問(wèn)本地方法一樣。

2客戶端通過(guò)調(diào)用服務(wù)器代理對(duì)象的方式向服務(wù)器端發(fā)送請(qǐng)求。

3代理對(duì)象將用戶請(qǐng)求通過(guò)Binder驅(qū)動(dòng)發(fā)送到服務(wù)器進(jìn)程。

4服務(wù)器進(jìn)程處理用戶請(qǐng)求,并通過(guò)Binder驅(qū)動(dòng)返回處理結(jié)果給客戶端的服務(wù)器代理對(duì)象。

5客戶端收到服務(wù)端的返回結(jié)果。

binder工作流程圖如下所示:

Binder主要能提供哪些功能?

用驅(qū)動(dòng)程序來(lái)推進(jìn)進(jìn)程間的通信。

通過(guò)共享內(nèi)存來(lái)提高性能。

為進(jìn)程請(qǐng)求分配每個(gè)進(jìn)程的線程池。

針對(duì)系統(tǒng)中的對(duì)象引入了引用計(jì)數(shù)和跨進(jìn)程的對(duì)象引用映射。

進(jìn)程間同步調(diào)用。

Binder通信機(jī)制原理是怎樣的?

Server進(jìn)程向ServiceManager注冊(cè),告訴ServiceManager我是誰(shuí),我有什么,我能做什么。就好比徐同學(xué)(Server進(jìn)程)有一臺(tái)筆記本(computer對(duì)象),這臺(tái)筆記本有個(gè)add方法。這時(shí)映射關(guān)系表就生成了。技術(shù)博客大總結(jié)

Client進(jìn)程向ServiceManager查詢,我要調(diào)用Server進(jìn)程的computer對(duì)象的add方法,可以看到這個(gè)過(guò)程經(jīng)過(guò)Binder驅(qū)動(dòng),這時(shí)候Binder驅(qū)動(dòng)就開(kāi)始發(fā)揮他的作用了。當(dāng)向ServiceManager查詢完畢,是返回一個(gè)computer對(duì)象給Client進(jìn)程嗎?其實(shí)不然,Binder驅(qū)動(dòng)將computer對(duì)象轉(zhuǎn)換成了computerProxy對(duì)象,并轉(zhuǎn)發(fā)給了Client進(jìn)程,因此,Client進(jìn)程拿到的并不是真實(shí)的computer對(duì)象,而是一個(gè)代理對(duì)象,即computerProxy對(duì)象。很容易理解這個(gè)computerProxy對(duì)象也是有add方法,(如果連add方法都沒(méi)有,豈不是欺騙了Client?),但是這個(gè)add方法只是對(duì)參數(shù)進(jìn)行一些包裝而已。

當(dāng)Client進(jìn)程調(diào)用add方法,這個(gè)消息發(fā)送給Binder驅(qū)動(dòng),這時(shí)驅(qū)動(dòng)發(fā)現(xiàn),原來(lái)是computerProxy,那么Client進(jìn)程應(yīng)該是需要調(diào)用computer對(duì)象的add方法的,這時(shí)驅(qū)動(dòng)通知Server進(jìn)程,調(diào)用你的computer對(duì)象的add方法,將結(jié)果給我。然后Server進(jìn)程就將計(jì)算結(jié)果發(fā)送給驅(qū)動(dòng),驅(qū)動(dòng)再轉(zhuǎn)發(fā)給Client進(jìn)程,這時(shí)Client進(jìn)程還蒙在了鼓里,他以為自己調(diào)用的是真實(shí)的computer對(duì)象的add方法,其實(shí)他只是調(diào)用了代理而已。不過(guò)Client最終還是拿到了計(jì)算結(jié)果。

2.0.0.4 Android中為何新增Binder來(lái)作為主要的IPC方式?Binder運(yùn)行機(jī)制是怎樣的?Binder機(jī)制有什么優(yōu)勢(shì)?

Binder運(yùn)行機(jī)制是怎樣的?

Binder基于Client-Server通信模式,除了Client端和Server端,還有兩角色一起合作完成進(jìn)程間通信功能。

Binder通信的四個(gè)角色:

Client進(jìn)程:使用服務(wù)的進(jìn)程。

Server進(jìn)程:提供服務(wù)的進(jìn)程。

ServiceManager進(jìn)程:ServiceManager的作用是將字符形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的引用,使得Client能夠通過(guò)Binder名字獲得對(duì)Server中Binder實(shí)體的引用。

Binder驅(qū)動(dòng):驅(qū)動(dòng)負(fù)責(zé)進(jìn)程之間Binder通信的建立,Binder在進(jìn)程之間的傳遞,Binder引用計(jì)數(shù)管理,數(shù)據(jù)包在進(jìn)程之間的傳遞和交互等一系列底層支持。

接觸這些概念可能會(huì)覺(jué)得難于理解,讀者可以把四個(gè)角色和熟悉的互聯(lián)網(wǎng)進(jìn)行類比:Server是服務(wù)器,Client是客戶終端,ServiceManager是域名服務(wù)器(DNS),驅(qū)動(dòng)是路由器。

Binder機(jī)制有什么優(yōu)勢(shì)

傳輸效率高、可操作性強(qiáng):傳輸效率主要影響因素是內(nèi)存拷貝的次數(shù),拷貝次數(shù)越少,傳輸速率越高。從Android進(jìn)程架構(gòu)角度分析:對(duì)于消息隊(duì)列、Socket和管道來(lái)說(shuō),數(shù)據(jù)先從發(fā)送方的緩存區(qū)拷貝到內(nèi)核開(kāi)辟的緩存區(qū)中,再?gòu)膬?nèi)核緩存區(qū)拷貝到接收方的緩存區(qū),一共兩次拷貝

技術(shù)博客大總結(jié)

對(duì)于Binder來(lái)說(shuō),數(shù)據(jù)從發(fā)送方的緩存區(qū)拷貝到內(nèi)核的緩存區(qū),而接收方的緩存區(qū)與內(nèi)核的緩存區(qū)是映射到同一塊物理地址的,節(jié)省了一次數(shù)據(jù)拷貝的過(guò)程

由于共享內(nèi)存操作復(fù)雜,綜合來(lái)看,Binder的傳輸效率是最好的。

實(shí)現(xiàn)C/S架構(gòu)方便:Linux的眾IPC方式除了Socket以外都不是基于C/S架構(gòu),而Socket主要用于網(wǎng)絡(luò)間的通信且傳輸效率較低。Binder基于C/S架構(gòu) ,Server端與Client端相對(duì)獨(dú)立,穩(wěn)定性較好。

安全性高:傳統(tǒng)Linux IPC的接收方無(wú)法獲得對(duì)方進(jìn)程可靠的UID/PID,從而無(wú)法鑒別對(duì)方身份;而B(niǎo)inder機(jī)制為每個(gè)進(jìn)程分配了UID/PID且在Binder通信時(shí)會(huì)根據(jù)UID/PID進(jìn)行有效性檢測(cè)。

2.0.0.5 Android中跨進(jìn)程通訊的幾種方式?實(shí)際開(kāi)發(fā)中,有哪些場(chǎng)景使用Binder進(jìn)行數(shù)據(jù)傳輸?

Android中跨進(jìn)程通訊的幾種方式?

Android 跨進(jìn)程通信,像intent,contentProvider,廣播,service都可以跨進(jìn)程通信。

intent:這種跨進(jìn)程方式并不是訪問(wèn)內(nèi)存的形式,它需要傳遞一個(gè)uri,比如說(shuō)打電話。

contentProvider:這種形式,是使用數(shù)據(jù)共享的形式進(jìn)行數(shù)據(jù)共享。

service:遠(yuǎn)程服務(wù),aidl

廣播技術(shù)博客大總結(jié)

實(shí)際開(kāi)發(fā)中,有哪些場(chǎng)景使用Binder進(jìn)行數(shù)據(jù)傳輸?

通過(guò)AIDL實(shí)現(xiàn)方式解釋Binder數(shù)據(jù)傳輸?shù)木唧w過(guò)程

服務(wù)端中的Service給與其綁定的客戶端提供Binder對(duì)象,客戶端通過(guò)AIDL接口中的asInterface()將這個(gè)Binder對(duì)象轉(zhuǎn)換為代理Proxy,并通過(guò)它發(fā)起RPC請(qǐng)求??蛻舳税l(fā)起請(qǐng)求時(shí)會(huì)掛起當(dāng)前線程,并將參數(shù)寫(xiě)入data然后調(diào)用transact(),RPC請(qǐng)求會(huì)通過(guò)系統(tǒng)底層封裝后由服務(wù)端的onTransact()處理,并將結(jié)果寫(xiě)入reply,最后返回調(diào)用結(jié)果并喚醒客戶端線程。

AIDL原理是什么?如何優(yōu)化多模塊都使用AIDL的情況?

AIDL(Android Interface Definition Language,Android接口定義語(yǔ)言):如果在一個(gè)進(jìn)程中要調(diào)用另一個(gè)進(jìn)程中對(duì)象的方法,可使用AIDL生成可序列化的參數(shù),AIDL會(huì)生成一個(gè)服務(wù)端對(duì)象的代理類,通過(guò)它客戶端實(shí)現(xiàn)間接調(diào)用服務(wù)端對(duì)象的方法。

AIDL的本質(zhì)是系統(tǒng)提供了一套可快速實(shí)現(xiàn)Binder的工具。關(guān)鍵類和方法:

AIDL接口:繼承IInterface。
Stub類:Binder的實(shí)現(xiàn)類,服務(wù)端通過(guò)這個(gè)類來(lái)提供服務(wù)。
Proxy類:服務(wù)器的本地代理,客戶端通過(guò)這個(gè)類調(diào)用服務(wù)器的方法。
asInterface():客戶端調(diào)用,將服務(wù)端的返回的Binder對(duì)象,轉(zhuǎn)換成客戶端所需要的AIDL接口類型對(duì)象。返回對(duì)象:
    若客戶端和服務(wù)端位于同一進(jìn)程,則直接返回Stub對(duì)象本身;
    否則,返回的是系統(tǒng)封裝后的Stub.proxy對(duì)象。
asBinder():根據(jù)當(dāng)前調(diào)用情況返回代理Proxy的Binder對(duì)象。
onTransact():運(yùn)行服務(wù)端的Binder線程池中,當(dāng)客戶端發(fā)起跨進(jìn)程請(qǐng)求時(shí),遠(yuǎn)程請(qǐng)求會(huì)通過(guò)系統(tǒng)底層封裝后交由此方法來(lái)處理。
transact():運(yùn)行在客戶端,當(dāng)客戶端發(fā)起遠(yuǎn)程請(qǐng)求的同時(shí)將當(dāng)前線程掛起。之后調(diào)用服務(wù)端的onTransact()直到遠(yuǎn)程請(qǐng)求返回,當(dāng)前線程才繼續(xù)執(zhí)行。

當(dāng)有多個(gè)業(yè)務(wù)模塊都需要AIDL來(lái)進(jìn)行IPC,此時(shí)需要為每個(gè)模塊創(chuàng)建特定的aidl文件,那么相應(yīng)的Service就會(huì)很多。必然會(huì)現(xiàn)系統(tǒng)資源耗費(fèi)嚴(yán)重、應(yīng)用過(guò)度重量級(jí)的問(wèn)題。解決辦法是建立Binder連接池,即將每個(gè)業(yè)務(wù)模塊的Binder請(qǐng)求統(tǒng)一轉(zhuǎn)發(fā)到一個(gè)遠(yuǎn)Service中去執(zhí)行,從而避免重復(fù)創(chuàng)建Service。

工作原理:每個(gè)業(yè)務(wù)模塊創(chuàng)建自己的AIDL接口并實(shí)現(xiàn)此接口,然后向服務(wù)端提供自己的唯一標(biāo)識(shí)和其對(duì)應(yīng)的Binder對(duì)象。服務(wù)端只需要一個(gè)Service,服務(wù)器提供一個(gè)queryBinder接口,它會(huì)根據(jù)業(yè)務(wù)模塊的特征來(lái)返回相應(yīng)的Binder對(duì)像,不同的業(yè)務(wù)模塊拿到所需的Binder對(duì)象后就可進(jìn)行遠(yuǎn)程方法的調(diào)用了。

2.0.0.6 Android中有哪些基于Binder的IPC方式?簡(jiǎn)單對(duì)比下?

2.0.0.7 為何說(shuō)Binder相比傳統(tǒng)的Socket性能更高效?為何說(shuō)Binder相比傳統(tǒng)IPC安全性更高?

為何說(shuō)Binder相比傳統(tǒng)的Socket性能更高效?

跨進(jìn)程通訊中,只有socket支持Client-Server的通信方式,但是socket作為一款通用接口,其傳輸效率低,開(kāi)銷大,主要用在跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。

消息隊(duì)列和管道采用存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開(kāi)辟的緩存區(qū)中,然后再?gòu)膬?nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝過(guò)程。

共享內(nèi)存雖然無(wú)需拷貝,但控制復(fù)雜,難以使用。

為何說(shuō)Binder相比傳統(tǒng)IPC安全性更高?

首先傳統(tǒng)IPC的接收方無(wú)法獲得對(duì)方進(jìn)程可靠的UID和PID(用戶ID進(jìn)程ID),從而無(wú)法鑒別對(duì)方身份。Android為每個(gè)安裝好的應(yīng)用程序分配了自己的UID,故進(jìn)程的UID是鑒別進(jìn)程身份的重要標(biāo)志。使用傳統(tǒng)IPC只能由用戶在數(shù)據(jù)包里填入U(xiǎn)ID和PID,但這樣不可靠,容易被惡意程序利用??煽康纳矸輼?biāo)記只有由IPC機(jī)制本身在內(nèi)核中添加。其次傳統(tǒng)IPC訪問(wèn)接入點(diǎn)是開(kāi)放的,無(wú)法建立私有通道。比如命名管道的名稱,systemV的鍵值,socket的ip地址或文件名都是開(kāi)放的,只要知道這些接入點(diǎn)的程序都可以和對(duì)端建立連接,不管怎樣都無(wú)法阻止惡意程序通過(guò)猜測(cè)接收方地址獲得連接。

基于以上原因,Android需要建立一套新的IPC機(jī)制來(lái)滿足系統(tǒng)對(duì)通信方式,傳輸性能和安全性的要求,這就是Binder。

Binder基于Client-Server通信模式,傳輸過(guò)程只需一次拷貝,為發(fā)送發(fā)添加UID/PID身份,既支持實(shí)名Binder也支持匿名Binder,安全性高。技術(shù)博客大總結(jié)

2.0.0.8 Service Manager是如何成為一個(gè)守護(hù)進(jìn)程的?Server和Client是如何獲得Service Manager接口的?

Service Manager是如何成為一個(gè)守護(hù)進(jìn)程的?

Service Manager,它是整個(gè)Binder機(jī)制的守護(hù)進(jìn)程,用來(lái)管理開(kāi)發(fā)者創(chuàng)建的各種Server,并且向Client提供查詢Server遠(yuǎn)程接口的功能技術(shù)博客大總結(jié)

既然Service Manager組件是用來(lái)管理Server并且向Client提供查詢Server遠(yuǎn)程接口的功能,那么,Service Manager就必然要和Server以及Client進(jìn)行通信了。我們知道,Service Manger、Client和Server三者分別是運(yùn)行在獨(dú)立的進(jìn)程當(dāng)中,這樣它們之間的通信也屬于進(jìn)程間通信了,而且也是采用Binder機(jī)制進(jìn)行進(jìn)程間通信,因此,Service Manager在充當(dāng)Binder機(jī)制的守護(hù)進(jìn)程的角色的同時(shí),也在充當(dāng)Server的角色,然而,它是一種特殊的Server,下面我們將會(huì)看到它的特殊之處

Service Manager在用戶空間的源代碼位于frameworks/base/cmds/servicemanager目錄下,主要是由binder.h、binder.c和service_manager.c三個(gè)文件組成。Service Manager的入口位于service_manager.c文件中的main函數(shù):

int main(int argc, char **argv){
    struct binder_state *bs;
    void *svcmgr = BINDER_SERVICE_MANAGER;
    bs = binder_open(128*1024);
    if (binder_become_context_manager(bs)) {
        LOGE("cannot become context manager (%s)
", strerror(errno));
        return -1;
    }
    svcmgr_handle = svcmgr;
    binder_loop(bs, svcmgr_handler);
    return 0;
}

main函數(shù)主要有三個(gè)功能:一是打開(kāi)Binder設(shè)備文件;二是告訴Binder驅(qū)動(dòng)程序自己是Binder上下文管理者,即我們前面所說(shuō)的守護(hù)進(jìn)程;三是進(jìn)入一個(gè)無(wú)窮循環(huán),充當(dāng)Server的角色,等待Client的請(qǐng)求

Server和Client是如何獲得Service Manager接口的?

ServiceManager作為守護(hù)進(jìn)程,Service Manager的職責(zé)當(dāng)然就是為Server和Client服務(wù)了。那么,Server和Client如何獲得Service Manager接口,進(jìn)而享受它提供的服務(wù)呢?

Service Manager在Binder機(jī)制中既充當(dāng)守護(hù)進(jìn)程的角色,同時(shí)它也充當(dāng)著Server角色,然而它又與一般的Server不一樣。對(duì)于普通的Server來(lái)說(shuō),Client如果想要獲得Server的遠(yuǎn)程接口,那么必須通過(guò)Service Manager遠(yuǎn)程接口提供的getService接口來(lái)獲得,這本身就是一個(gè)使用Binder機(jī)制來(lái)進(jìn)行進(jìn)程間通信的過(guò)程。而對(duì)于Service Manager這個(gè)Server來(lái)說(shuō),Client如果想要獲得Service Manager遠(yuǎn)程接口,卻不必通過(guò)進(jìn)程間通信機(jī)制來(lái)獲得,因?yàn)镾ervice Manager遠(yuǎn)程接口是一個(gè)特殊的Binder引用,它的引用句柄一定是0。

經(jīng)過(guò)一系列的調(diào)用...

回到defaultServiceManager函數(shù)中,最終結(jié)果為:gDefaultServiceManager = new BpServiceManager(new BpBinder(0));

這樣,Service Manager遠(yuǎn)程接口就創(chuàng)建完成了,它本質(zhì)上是一個(gè)BpServiceManager,包含了一個(gè)句柄值為0的Binder引用。技術(shù)博客大總結(jié)

在Android系統(tǒng)的Binder機(jī)制中,Server和Client拿到這個(gè)Service Manager遠(yuǎn)程接口之后怎么用呢?

對(duì)Server來(lái)說(shuō),就是調(diào)用IServiceManager::addService這個(gè)接口來(lái)和Binder驅(qū)動(dòng)程序交互了,即調(diào)用BpServiceManager::addService 。而B(niǎo)pServiceManager::addService又會(huì)調(diào)用通過(guò)其基類BpRefBase的成員函數(shù)remote獲得原先創(chuàng)建的BpBinder實(shí)例,接著調(diào)用BpBinder::transact成員函數(shù)。在BpBinder::transact函數(shù)中,又會(huì)調(diào)用IPCThreadState::transact成員函數(shù),這里就是最終與Binder驅(qū)動(dòng)程序交互的地方了?;貞浺幌虑懊娴念悎D,IPCThreadState有一個(gè)PorcessState類型的成中變量mProcess,而mProcess有一個(gè)成員變量mDriverFD,它是設(shè)備文件/dev/binder的打開(kāi)文件描述符,因此,IPCThreadState就相當(dāng)于間接在擁有了設(shè)備文件/dev/binder的打開(kāi)文件描述符,于是,便可以與Binder驅(qū)動(dòng)程序交互了。

對(duì)Client來(lái)說(shuō),就是調(diào)用IServiceManager::getService這個(gè)接口來(lái)和Binder驅(qū)動(dòng)程序交互了。具體過(guò)程上述Server使用Service Manager的方法是差不多的。

關(guān)于其他內(nèi)容介紹 01.關(guān)于博客匯總鏈接

1.技術(shù)博客匯總

2.開(kāi)源項(xiàng)目匯總

3.生活博客匯總

4.喜馬拉雅音頻匯總

5.其他匯總

02.關(guān)于我的博客

我的個(gè)人站點(diǎn):www.yczbj.org, www.ycbjie.cn

github:https://github.com/yangchong211

知乎:https://www.zhihu.com/people/...

簡(jiǎn)書(shū):http://www.jianshu.com/u/b7b2...

csdn:http://my.csdn.net/m0_37700275

喜馬拉雅聽(tīng)書(shū):http://www.ximalaya.com/zhubo...

開(kāi)源中國(guó):https://my.oschina.net/zbj161...

泡在網(wǎng)上的日子:http://www.jcodecraeer.com/me...

郵箱:[email protected]

阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV

segmentfault頭條:https://segmentfault.com/u/xi...

掘金:https://juejin.im/user/593943...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72849.html

相關(guān)文章

  • PHP進(jìn)程通信

    摘要:一進(jìn)程間通信理解間進(jìn)程通信機(jī)制,先了解下進(jìn)程間有哪些通訊機(jī)制歷史發(fā)展按照歷史來(lái)源主要有兩大塊的管道,,信號(hào)的消息隊(duì)列,共享內(nèi)存,信號(hào)燈。信號(hào)量主要作為進(jìn)程間,以及進(jìn)程內(nèi)部線程之間的通訊手段。主要依賴,兼容擴(kuò)展實(shí)現(xiàn)方式的進(jìn)程間通信之消息隊(duì)列。 PHP間進(jìn)程如何通信,PHP相關(guān)的服務(wù)的IPC是實(shí)現(xiàn)方式,IPC的思想如何用到項(xiàng)目中。 一、linux進(jìn)程間通信 理解php間進(jìn)程通信機(jī)制,先了解...

    haobowd 評(píng)論0 收藏0
  • PHP多進(jìn)程初探 --- 進(jìn)程間通信二三事

    摘要:多進(jìn)程通信之一命名管道。多進(jìn)程通信之三信號(hào)量與共享內(nèi)存。共享內(nèi)存是最快是進(jìn)程間通信方式,因?yàn)閭€(gè)進(jìn)程之間并不需要數(shù)據(jù)復(fù)制,而是直接操控同一份數(shù)據(jù)。的一些書(shū)籍中甚至不建議新手輕易使用這種進(jìn)程間通信的方式,因?yàn)檫@是一種極易產(chǎn)生死鎖的解決方案。 [原文地址:https://blog.ti-node.com/blog...] 往往開(kāi)啟多進(jìn)程的目的是為了一起干活加速效率,前面說(shuō)了不同進(jìn)程之間的內(nèi)存...

    hearaway 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<