久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Binder

 barry525 2015-03-03

什么是Binder

        在 linux 中,,進(jìn)程間的通訊機(jī)制有很多種,例如管道(pipe),、消息隊(duì)列(message queue),、信號(hào)(signal)、共享內(nèi)存(share memory),、套接字(socket)等方式,,他們都是可以實(shí)現(xiàn)進(jìn)程間通訊。但是,,在 Android 終端上的應(yīng)用軟件的通信幾乎看不到這些 IPC 通信方式,取而代之的是 Binder,。Android 同時(shí)為 Java 環(huán)境和 C/C++ 環(huán)境提供了 Binder 機(jī)制,。本篇文章主要介紹 C/C++ 環(huán)境下的 Binder 機(jī)制。,。

        Binder是一套輕量型的 IPC 機(jī)制,,它比 linux 一般的通信方式更加簡(jiǎn)潔,消耗的內(nèi)存資源更小,。Binder 主要提供以下功能:

    •  用驅(qū)動(dòng)程序來推進(jìn)進(jìn)程間的通信,。
    •  通過共享內(nèi)存來提高性能。
    •  為進(jìn)程請(qǐng)求分配每個(gè)進(jìn)程的線程池,。
    •  針對(duì)系統(tǒng)中的對(duì)象引入了引用計(jì)數(shù)和跨進(jìn)程的對(duì)象引用映射,。
    • 進(jìn)程間同步調(diào)用。            

Binder 的通信模型

        Binder 通信是通過 linux 的Binder Driver 來實(shí)現(xiàn)的,。Binder 的用戶空間為每個(gè)進(jìn)程維護(hù)著一個(gè)可用的線程池,,線程池用于處理到來的 IPC 以及執(zhí)行進(jìn)程的本地消息,,Binder 通信是同步的。同時(shí),,Binder 機(jī)制是基于 OpenBinder 來實(shí)現(xiàn)的,,Android 系統(tǒng)的運(yùn)行都將依賴 Binder 驅(qū)動(dòng)。    

        Binder 通信是基于服務(wù)器(Service)與客戶端(Client)的,,所以需要 Binder 通信的進(jìn)程都必須創(chuàng)建一個(gè) Binder 接口,。系統(tǒng)中有一個(gè)名為Service Manager的守護(hù)進(jìn)程管理著系統(tǒng)中的各個(gè)服務(wù),它負(fù)責(zé)監(jiān)聽是否有其他程序向其發(fā)送請(qǐng)求,,如果有請(qǐng)求就響應(yīng),,如果沒有則繼續(xù)監(jiān)聽等待。每個(gè)服務(wù)都要在Service Manager中注冊(cè),,而請(qǐng)求服務(wù)的客戶端則向Service Manager請(qǐng)求服務(wù),。在Android虛擬機(jī)啟動(dòng)之前,系統(tǒng)會(huì)先啟動(dòng)Service Manager進(jìn)程,,Service Manager就會(huì)打開Binder驅(qū)動(dòng),,并通知Binder Kernel驅(qū)動(dòng)程序,這個(gè)進(jìn)程將作為System Service Manager,,然后該進(jìn)程將進(jìn)入一個(gè)循環(huán),,等待處理來自其他進(jìn)程的數(shù)據(jù)。因此,,我們也可以將Binder的實(shí)現(xiàn)大致分為:Binder驅(qū)動(dòng),、Service Manager、Service,、Client 這幾個(gè)部分,。

      Binder驅(qū)動(dòng) 為上層應(yīng)用程序和用戶操作提供各種操作接口;

      Service Manager主要負(fù)責(zé)管理Android系統(tǒng)中所有的服務(wù),,當(dāng)客戶端要與服務(wù)端進(jìn)行通信時(shí),,首先就會(huì)通過Service Manager來查詢和取得所需要交互的服務(wù)。當(dāng)然,,每個(gè)服務(wù)也都需要向Service Manager注冊(cè)自己提供的服務(wù),,以便能夠供客戶端進(jìn)行查詢和獲取,;

     Server 這里的服務(wù)即上面所說的服務(wù)端,,通常也是Android的系統(tǒng)服務(wù),通過Service Manager可以查詢和獲取某個(gè)Server,;

     client 這里的客戶端一般是指Android系統(tǒng)上面的應(yīng)用程序,。它可以請(qǐng)求Server中的服務(wù),比如Activity,;

      

                        

                                                                                Binder  通信原理圖


