欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

理解Android系統(tǒng)Binder機(jī)制

 更新時(shí)間:2016年05月07日 14:05:27   作者:monkey1992  
這篇文章主要為大家介紹了Android系統(tǒng)Binder機(jī)制,幫助大家理解Binder機(jī)制,感興趣的朋友可以參考一下

一、Binder機(jī)制概述

在Android開發(fā)中,很多時(shí)候我們需要用到進(jìn)程間通信,所謂進(jìn)程間通信,實(shí)現(xiàn)進(jìn)程間通信的機(jī)制有很多種,比如說socket、pipe等,Android中進(jìn)程間通信的方式主要有三種:

1.標(biāo)準(zhǔn)Linux Kernel IPC 接口;

2.標(biāo)準(zhǔn)D-BUS接口;

3.Binder接口。

其中,Binder機(jī)制是使用最且最被認(rèn)可的,因?yàn)锽inder機(jī)制有以下優(yōu)點(diǎn):

1.相對(duì)于其它IPC機(jī)制,Binder機(jī)制更加簡潔和快速;

2.消耗的內(nèi)存相對(duì)更少;

3.傳統(tǒng)的IPC機(jī)制可能會(huì)增加進(jìn)程的開銷,以及出現(xiàn)進(jìn)程過載和安全漏洞,Binder機(jī)制則有效避免和解決了這些問題。

Binder機(jī)制是Android系統(tǒng)的核心機(jī)制,幾乎貫穿于整個(gè)Android系統(tǒng),Android系統(tǒng)基本上可以看作是一個(gè)基于binder通信機(jī)制的C/S架構(gòu),Binder就像網(wǎng)絡(luò),把Android系統(tǒng)的各個(gè)部分連接到了一起。利用Binder機(jī)制,可以實(shí)現(xiàn)以下功能:

1.用驅(qū)動(dòng)程序來推進(jìn)進(jìn)程間通信;

2.通過共享內(nèi)存來提高性能;

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

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

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

二、Binder機(jī)制的工作流程

1.客戶端獲取服務(wù)端的帶來對(duì)象(proxy)。我們需要明確的是客戶端進(jìn)程并不能直接操作服務(wù)端中的方法,如果要操作服務(wù)端中的方法,那么有一個(gè)可行的解決方法就是在客戶端建立一個(gè)服務(wù)端進(jìn)程的代理對(duì)象,這個(gè)代理對(duì)象具備和服務(wù)端進(jìn)程一樣的功能,要訪問服務(wù)端進(jìn)程中的某個(gè)方法,只需要訪問代理對(duì)象中對(duì)應(yīng)的方法即可;

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

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

4.服務(wù)端進(jìn)程處理客戶端發(fā)過來的請(qǐng)求,處理完之后通過Binder驅(qū)動(dòng)返回處理結(jié)果給客戶端的服務(wù)端代理對(duì)象;

5.代理對(duì)象將請(qǐng)求結(jié)果進(jìn)一步返回給客戶端進(jìn)程。

通過以上5個(gè)步驟,就完成了一次Binder通信。

三、Binder機(jī)制的組成

Binder機(jī)制由三部分組成,即:

1.Client;

2.Server;

3.ServiceManager。

三部分組件之間的關(guān)系:

1.Client、Server、ServiceManager均在用戶空間中實(shí)現(xiàn),而Binder驅(qū)動(dòng)程序則是在內(nèi)核空間中實(shí)現(xiàn)的;

2.在Binder通信中,Server進(jìn)程先注冊(cè)一些Service到ServiceManager中,ServiceManager負(fù)責(zé)管理這些Service并向Client提供相關(guān)的接口;

3.Client進(jìn)程要和某一個(gè)具體的Service通信,必須先從ServiceManager中獲取該Service的相關(guān)信息,Client根據(jù)得到的Service信息與Service所在的Server進(jìn)程建立通信,之后Clent就可以與Service進(jìn)行交互了;

4.Binder驅(qū)動(dòng)程序提供設(shè)備文件/dev/binder與用戶空間進(jìn)行交互,Client、Server和ServiceManager通過open和ioctl文件操作函數(shù)與Binder驅(qū)動(dòng)程序進(jìn)行通信;

5.Client、Server、ServiceManager三者之間的交互都是基于Binder通信的,所以通過任意兩者這件的關(guān)系,都可以解釋Binder的機(jī)制。

