理解 Binder 機(jī)制

以下文章參考 https://zhuanlan.zhihu.com/p/35519585介时,《Android藝術(shù)開發(fā)探索》

首先像聲明,Binder 的復(fù)雜程度肯定不是一篇文章能說清楚的厢汹,之所以寫這篇文章,是在博客,書上學(xué)習(xí)到后歌焦,能讓自己有一個(gè)概念,希望深入理解 Binder 的可以自行參考網(wǎng)上文章砚哆。

什么是 Binder?

我的理解就是:是一種進(jìn)程間的通訊機(jī)制

為什么是 Binder?

大家都知道独撇,Android 是基于 Linux 內(nèi)核開發(fā)的,Linux 本身就提供了多種進(jìn)程間通訊的機(jī)制躁锁,如管道(Pipe)纷铣、信號(Signal)、消息隊(duì)列(Message)战转、共享內(nèi)存(Share Memory)和 Socket 等
原因
其他通信方式存在 安全性搜立,性能等問題

性能
Socket 作為一款通用接口,其傳輸效率低槐秧,開銷大啄踊,主要用在跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。消息隊(duì)列和管道采用存儲-轉(zhuǎn)發(fā)方式刁标,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開辟的緩存區(qū)中颠通,然后再從內(nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝過程膀懈。共享內(nèi)存雖然無需拷貝顿锰,但控制復(fù)雜,難以使用启搂。Binder 只需要一次數(shù)據(jù)拷貝硼控,性能上僅次于共享內(nèi)存。

進(jìn)程間通訊方式 拷貝次數(shù)
管道 2
消息隊(duì)列 2
Socket 2
Binner 1
共享內(nèi)存 0

安全性
傳統(tǒng) IPC 接收方無法獲得對方可靠的進(jìn)程用戶ID/進(jìn)程ID(UID/PID)胳赌,從而無法鑒別身份牢撼,而Binder機(jī)制為每個(gè)進(jìn)程分配了UID/PID且在Binder通信時(shí)會根據(jù)UID/PID進(jìn)行身份鑒別

基本的跨進(jìn)程概念

  • 進(jìn)程隔離
    進(jìn)程與進(jìn)程間內(nèi)存是不共享的
  • 進(jìn)程空間劃分:用戶空間(User Space)/內(nèi)核空間(Kernel Space)
    內(nèi)核空間(Kernel)是系統(tǒng)內(nèi)核運(yùn)行的空間,用戶空間(User Space)是用戶程序運(yùn)行的空間疑苫。為了保證安全性熏版,它們之間是隔離的。
  • 系統(tǒng)調(diào)用:用戶態(tài)/內(nèi)核態(tài)
    當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí)缀匕,稱進(jìn)程處于內(nèi)核運(yùn)行態(tài)(內(nèi)核態(tài))
    當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼的時(shí)候纳决,我們稱其處于用戶運(yùn)行態(tài)(用戶態(tài))
    系統(tǒng)調(diào)用主要通過如下兩個(gè)函數(shù)來實(shí)現(xiàn):
    copy_from_user() :將數(shù)據(jù)從用戶空間拷貝到內(nèi)核空間
    copy_to_user() :將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間
image

傳統(tǒng)IPC原理

  • 發(fā)送方將要發(fā)送數(shù)據(jù)的放在用戶空間內(nèi)存緩存區(qū)
  • 調(diào)用 copyfromuser() 函數(shù)將數(shù)據(jù)從用戶空間的內(nèi)存緩存區(qū)拷貝到內(nèi)核空間的內(nèi)核緩存區(qū)中
  • 接收方進(jìn)程在接收數(shù)據(jù)時(shí)在自己的用戶空間開辟一塊內(nèi)存緩存區(qū)
  • 內(nèi)核程序調(diào)用 copytouser() 函數(shù)將數(shù)據(jù)從內(nèi)核緩存區(qū)拷貝到接收進(jìn)程的內(nèi)存緩存區(qū)


    image

Binder IPC 底層通訊原理

IPC 過程

  • Binder 驅(qū)動(dòng)創(chuàng)建一塊數(shù)據(jù)接收緩存區(qū)
  • 在內(nèi)核空間開辟一塊內(nèi)核緩存區(qū),建立內(nèi)核緩存區(qū)和內(nèi)核中數(shù)據(jù)接收緩存區(qū)之間的映射關(guān)系乡小,以及內(nèi)核中數(shù)據(jù)接收緩存區(qū)和接收進(jìn)程用戶空間地址的映射關(guān)系阔加;
  • 發(fā)送方進(jìn)程通過系統(tǒng)調(diào)用 copyfromuser() 將數(shù)據(jù) copy 到內(nèi)核中的內(nèi)核緩存區(qū),由于內(nèi)核緩存區(qū)和接收進(jìn)程的用戶空間存在內(nèi)存映射满钟,因此也就相當(dāng)于把數(shù)據(jù)發(fā)送到了接收進(jìn)程的用戶空間胜榔,這樣便完成了一次進(jìn)程間的通信胳喷。


    image