基于Client-Server的通信方式廣泛應(yīng)用于從互聯(lián)網(wǎng)和數(shù)據(jù)庫訪問到嵌入式手持設(shè)備內(nèi)部通信等各個(gè)領(lǐng)域,。智能手機(jī)平臺(tái)特別是Android 系統(tǒng)中,,為了向應(yīng)用開發(fā)者提供豐富多樣的功能,這種通信方式更是無處不在,,諸如媒體播放,,視音頻頻捕獲,到各種讓手機(jī)更智能的傳感器(加速度,,方位,,溫度,光亮度等)都由不同的Server負(fù)責(zé)管理,,應(yīng)用程序只需做為Client與這些Server建立連接便可以使用這些服務(wù),,花很少的時(shí)間和精力就能開發(fā)出令人眩目的功能。Client-Server方式的廣泛采用對(duì)進(jìn)程間通信(IPC)機(jī)制是一個(gè)挑戰(zhàn),。目前l(fā)inux支持的IPC包括傳統(tǒng)的管道,,System V IPC,即消息隊(duì)列/共享內(nèi)存/信號(hào)量,,以及socket中只有socket支持Client-Server的通信方式,。當(dāng)然也可以在這些底層機(jī)制上架設(shè)一套協(xié)議來實(shí)現(xiàn)Client-Server通信,但這樣增加了系統(tǒng)的復(fù)雜性,,在手機(jī)這種條件復(fù)雜,,資源稀缺的環(huán)境下可靠性也難以保證。


Binder 的面向?qū)ο笏枷?/strong>

       Binder使用Client-Server通信方式:一個(gè)進(jìn)程作為Server提供諸如視頻/音頻解碼,,視頻捕獲,,地址本查詢,網(wǎng)絡(luò)連接等服務(wù),;多個(gè)進(jìn)程作為Client向Server發(fā)起服務(wù)請(qǐng)求,,獲得所需要的服務(wù)。要想實(shí)現(xiàn)Client-Server通信據(jù)必須實(shí)現(xiàn)以下兩點(diǎn):一是server 必須有確定的訪問接入點(diǎn)或者說地址來接受Client的請(qǐng)求,,并且Client可以通過某種途徑獲知Server的地址,;二是制定Command- Reply協(xié)議來傳輸數(shù)據(jù)。例如在網(wǎng)絡(luò)通信中Server的訪問接入點(diǎn)就是Server主機(jī)的IP地址+端口號(hào),,傳輸協(xié)議為TCP協(xié)議,。對(duì)Binder而言,,Binder可以看成Server提供的實(shí)現(xiàn)某個(gè)特定服務(wù)的訪問接入點(diǎn),, Client通過這個(gè)‘地址’向Server發(fā)送請(qǐng)求來使用該服務(wù);對(duì)Client而言,,Binder可以看成是通向Server的管道入口,,要想和某個(gè) Server通信首先必須建立這個(gè)管道并獲得管道入口。

      與其它IPC不同,,Binder使用了面向?qū)ο蟮乃枷雭砻枋鲎鳛樵L問接入點(diǎn)的Binder及其在Client中的入口:Binder是一個(gè)實(shí)體位于 Server中的對(duì)象,,該對(duì)象提供了一套方法用以實(shí)現(xiàn)對(duì)服務(wù)的請(qǐng)求,,就象類的成員函數(shù)。遍布于client中的入口可以看成指向這個(gè)binder對(duì)象的 ‘指針’,,一旦獲得了這個(gè)‘指針’就可以調(diào)用該對(duì)象的方法訪問server,。在Client看來,通過Binder‘指針’調(diào)用其提供的方法和通過指針調(diào)用其它任何本地對(duì)象的方法并無區(qū)別,,盡管前者的實(shí)體位于遠(yuǎn)端Server中,,而后者實(shí)體位于本地內(nèi)存中?!羔槨荂++的術(shù)語,,而更通常的說法是引用,即Client通過Binder的引用訪問Server,。而軟件領(lǐng)域另一個(gè)術(shù)語‘句柄’也可以用來表述Binder在Client中的存在方式,。從通信的角度看,Client中的Binder也可以看作是Server Binder的‘代理’,,在本地代表遠(yuǎn)端Server為Client提供服務(wù),。本文中會(huì)使用‘引用’或‘句柄’這個(gè)兩廣泛使用的術(shù)語。

      面向?qū)ο笏枷氲囊雽⑦M(jìn)程間通信轉(zhuǎn)化為通過對(duì)某個(gè)Binder對(duì)象的引用調(diào)用該對(duì)象的方法,,而其獨(dú)特之處在于Binder對(duì)象是一個(gè)可以跨進(jìn)程引用的對(duì)象,,它的實(shí)體位于一個(gè)進(jìn)程中,而它的引用卻遍布于系統(tǒng)的各個(gè)進(jìn)程之中,。最誘人的是,,這個(gè)引用和java里引用一樣既可以是強(qiáng)類型,也可以是弱類型,,而且可以從一個(gè)進(jìn)程傳給其它進(jìn)程,,讓大家都能訪問同一Server,就象將一個(gè)對(duì)象或引用賦值給另一個(gè)引用一樣,。Binder模糊了進(jìn)程邊界,,淡化了進(jìn)程間通信過程,整個(gè)系統(tǒng)仿佛運(yùn)行于同一個(gè)面向?qū)ο蟮某绦蛑?。形形色色的Binder對(duì)象以及星羅棋布的引用仿佛粘接各個(gè)應(yīng)用程序的膠水,,這也是Binder 在英文里的原意。

      當(dāng)然面向?qū)ο笾皇轻槍?duì)應(yīng)用程序而言,,對(duì)于Binder驅(qū)動(dòng)和內(nèi)核其它模塊一樣使用C語言實(shí)現(xiàn),,沒有類和對(duì)象的概念。Binder驅(qū)動(dòng)為面向?qū)ο蟮倪M(jìn)程間通信提供底層支持,。