四、Binder驅(qū)動(dòng)的實(shí)現(xiàn)簡介

1.Binder采用了AIDL來描述進(jìn)程間的接口;

2.Binder是一個(gè)特殊的字符型設(shè)備,設(shè)備節(jié)點(diǎn)為dev/binder。

3.Binder驅(qū)動(dòng)程序由以下兩個(gè)文件實(shí)現(xiàn):

  ①kernel/drivers/staging/binder.h

 ?、趉ernel/drivers/staging/binder.c

4.在Binder驅(qū)動(dòng)的實(shí)現(xiàn)過程中,以下函數(shù)起著關(guān)鍵作用:

 ?、偈褂胋inder_ioctl()函數(shù)與用戶空間交換數(shù)據(jù);

 ?、贐INDER_WRITE_READ用來讀寫數(shù)據(jù),數(shù)據(jù)包中的cmd域用于區(qū)分不同的請(qǐng)求;

 ?、凼褂胋inder_thread_write()函數(shù)來發(fā)送請(qǐng)求或返回結(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結(jié)果為空,則認(rèn)為此對(duì)象是context_mgr,然后把請(qǐng)求發(fā)給context_mgr所在的進(jìn)程,并將請(qǐng)求中所有的Binder對(duì)象放到RB樹中,最后把請(qǐng)求放到目標(biāo)進(jìn)程的隊(duì)列中以等待目標(biāo)進(jìn)程的讀取。;

 ?、苁褂胋inder_thread_read()函數(shù)來讀取結(jié)果;

 ?、菰诤瘮?shù)binder_parse()中實(shí)現(xiàn)數(shù)據(jù)解析工作?! ?/p>

五、Binder驅(qū)動(dòng)程序中的數(shù)據(jù)結(jié)構(gòu)

1.binder_work。binder_work表示在binder驅(qū)動(dòng)中進(jìn)程要處理的工作項(xiàng)。

2.binder_node。binder_node用于定義Binder實(shí)體對(duì)象。Android系統(tǒng)中每一個(gè)Srevice組件在Binder驅(qū)動(dòng)程序中都對(duì)應(yīng)一個(gè)Binder實(shí)體對(duì)象。驅(qū)動(dòng)中的Binder實(shí)體也叫做“節(jié)點(diǎn)”,你屬于提供實(shí)體的進(jìn)程;

3.binder_ref。binder_ref用于描述一個(gè)Binder引用對(duì)象。Android系統(tǒng)中每一個(gè)Client組件在Binder驅(qū)動(dòng)程序中都對(duì)應(yīng)一個(gè)Binder引用對(duì)象;

4.binder_ref_death。binder_ref_death是一個(gè)通知結(jié)構(gòu)體。只要某進(jìn)程訂閱了某binder引用對(duì)應(yīng)實(shí)體的死亡通知,那么binder驅(qū)動(dòng)就會(huì)為該binder引用建立一個(gè)binder_ref_death通知結(jié)構(gòu)體,將其保存在當(dāng)前進(jìn)程的對(duì)應(yīng)binder引用結(jié)構(gòu)體的death域中,即Binder引用對(duì)象將死亡通知注冊(cè)到Binder驅(qū)動(dòng)程序中。這里涉及到Binder的死亡通知機(jī)制,Binder的死亡通知機(jī)制具體指:如果Binder實(shí)體對(duì)象意外死亡,那么將會(huì)導(dǎo)致改Binder實(shí)體對(duì)象的引用變得無效,因而就需要在Binder實(shí)體對(duì)象死亡的時(shí)候通知到所有引用它的代理對(duì)象,從而在一定程度上預(yù)防和解決Binder飲用對(duì)象無效的問題;

5.binder_buffer。Binder_Buffer用于描述一個(gè)內(nèi)核緩沖區(qū),能夠在進(jìn)程之間傳輸數(shù)據(jù);

6.binder_proc。binder_proc表示正在使用Binder進(jìn)程通信機(jī)制的進(jìn)程,能夠保存調(diào)用Binder的各個(gè)進(jìn)程或線程的信息,如線程ID、進(jìn)程ID、Binder狀態(tài)信息等;

7.binder_thread。binder_thread用于存儲(chǔ)每一個(gè)單獨(dú)的線程的信息,表示Binder線程池中的一個(gè)線程;

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