Binder 實(shí)現(xiàn)層
首先我們應(yīng)該知道 Binder 是 C/S 架構(gòu),他的組成主要有 Client夭织、Server吭露、ServiceManager, Binder 驅(qū)動(dòng) ,其中 ClientServer尊惰、ServiceManager 是運(yùn)行在 用戶空間層讲竿,而 Binder 驅(qū)動(dòng) 自然是內(nèi)核層了。

無標(biāo)題.png

通信過程

  • 首先弄屡,一個(gè)進(jìn)程使用 BINDERSETCONTEXT_MGR 命令通過 Binder 驅(qū)動(dòng)將自己注冊成為 ServiceManager
  • Server 向 Service Manager 中注冊 Binder (Server 中的 Binder 實(shí)體)表明可以對外提供服務(wù)
  • Client 向 Service Manager 獲取到對Binder 實(shí)體的引用
  • 通過這個(gè)引用實(shí)現(xiàn) Client 和 Server 的進(jìn)程通信

Binder 通信中的代理模式
由上面我們知道了 跨進(jìn)程通信是借住了 Binder 驅(qū)動(dòng)完成的题禀,由于 Client 和 Server 是兩個(gè)不同的進(jìn)程,當(dāng) Client 想要 Server 某個(gè)對象的話膀捷,是沒辦法直接使用的迈嘹。所以既然跨進(jìn)程是借住 Binder 驅(qū)動(dòng) 完成的,因此在數(shù)據(jù)經(jīng)過 Binder 驅(qū)動(dòng)的時(shí)候驅(qū)動(dòng)會對數(shù)據(jù)進(jìn)行一層轉(zhuǎn)換全庸,當(dāng) A 進(jìn)程想要獲取 B 進(jìn)程的 object 時(shí)秀仲,驅(qū)動(dòng)并不會把真正的 object 返回給 A ,而是返回一個(gè)跟 object 看起來一模一樣的代理對象 objectProxy ,這個(gè) objectProxy 具有和 object 一摸一樣的方法壶笼,但是這些方法并沒有 B 進(jìn)程中 object 對象那些方法的能力神僵,這些方法只需要把請求參數(shù)交給驅(qū)動(dòng)即可。對于 A 進(jìn)程來說和直接調(diào)用 object 中的方法是一樣的拌消。

image

Binder 的定義
現(xiàn)在我們可以對 Binder 做個(gè)更加全面的定義了:

  • 從進(jìn)程間通信的角度看挑豌,Binder 是一種進(jìn)程間通信的機(jī)制;
  • 從 Server 進(jìn)程的角度看墩崩,Binder 指的是 Server 中的 Binder 實(shí)體對象;
  • 從 Client 進(jìn)程的角度看侯勉,Binder 指的是對 Binder 代理對象鹦筹,是 Binder 實(shí)體對象的一個(gè)遠(yuǎn)程代理
  • 從傳輸過程的角度看,Binder 是一個(gè)可以跨進(jìn)程傳輸?shù)膶ο笾访玻籅inder 驅(qū)動(dòng)會對這個(gè)跨越進(jìn)程邊界的對象對一點(diǎn)點(diǎn)特殊處理铐拐,自動(dòng)完成代理對象和本地對象之間的轉(zhuǎn)換。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末练对,一起剝皮案震驚了整個(gè)濱河市遍蟋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螟凭,老刑警劉巖虚青,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異螺男,居然都是意外死亡棒厘,警方通過查閱死者的電腦和手機(jī)纵穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奢人,“玉大人谓媒,你說我怎么就攤上這事『魏酰” “怎么了句惯?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長支救。 經(jīng)常有香客問我抢野,道長,這世上最難降的妖魔是什么搂妻? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任蒙保,我火速辦了婚禮,結(jié)果婚禮上欲主,老公的妹妹穿的比我還像新娘邓厕。我一直安慰自己,他們只是感情好扁瓢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布详恼。 她就那樣靜靜地躺著,像睡著了一般引几。 火紅的嫁衣襯著肌膚如雪昧互。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天伟桅,我揣著相機(jī)與錄音敞掘,去河邊找鬼。 笑死楣铁,一個(gè)胖子當(dāng)著我的面吹牛玖雁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盖腕,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼赫冬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溃列?” 一聲冷哼從身側(cè)響起劲厌,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎听隐,沒想到半個(gè)月后补鼻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年辽幌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了增淹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乌企,死狀恐怖虑润,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情加酵,我是刑警寧澤拳喻,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猪腕,受9級特大地震影響冗澈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陋葡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一亚亲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腐缤,春花似錦捌归、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剃浇,卻和暖如春巾兆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虎囚。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工角塑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淘讥。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓吉拳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親适揉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容