Binder理論基礎(chǔ)(一)------通信結(jié)構(gòu)與通信模型

引言

? Android的IPC采用的C/S架構(gòu)挺智,這樣的話各個(gè)進(jìn)程可以去實(shí)現(xiàn)自己的功能祷愉,若需要使用自己未實(shí)現(xiàn)但其他進(jìn)程實(shí)現(xiàn)了的功能,則可以很方便的作為調(diào)用客戶端去訪問實(shí)現(xiàn)該功能的服務(wù)端從而使用其對(duì)應(yīng)功能赦颇。例如二鳄,要使用視頻,音頻等功能只需作為客戶端去訪問實(shí)現(xiàn)視頻沐扳,音頻功能接口的進(jìn)程服務(wù)端泥从,然后調(diào)用服務(wù)端的對(duì)應(yīng)接口方法即可句占。

為什么是Binder

? 由于Android是基于Linux系統(tǒng)開發(fā)的操作系統(tǒng)沪摄,所以Linux的固有的IPC方式,在Android上也是適用的纱烘,但要達(dá)到上述的C/S架構(gòu)模式杨拐,只有Socket套接字才行,但是Socket的傳輸性能較差擂啥,通常用于低頻的IPC通信哄陶,所以在Android上實(shí)現(xiàn)了一套Binder機(jī)制用于在Android上進(jìn)行IPC通信。

? 那么Binder為何被選中作為Android的IPC機(jī)制呢哺壶?上述說到屋吨,Linux原本支持的IPC中只有Socket采用的是C/S架構(gòu),但性能不好山宾,這當(dāng)然是原因之一至扰。說到性能的話,我們從傳輸性能资锰,安全性能方面說起敢课。

傳輸性能

? 由于Linux對(duì)于進(jìn)程有著沙盒機(jī)制直秆,即每個(gè)進(jìn)程被“沙盒”封裝起來圾结,進(jìn)程間彼此獨(dú)立培他,這樣當(dāng)一個(gè)進(jìn)程崩潰的話舀凛,其他進(jìn)程仍可以正常運(yùn)行,系統(tǒng)仍能正常運(yùn)行懊烤。但有時(shí)需要進(jìn)程間傳遞數(shù)據(jù)腌紧,進(jìn)行通信壁肋,那么就提供了一系列的IPC方式浸遗,如:管道跛锌,共享內(nèi)存髓帽,消息隊(duì)列郑藏,信號(hào)量和Socket译秦。

? 但由于進(jìn)程間通信都需要經(jīng)過Linux內(nèi)核们拙,在內(nèi)核中直接進(jìn)行通信,所以就涉及到進(jìn)程將數(shù)據(jù)拷貝到Linux內(nèi)核的操作装盯。除共享內(nèi)存外埂奈,其余方式都至少需要拷貝2次(進(jìn)程用戶空間拷貝至內(nèi)核空間定躏,再從內(nèi)核空間拷貝至目標(biāo)進(jìn)程的用戶空間账磺,共享內(nèi)存無需拷貝)痊远。詳情可見下表:

IPC方式 拷貝次數(shù)
共享內(nèi)存 0
Binder 1
管道/消息隊(duì)列/信號(hào)量/Socket 2

為什么Binder只需一次呢?因?yàn)锽inder在Linux內(nèi)核空間獨(dú)立出了一塊區(qū)域碧聪,可直接讀取服務(wù)端數(shù)據(jù)冒版,只需要客戶端將數(shù)據(jù)拷貝至此處即可逞姿。

? 由上可看到辞嗡,傳輸次數(shù)減少了哼凯,帶來的資源消耗就少了断部,從而加大了傳輸性能达址。

簡述之:Binder相對(duì)而言減少了數(shù)據(jù)拷貝次數(shù)達(dá)到提高傳輸性能的目的蔑祟。

安全性能

? 那么,為什么Binder更具安全性呢?縱觀其他的IPC方式径簿,我們無法得知進(jìn)行通信的端口是否合法(滿足要求)罢屈,即無論是誰,只要搭上了這條鏈路篇亭,即可進(jìn)行數(shù)據(jù)交換缠捌。然而,Binder對(duì)每個(gè)進(jìn)程都分配了UID/PID译蒂,當(dāng)通過Binder進(jìn)行IPC時(shí)曼月,系統(tǒng)會(huì)去核對(duì)UID/PID是否合法,只要系統(tǒng)認(rèn)為合法的PID柔昼,才能搭上Binder的車哑芹。如此,在IPC上增加一道關(guān)卡捕透,保障IPC通信安全绩衷,所以相對(duì)其他IPC方式更具安全性。

簡述之:Binder通過UID/PID來保證通信雙方的合法性激率,進(jìn)而達(dá)到IPC間消息傳輸?shù)陌踩浴?/strong>

Binder通信模型

? 說到通信模型咳燕,主要是通信的組成成員和其架構(gòu)模式。架構(gòu)上文已說到乒躺,采用的C/S架構(gòu)招盲,那么這里主要說說組成成員。