9.binder_write_read。binder_write_read表示在進(jìn)程之間的通信過程中傳輸?shù)臄?shù)據(jù),數(shù)據(jù)包中有一個(gè)cmd域用于區(qū)分不同的請(qǐng)求;

10.BinderDriverCommandProtocol。結(jié)構(gòu)體binder_write_read包含的命令在BinderDriverCommandProtocol中定義;

11.BinderDriverReturnProtocol。BinderDriverReturnProtocol中定義了讀操作命令協(xié)議;

12.binder_ptr_cookie。binder_ptr_cookie表示一個(gè)Binder實(shí)體對(duì)象或Service組件的死亡接收通知;

13.binder_transaction_data。binder_transaction_data表示在通信過程中傳遞的數(shù)據(jù);

14.flat_binder_object。flat_binder_object表示Binder對(duì)象。Android系統(tǒng)中,在進(jìn)程之間傳遞的數(shù)據(jù)稱為Binder對(duì)象。

六、Binder的詳細(xì)實(shí)現(xiàn)

1.設(shè)備初始化。Binder機(jī)制的設(shè)備初始化函數(shù)binder_init位于inder.c中,在進(jìn)行設(shè)備初始化的時(shí)候binder_init會(huì)調(diào)用設(shè)備驅(qū)動(dòng)接口函數(shù)device_initcall;

2.打開設(shè)備文件。Binder機(jī)制,函數(shù)binder_open用于打開Binder設(shè)備文件/dev/binder。Android系統(tǒng)中,驅(qū)動(dòng)程序的任何一個(gè)進(jìn)程及線程都可以打開一個(gè)Binder設(shè)備;與binder_open函數(shù)功能相反的是binder_release函數(shù),用于釋放打開的空間以及操作過程中分配的空間;

3.實(shí)現(xiàn)內(nèi)存映射。當(dāng)打開Binder設(shè)備文件/dev/binder之后,需要調(diào)用函數(shù)mmap()把設(shè)備內(nèi)存映射到用戶進(jìn)程地址空間中,這樣就可以像操作用戶內(nèi)存那樣操作設(shè)備內(nèi)存。在Binder設(shè)備中,對(duì)內(nèi)存的映射操作是有限制的,如Binder不能映射具有寫權(quán)限的內(nèi)存區(qū)域,最大能映射4MB的內(nèi)存區(qū)域等;

4.釋放物理頁面。Binder機(jī)制中,函數(shù)binder_insert_free_buffer()用于將進(jìn)程中的Buffer插入進(jìn)程信息中,即將一個(gè)空閑內(nèi)核緩沖區(qū)加入進(jìn)程中的空閑內(nèi)核緩沖區(qū)的紅黑樹中;

5.處理內(nèi)核緩沖區(qū)

 ?、?binder_alloc_buf()用于分配內(nèi)核緩沖區(qū);

 ?、赽inder_insert_allocated_buffer()用于將分配的內(nèi)核緩沖區(qū)添加到目標(biāo)進(jìn)程的已分配物理頁面的內(nèi)核緩沖區(qū)紅黑樹中;

 ?、踒inder_free_buf()用于釋放內(nèi)核緩沖區(qū)的操作;

 ?、?buffer_start_page()和*buffer_end_page()用于計(jì)算結(jié)構(gòu)體binder_buffer所占用的虛擬頁面的地址;

 ?、輇inder_delete_free_buffer()用于刪除結(jié)構(gòu)體binder_buffer;

  ⑥*binder_buffer_lookup()根據(jù)一個(gè)用戶空間地址查詢一個(gè)內(nèi)核緩沖區(qū)。

七、Binder封裝庫

 Android源碼中,各個(gè)層次都有Binder的相關(guān)實(shí)現(xiàn),其中主要由本地原生代碼實(shí)現(xiàn),其它層次的Binder實(shí)現(xiàn)都是調(diào)用原生Binder庫來實(shí)現(xiàn)的。

Binder的各層次實(shí)現(xiàn)為:

1.Binder驅(qū)動(dòng)部分。實(shí)現(xiàn)功能如下:

 ?、俳M織Binder的服務(wù)及誒到哪;

 ?、谡{(diào)用Binder相關(guān)的處理線程;

 ?、弁瓿蓪?shí)際的Binder傳輸。