Binder  驅(qū)動(dòng)

        驅(qū)動(dòng)程序部分驅(qū)動(dòng)程序的部分在以下的文件夾中:                

  kernel/include/linux/binder.h

  kernel/drivers/Android/binder.c

        binder驅(qū)動(dòng)程序是一個(gè)miscdevice,,主設(shè)備號(hào)為10,此設(shè)備號(hào)使用動(dòng)態(tài)獲得(MISC_DYNAMIC_MINOR),,其設(shè)備的節(jié)點(diǎn)為:/dev/binder

        在其驅(qū)動(dòng)的實(shí)現(xiàn)過程中,,主要通過binder_ioctl函數(shù)與用戶空間的進(jìn)程交換數(shù)據(jù),。BINDER_WRITE_READ用來讀寫數(shù)據(jù),數(shù)據(jù)包中有一個(gè)cmd域用于區(qū)分不同的請(qǐng)求,。binder_thread_write函數(shù)用于發(fā)送請(qǐng)求或返回結(jié)果,,而binder_thread_read函數(shù)則用于讀取結(jié)果。在binder_thread_write函數(shù)中調(diào)用binder_transaction函數(shù)來轉(zhuǎn)發(fā)請(qǐng)求并返回結(jié)果,。當(dāng)收到請(qǐng)求時(shí),,binder_transaction函數(shù)會(huì)通過對(duì)象的handle找到對(duì)象所在的進(jìn)程,如果handle為空,,就認(rèn)為對(duì)象是context_mgr,,把請(qǐng)求發(fā)給context_mgr所在的進(jìn)程。請(qǐng)求中所有的Binder對(duì)象全部放到一個(gè)RB樹中,,最后把請(qǐng)求放到目標(biāo)進(jìn)程的隊(duì)列中,,等待目標(biāo)進(jìn)程讀取。數(shù)據(jù)的解析工作放在binder_parse()中實(shí)現(xiàn),;關(guān)于如何生成context_mgr,,內(nèi)核中提供了BINDER_SET_CONTEXT_ MGR命令來完成此項(xiàng)功能。


Binder 相關(guān)結(jié)構(gòu)體

      1.struct binder_work,;

      2.Binder 對(duì)象———struct flat_binder_object

           我們把進(jìn)程之間傳遞的數(shù)據(jù)稱之為Binder對(duì)象(Binder Object),,它在對(duì)應(yīng)源碼中使用flat_binder_object結(jié)構(gòu)體(位于binder.h文件中)來表示

      3.struct binder_transaction_data

           用于 Binder 驅(qū)動(dòng)的實(shí)現(xiàn)

      4.struct binder_write_read

      5.binder_proc

            binder_proc結(jié)構(gòu)體用于保存調(diào)用Binder的各個(gè)進(jìn)程或線程的信息,比如線程ID,、進(jìn)程ID,、Binder狀態(tài)信息等。

      6.struct binder_node該結(jié)構(gòu)體表示一個(gè)Binder節(jié)點(diǎn),。

      7.struct binder_thread binder_thread結(jié)構(gòu)體用于存儲(chǔ)每一個(gè)單獨(dú)的線程的信息

      8.binder_transaction 主要用來中轉(zhuǎn)請(qǐng)求和返回結(jié)果,,保存接收和要發(fā)送的進(jìn)程信息

                                      

       其中,Binder 驅(qū)動(dòng)在前面已經(jīng)介紹了,,它用于實(shí)現(xiàn)Binder的設(shè)備驅(qū)動(dòng),,主要負(fù)責(zé)組織Binder的服務(wù)節(jié)點(diǎn),調(diào)用Binder相關(guān)的處理線程,,完成實(shí)際的Bainder傳輸?shù)?,它位于Binder結(jié)構(gòu)的最底層(即Linux內(nèi)核層)。Binder Adapter層是對(duì)Binder驅(qū)動(dòng)的封裝,,主要用于操作Binder驅(qū)動(dòng),,即應(yīng)用程序不必直接接觸Binder驅(qū)動(dòng)程序,實(shí)現(xiàn)包括IPCThreadState.cpp和ProcessState.cpp,,以及Parcel.cpp中的部分內(nèi)容,。Binder核心庫是Binder框架的核心實(shí)現(xiàn),,主要包括IBinder,、Binder(服務(wù)器端)和BpBinder(客戶端),;位最上面兩層的Binder框架和具體的客戶端/服務(wù)端都分別有Java和C++兩種實(shí)現(xiàn)方案,主要供應(yīng)用程序使用,,比如攝像頭和多媒體等,,它們通過調(diào)用Binder的核心庫來實(shí)現(xiàn)。由于這幾個(gè)部分關(guān)系緊密,,不便于單獨(dú)分析每個(gè)模塊,,因此需要結(jié)合Binder的本地實(shí)現(xiàn)一起進(jìn)行分析。