? Binder的組成成員共有四員大將:Server嘉冒,Client曹货,ServiceManagerBinder驅(qū)動(dòng)。

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

? Binder驅(qū)動(dòng)讳推,雖然叫驅(qū)動(dòng)顶籽,但并不是真正的硬件驅(qū)動(dòng)钙态,而只是實(shí)現(xiàn)了驅(qū)動(dòng)效果的一套代碼而已闯冷。并且它運(yùn)行在內(nèi)核區(qū)包个,因此它是真正達(dá)到IPC效果的地方历葛。

? 上述說到缤剧,它實(shí)現(xiàn)了驅(qū)動(dòng)效果吹艇,即實(shí)現(xiàn)驅(qū)動(dòng)的一些方法如epoll()什么的夹攒。使用起來和真正的操作驅(qū)動(dòng)并未差別带欢。

Server和Server中的Binder

? Server作為Binder架構(gòu)中服務(wù)端洒忧,是提供功能的一端蝴韭,通過Binder暴露功能調(diào)用接口給外部,任何進(jìn)程拿到其Binder熙侍,即可通過Binder調(diào)用功能接口去調(diào)用功能榄鉴。在Server中履磨,Binder是以實(shí)體存在。外部或得的是Binder實(shí)體的引用庆尘,可以說指針或句柄蹬耘,都是一個(gè)意思,因?yàn)槭茿ndroid開發(fā)者减余,說引用的話比較好理解综苔。

Client和Client中的Binder

? Client作為Binder架構(gòu)中的客戶端,是調(diào)用功能的一端位岔,其拿到的Binder并非是Binder實(shí)體如筛,而是指向該Binder實(shí)體的引用。

ServiceManager和ServiceManager中的Binder

? ServiceManager是類似于DNS的存在抒抬,存儲(chǔ)了Binder名稱和Binder實(shí)體的對(duì)應(yīng)關(guān)系表杨刨。類似于域名和IP的對(duì)應(yīng)關(guān)系。當(dāng)有新的Service時(shí)擦剑,需要向ServiceManager進(jìn)行注冊(cè)妖胀,以便其他客戶端想調(diào)用其功能時(shí)可以找到該Binder實(shí)體的引用。那么這必然是一次IPC過程惠勒,那么在還未搭建IPC橋梁的時(shí)候進(jìn)行IPC必然是自相矛盾的赚抡,所以系統(tǒng)將ServiceManager的Binder實(shí)體的Binder引用干脆暴露出來,讓所有進(jìn)程都知道其Binder引用是什么纠屋,這樣就可以直接進(jìn)行注冊(cè)涂臣。當(dāng)新的Service向ServiceManager注冊(cè)后,客戶端調(diào)用時(shí)會(huì)在請(qǐng)求體中包含請(qǐng)求的Binder名稱售担,ServiceManager會(huì)根據(jù)名稱找到對(duì)應(yīng)Binder的引用赁遗,然后告訴客戶端,這樣客戶端就拿到服務(wù)端的Binder引用族铆,然后就可以根據(jù)該引用去調(diào)用服務(wù)端的相關(guān)接口方法岩四。

特別鳴謝

https://blog.csdn.net/universus/article/details/6211589 -------- Android Bander設(shè)計(jì)與實(shí)現(xiàn) - 設(shè)計(jì)篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哥攘,隨后出現(xiàn)的幾起案子剖煌,更是在濱河造成了極大的恐慌,老刑警劉巖献丑,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件末捣,死亡現(xiàn)場離奇詭異,居然都是意外死亡创橄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門莽红,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妥畏,“玉大人邦邦,你說我怎么就攤上這事∽硪希” “怎么了燃辖?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長网棍。 經(jīng)常有香客問我黔龟,道長,這世上最難降的妖魔是什么滥玷? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任氏身,我火速辦了婚禮,結(jié)果婚禮上惑畴,老公的妹妹穿的比我還像新娘蛋欣。我一直安慰自己,他們只是感情好如贷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布陷虎。 她就那樣靜靜地躺著,像睡著了一般杠袱。 火紅的嫁衣襯著肌膚如雪尚猿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天楣富,我揣著相機(jī)與錄音谊路,去河邊找鬼。 笑死菩彬,一個(gè)胖子當(dāng)著我的面吹牛缠劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骗灶,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惨恭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耙旦?” 一聲冷哼從身側(cè)響起脱羡,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎免都,沒想到半個(gè)月后锉罐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绕娘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年脓规,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片险领。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侨舆,死狀恐怖秒紧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挨下,我是刑警寧澤熔恢,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站臭笆,受9級(jí)特大地震影響叙淌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜愁铺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一鹰霍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帜讲,春花似錦衅谷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至在验,卻和暖如春玷氏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腋舌。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工盏触, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人块饺。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓赞辩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親授艰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辨嗽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354