2.Binder Adapter層。Binder Adapter層是對(duì)Binder驅(qū)動(dòng)的封裝,主要功能是操作Binder驅(qū)動(dòng),因而應(yīng)用程序無須直接和Binder驅(qū)動(dòng)程序關(guān)聯(lián)。關(guān)聯(lián)文件包括IPCThreadState.cpp、ProcessState.cpp和Parcel.cpp中的一些內(nèi)容。Binder核心庫是Binder框架的核心實(shí)現(xiàn),主要包括IBinder、Binder(服務(wù)端)和BpBinder(客戶端)。

3.頂層。頂層binder框架和具體的客戶端。

以上就是關(guān)于Android系統(tǒng)Binder機(jī)制的全部內(nèi)容,希望對(duì)大家學(xué)習(xí)Android軟件編程有所幫助。

相關(guān)文章

  • Android屏蔽EditText軟鍵盤的方法

    Android屏蔽EditText軟鍵盤的方法

    這篇文章主要介紹了Android屏蔽EditText軟鍵盤的方法,涉及Android屏蔽EditText軟鍵盤及恢復(fù)軟鍵盤的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Android自定義控件之創(chuàng)建可復(fù)用的組合控件

    Android自定義控件之創(chuàng)建可復(fù)用的組合控件

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件之創(chuàng)建可復(fù)用的組合控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android高仿QQ6.0側(cè)滑刪除實(shí)例代碼

    Android高仿QQ6.0側(cè)滑刪除實(shí)例代碼

    先給大家分享一下,側(cè)滑刪除,布局也就是前面一個(gè)item,然后有兩個(gè)隱藏的按鈕(TextView也可以),然后我們可以向左側(cè)滑動(dòng),然后顯示出來,然后對(duì)delete(刪除鍵)實(shí)現(xiàn)監(jiān)聽,就可以了哈。好了那就來看看代碼怎么實(shí)現(xiàn)的吧
    2016-02-02
  • Android仿QQ圓形頭像個(gè)性名片

    Android仿QQ圓形頭像個(gè)性名片

    這篇文章主要為大家詳細(xì)介紹了Android仿QQ圓形頭像個(gè)性名片的制作方法,涉及圓形頭像和光環(huán)波形設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android如何判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)

    Android如何判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)

    這篇文章主要為大家詳細(xì)介紹了Android判斷一個(gè)點(diǎn)在不在多邊形區(qū)域內(nèi)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解

    flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解

    這篇文章主要為大家介紹了flutter實(shí)現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android中沒有插入SD情況下的文件寫入和讀取方法

    Android中沒有插入SD情況下的文件寫入和讀取方法

    在Android開發(fā)時(shí)會(huì)遇到如下一種場合希望應(yīng)用下載到當(dāng)前應(yīng)用的根目錄下,而非SD卡中然后可以隨時(shí)被該應(yīng)用或其他應(yīng)用訪問這個(gè)文件,即具有被全局讀取的權(quán)限
    2012-11-11
  • android 調(diào)用系統(tǒng)的照相機(jī)和圖庫實(shí)例詳解

    android 調(diào)用系統(tǒng)的照相機(jī)和圖庫實(shí)例詳解

    android手機(jī)有自帶的照相機(jī)和圖庫,我們做的項(xiàng)目中有時(shí)用到上傳圖片到服務(wù)器,今天做了一個(gè)項(xiàng)目用到這個(gè)功能,所以把我的代碼記錄下來和大家分享,有需求的朋友可以參考下
    2012-12-12
  • Android內(nèi)部存儲(chǔ)與外部存儲(chǔ)的示例講解

    Android內(nèi)部存儲(chǔ)與外部存儲(chǔ)的示例講解

    內(nèi)部存儲(chǔ)和外部存儲(chǔ)的概念隨著Android版本的更新也在發(fā)生不斷的變化。最早的內(nèi)部存儲(chǔ)指的是系統(tǒng)自帶的ROM存儲(chǔ),外部存儲(chǔ)指的是外置的Sdcard或者通過OTG掛在的USB存儲(chǔ)
    2023-03-03
  • 分析Android 11.0Settings源碼之主界面加載

    分析Android 11.0Settings源碼之主界面加載

    這篇文章主要介紹了分析Android 11.0Settings源碼之主界面加載,對(duì)Android源碼感興趣的同學(xué),可以著重看一下
    2021-04-04

最新評(píng)論