Binder的工作流程

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

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

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

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

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


Binder是一種架構(gòu),,這種架構(gòu)提供了服務(wù)端接口,、Binder驅(qū)動(dòng)、客戶端接口三個(gè)模塊,,和一個(gè)守護(hù)進(jìn)程Service Manager,。

首先來看服務(wù)端。一個(gè)Binder服務(wù)端實(shí)際上就是一個(gè)Binder類的對(duì)象,,該對(duì)象一旦創(chuàng)建,,內(nèi)部就啟動(dòng)一個(gè)隱藏線程。該線程接下來會(huì)接收Binder驅(qū)動(dòng)發(fā)送的消息,,收到消息后,,會(huì)執(zhí)行到Binder對(duì)象中的onTransact()函數(shù),并按照該函數(shù)的參數(shù)執(zhí)行不同的服務(wù)代碼,。因此,,要實(shí)現(xiàn)一個(gè)Binder服務(wù),就必須重載onTransact()方法,。

可以想象,,重載onTransact()函數(shù)的主要內(nèi)容是把onTransact()函數(shù)的參數(shù)轉(zhuǎn)換為服務(wù)函數(shù)的參數(shù),而onTransact()函數(shù)的參數(shù)來源是客戶端調(diào)用transact()函數(shù)時(shí)輸入的,,因此,,如果transact()有固定格式的輸入,那么onTransact()就會(huì)有固定格式的輸出。

下面再看Binder驅(qū)動(dòng),。任意一個(gè)服務(wù)端Binder對(duì)象被創(chuàng)建時(shí),,同時(shí)會(huì)在Binder驅(qū)動(dòng)中創(chuàng)建一個(gè)mRemote對(duì)象,該對(duì)象的類型也是Binder類,??蛻舳艘L問遠(yuǎn)程服務(wù)時(shí),都是通過mRemote對(duì)象,。


最后來看應(yīng)用程序客戶端,。客戶端要想訪問遠(yuǎn)程服務(wù),,必須獲取遠(yuǎn)程服務(wù)在Binder對(duì)象中對(duì)應(yīng)的mRemote引用,,至于如何獲取,下面幾節(jié)將要介紹,。獲得該mRemote對(duì)象后,,就可以調(diào)用其transact()方法,而在Binder驅(qū)動(dòng)中,,mRemote對(duì)象也重載了transact()方法,,重載的內(nèi)容主要包括以下幾項(xiàng)。

以線程間消息通信的模式,,向服務(wù)端發(fā)送客戶端傳遞過來的參數(shù),。

掛起當(dāng)前線程,當(dāng)前線程正是客戶端線程,,并等待服務(wù)端線程執(zhí)行完指定服務(wù)函數(shù)后通知(notify),。

接收到服務(wù)端線程的通知,然后繼續(xù)執(zhí)行客戶端線程,,并返回到客戶端代碼區(qū),。

從這里可以看出,對(duì)應(yīng)用程序開發(fā)員來講,,客戶端似乎是直接調(diào)用遠(yuǎn)程服務(wù)對(duì)應(yīng)的Binder,,而事實(shí)上則是通過Binder驅(qū)動(dòng)進(jìn)行了中轉(zhuǎn)。即存在兩個(gè)Binder對(duì)象,,一個(gè)是服務(wù)端的Binder對(duì)象,,另一個(gè)則是Binder驅(qū)動(dòng)中的Binder對(duì)象,所不同的是Binder驅(qū)動(dòng)中的對(duì)象不會(huì)再額外產(chǎn)生一個(gè)線程,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多