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

首先簡(jiǎn)單了解一下傳統(tǒng)的Linux IPC機(jī)制

  1. 管道:在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存韵丑,緩存區(qū)大小比較有限;
  2. 消息隊(duì)列:信息復(fù)制兩次,額外的CPU消耗脐湾;不合適頻繁或信息量大的通信;
  3. 共享內(nèi)存:無(wú)須復(fù)制蚓曼,共享緩沖區(qū)直接付附加到進(jìn)程虛擬地址空間亲澡,速度快;但進(jìn)程間的同步問(wèn)題操作系統(tǒng)無(wú)法實(shí)現(xiàn)纫版,必須各進(jìn)程利用同步工具解決床绪;
  4. 套接字:作為更通用的接口,傳輸效率低其弊,主要用于不通機(jī)器或跨網(wǎng)絡(luò)的通信巫俺;
  5. 信號(hào)量:常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí)屏积,其他進(jìn)程也訪問(wèn)該資源蚀苛。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段糊识。
  6. 信號(hào): 不適用于信息交換绩社,更適用于進(jìn)程中斷控制,比如非法內(nèi)存訪問(wèn)赂苗,殺死某個(gè)進(jìn)程等愉耙;

接下來(lái)正面回答這個(gè)問(wèn)題,從5個(gè)角度來(lái)展開(kāi)對(duì)Binder的分析:

(1) 從性能的角度
數(shù)據(jù)拷貝次數(shù):Binder數(shù)據(jù)拷貝只需要一次拌滋,而管道朴沿、消息隊(duì)列、Socket都需要2次败砂,但共享內(nèi)存方式一次內(nèi)存拷貝都不需要赌渣;從性能角度看,Binder性能僅次于共享內(nèi)存昌犹。

(2) 從穩(wěn)定性的角度
Binder是基于C/S架構(gòu)的坚芜,簡(jiǎn)單解釋下C/S架構(gòu),是指客戶端(Client)和服務(wù)端(Server)組成的架構(gòu)斜姥,Client端有什么需求货岭,直接發(fā)送給Server端去完成,架構(gòu)清晰明朗疾渴,Server端與Client端相對(duì)獨(dú)立千贯,穩(wěn)定性較好;而共享內(nèi)存實(shí)現(xiàn)方式復(fù)雜搞坝,沒(méi)有客戶與服務(wù)端之別搔谴, 需要充分考慮到訪問(wèn)臨界資源的并發(fā)同步問(wèn)題,否則可能會(huì)出現(xiàn)死鎖等問(wèn)題桩撮;從這穩(wěn)定性角度看敦第,Binder架構(gòu)優(yōu)越于共享內(nèi)存峰弹。

僅僅從以上兩點(diǎn),各有優(yōu)劣芜果,還不足以支撐google去采用binder的IPC機(jī)制鞠呈,那么更重要的原因是:

(3) 從安全的角度
傳統(tǒng)Linux IPC的接收方無(wú)法獲得對(duì)方進(jìn)程可靠的UID/PID,從而無(wú)法鑒別對(duì)方身份右钾;而Android作為一個(gè)開(kāi)放的開(kāi)源體系蚁吝,擁有非常多的開(kāi)發(fā)平臺(tái),App來(lái)源甚廣舀射,因此手機(jī)的安全顯得額外重要窘茁;對(duì)于普通用戶,絕不希望從App商店下載偷窺隱射數(shù)據(jù)脆烟、后臺(tái)造成手機(jī)耗電等等問(wèn)題山林,傳統(tǒng)Linux IPC無(wú)任何保護(hù)措施,完全由上層協(xié)議來(lái)確保邢羔。

Android為每個(gè)安裝好的應(yīng)用程序分配了自己的UID驼抹,故進(jìn)程的UID是鑒別進(jìn)程身份的重要標(biāo)志,前面提到C/S架構(gòu)拜鹤,Android系統(tǒng)中對(duì)外只暴露Client端框冀,Client端將任務(wù)發(fā)送給Server端,Server端會(huì)根據(jù)權(quán)限控制策略署惯,判斷UID/PID是否滿足訪問(wèn)權(quán)限左驾,目前權(quán)限控制很多時(shí)候是通過(guò)彈出權(quán)限詢問(wèn)對(duì)話框镣隶,讓用戶選擇是否運(yùn)行极谊。Android 6.0,也稱為Android M安岂,在6.0之前的系統(tǒng)是在App第一次安裝時(shí)轻猖,會(huì)將整個(gè)App所涉及的所有權(quán)限一次詢問(wèn),只要留意看會(huì)發(fā)現(xiàn)很多App根本用不上通信錄和短信域那,但在這一次性權(quán)限權(quán)限時(shí)會(huì)包含進(jìn)去咙边,讓用戶拒絕不得,因?yàn)榫芙^后App無(wú)法正常使用次员,而一旦授權(quán)后败许,應(yīng)用便可以胡作非為。

針對(duì)這個(gè)問(wèn)題淑蔚,google在Android M做了調(diào)整市殷,不再是安裝時(shí)一并詢問(wèn)所有權(quán)限,而是在App運(yùn)行過(guò)程中刹衫,需要哪個(gè)權(quán)限再?gòu)椏蛟儐?wèn)用戶是否給相應(yīng)的權(quán)限醋寝,對(duì)權(quán)限做了更細(xì)地控制搞挣,讓用戶有了更多的可控性,但同時(shí)也帶來(lái)了另一個(gè)用戶詬病的地方音羞,那也就是權(quán)限詢問(wèn)的彈框的次數(shù)大幅度增多囱桨。對(duì)于Android M平臺(tái)上,有些App開(kāi)發(fā)者可能會(huì)寫出讓手機(jī)異常頻繁彈框的App嗅绰,企圖直到用戶授權(quán)為止舍肠,這對(duì)用戶來(lái)說(shuō)是不能忍的,用戶最后吐槽的可不光是App办陷,還有Android系統(tǒng)以及手機(jī)廠商貌夕,有些用戶可能就跳果粉了,這還需要廣大Android開(kāi)發(fā)者以及手機(jī)廠商共同努力民镜,共同打造安全與體驗(yàn)俱佳的Android手機(jī)啡专。

傳統(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ú)法建立私有通道鲸鹦。從安全角度慧库,Binder的安全性更高。

說(shuō)到這馋嗜,可能有人要反駁齐板,Android就算用了Binder架構(gòu),而現(xiàn)如今Android手機(jī)的各種流氓軟件葛菇,不就是干著這種偷窺隱射甘磨,后臺(tái)偷偷跑流量的事嗎?沒(méi)錯(cuò)眯停,確實(shí)存在济舆,但這不能說(shuō)Binder的安全性不好,因?yàn)锳ndroid系統(tǒng)仍然是掌握主控權(quán)莺债,可以控制這類App的流氓行為滋觉,只是對(duì)于該采用何種策略來(lái)控制,在這方面android的確存在很多有待進(jìn)步的空間齐邦,這也是google以及各大手機(jī)廠商一直努力改善的地方之一椎侠。在Android 6.0,google對(duì)于app的權(quán)限問(wèn)題作為較多的努力措拇,大大收緊的應(yīng)用權(quán)限我纪;另外,在Google舉辦的Android Bootcamp 2016大會(huì)中,google也表示在Android 7.0 (也叫Android N)的權(quán)限隱私方面會(huì)進(jìn)一步加強(qiáng)加固宣羊,比如SELinux璧诵,Memory safe language(還在research中)等等,在今年的5月18日至5月20日仇冯,google將推出Android N之宿。

話題扯遠(yuǎn)了,繼續(xù)說(shuō)Binder苛坚。

(4)從語(yǔ)言層面的角度
大家多知道Linux是基于C語(yǔ)言(面向過(guò)程的語(yǔ)言)比被,而Android是基于Java語(yǔ)言(面向?qū)ο蟮恼Z(yǔ)句),而對(duì)于Binder恰恰也符合面向?qū)ο蟮乃枷肫貌眨瑢⑦M(jìn)程間通信轉(zhuǎn)化為通過(guò)對(duì)某個(gè)Binder對(duì)象的引用調(diào)用該對(duì)象的方法等缀,而其獨(dú)特之處在于Binder對(duì)象是一個(gè)可以跨進(jìn)程引用的對(duì)象,它的實(shí)體位于一個(gè)進(jìn)程中娇昙,而它的引用卻遍布于系統(tǒng)的各個(gè)進(jìn)程之中尺迂。可以從一個(gè)進(jìn)程傳給其它進(jìn)程冒掌,讓大家都能訪問(wèn)同一Server噪裕,就像將一個(gè)對(duì)象或引用賦值給另一個(gè)引用一樣。Binder模糊了進(jìn)程邊界股毫,淡化了進(jìn)程間通信過(guò)程膳音,整個(gè)系統(tǒng)仿佛運(yùn)行于同一個(gè)面向?qū)ο蟮某绦蛑小恼Z(yǔ)言層面铃诬,Binder更適合基于面向?qū)ο笳Z(yǔ)言的Android系統(tǒng)祭陷,對(duì)于Linux系統(tǒng)可能會(huì)有點(diǎn)“水土不服”。

另外趣席,Binder是為Android這類系統(tǒng)而生兵志,而并非Linux社區(qū)沒(méi)有想到Binder IPC機(jī)制的存在,對(duì)于Linux社區(qū)的廣大開(kāi)發(fā)人員吩坝,我還是表示深深佩服毒姨,讓世界有了如此精湛而美妙的開(kāi)源系統(tǒng)哑蔫。也并非Linux現(xiàn)有的IPC機(jī)制不夠好钉寝,相反地,經(jīng)過(guò)這么多優(yōu)秀工程師的不斷打磨闸迷,依然非常優(yōu)秀嵌纲,每種Linux的IPC機(jī)制都有存在的價(jià)值,同時(shí)在Android系統(tǒng)中也依然采用了大量Linux現(xiàn)有的IPC機(jī)制腥沽,根據(jù)每類IPC的原理特性逮走,因時(shí)制宜,不同場(chǎng)景特性往往會(huì)采用其下最適宜的今阳。比如在Android OS中的Zygote進(jìn)程的IPC采用的是Socket(套接字)機(jī)制师溅,Android中的Kill Process采用的signal(信號(hào))機(jī)制等等茅信。而Binder更多則用在system_server進(jìn)程與上層App層的IPC交互

(5) 從公司戰(zhàn)略的角度

總所周知墓臭,Linux內(nèi)核是開(kāi)源的系統(tǒng)蘸鲸,所開(kāi)放源代碼許可協(xié)議GPL保護(hù),該協(xié)議具有“病毒式感染”的能力窿锉,怎么理解這句話呢酌摇?受GPL保護(hù)的Linux Kernel是運(yùn)行在內(nèi)核空間,對(duì)于上層的任何類庫(kù)嗡载、服務(wù)窑多、應(yīng)用等運(yùn)行在用戶空間,一旦進(jìn)行SysCall(系統(tǒng)調(diào)用)洼滚,調(diào)用到底層Kernel埂息,那么也必須遵循GPL協(xié)議。

而Android 之父 Andy Rubin對(duì)于GPL顯然是不能接受的遥巴,為此耿芹,Google巧妙地將GPL協(xié)議控制在內(nèi)核空間,將用戶空間的協(xié)議采用Apache-2.0協(xié)議(允許基于Android的開(kāi)發(fā)商不向社區(qū)反饋源碼)挪哄,同時(shí)在GPL協(xié)議與Apache-2.0之間的Lib庫(kù)中采用BSD證授權(quán)方法吧秕,有效隔斷了GPL的傳染性,仍有較大爭(zhēng)議迹炼,但至少目前緩解Android砸彬,讓GPL止步于內(nèi)核空間,這是Google在GPL Linux下 開(kāi)源與商業(yè)化共存的一個(gè)成功典范斯入。

有了這些鋪墊砂碉,我們?cè)僬f(shuō)說(shuō)Binder的今世前緣

Binder是基于開(kāi)源的 OpenBinder實(shí)現(xiàn)的,OpenBinder是一個(gè)開(kāi)源的系統(tǒng)IPC機(jī)制,最初是由 Be Inc.開(kāi)發(fā)刻两,接著由Palm, Inc.公司負(fù)責(zé)開(kāi)發(fā)增蹭,現(xiàn)在OpenBinder的作者在Google工作,既然作者在Google公司磅摹,在用戶空間采用Binder 作為核心的IPC機(jī)制滋迈,再用Apache-2.0協(xié)議保護(hù),自然而然是沒(méi)什么問(wèn)題户誓,減少法律風(fēng)險(xiǎn)饼灿,以及對(duì)開(kāi)發(fā)成本也大有裨益的,那么從公司戰(zhàn)略角度帝美,Binder也是不錯(cuò)的選擇碍彭。

另外,再說(shuō)一點(diǎn)關(guān)于OpenBinder,在2015年OpenBinder以及合入到Linux Kernel主線 3.19版本庇忌,這也算是Google對(duì)Linux的一點(diǎn)回饋吧舞箍。

綜合上述5點(diǎn),可知Binder是Android系統(tǒng)上層進(jìn)程間通信的不二選擇皆疹。


接著创译,回答樓主提到的D-Bus

也采用C/S架構(gòu)的IPC機(jī)制,D-Bus是在用戶空間實(shí)現(xiàn)的方法墙基,效率低软族,消息拷貝次數(shù)和上下文切換次數(shù)都明顯多過(guò)于Binder。針對(duì)D-Bus這些缺陷残制,于是就產(chǎn)生了kdbus立砸,這是D-Bus在內(nèi)核實(shí)現(xiàn)版,效率得到提升初茶,與Binder一樣在內(nèi)核作為字符設(shè)計(jì)颗祝,通過(guò)open()打開(kāi)設(shè)備,mmap()映射內(nèi)存恼布。

(1)kdbus在進(jìn)程間通信過(guò)程螺戳,Client端將消息在內(nèi)存的消息隊(duì)列,可以存儲(chǔ)大量的消息折汞,Server端不斷從消息隊(duì)里中取消息倔幼,大小只受限內(nèi)存;
(2)Binder的機(jī)制是每次通信爽待,會(huì)通信的進(jìn)程或線程中的todo隊(duì)里中增加binder事務(wù)损同,并且每個(gè)進(jìn)程所允許Binder線程數(shù),google提供的默認(rèn)最大線程數(shù)為16個(gè)鸟款,受限于CPU膏燃,由于線程數(shù)太多,增加系統(tǒng)負(fù)載何什,并且每個(gè)進(jìn)程默認(rèn)分配的(1M-8K)大小的內(nèi)存组哩。

而kdbus對(duì)于內(nèi)存消耗較大,同時(shí)也適合傳輸大量數(shù)據(jù)和大量消息的系統(tǒng)处渣。Binder對(duì)CPU和內(nèi)存的需求比較低伶贰,效率比較高,從而進(jìn)一步說(shuō)明Binder適合于移動(dòng)系統(tǒng)Android霍比,但是幕袱,也有一定缺點(diǎn)暴备,就是不同利用Binder輸出大數(shù)據(jù)悠瞬,比如利用Binder傳輸幾M大小的圖片,便會(huì)出現(xiàn)異常,雖然有廠商會(huì)增加Binder內(nèi)存浅妆,但是也不可能比系統(tǒng)默認(rèn)內(nèi)存大很多望迎,否則整個(gè)系統(tǒng)的可用內(nèi)存大幅度降低。

最后凌外,簡(jiǎn)單講講Android Binder架構(gòu)

Binder在Android系統(tǒng)中江湖地位非常之高辩尊。在Zygote孵化出system_server進(jìn)程后,在system_server進(jìn)程中出初始化支持整個(gè)Android framework的各種各樣的Service康辑,而這些Service從大的方向來(lái)劃分摄欲,分為Java層Framework和Native Framework層(C++)的Service,幾乎都是基于BInder IPC機(jī)制疮薇。

  1. Java framework:作為Server端繼承(或間接繼承)于Binder類胸墙,Client端繼承(或間接繼承)于BinderProxy類。例如 ActivityManagerService(用于控制Activity按咒、Service迟隅、進(jìn)程等) 這個(gè)服務(wù)作為Server端,間接繼承Binder類励七,而相應(yīng)的ActivityManager作為Client端智袭,間接繼承于BinderProxy類。 當(dāng)然還有PackageManagerService掠抬、WindowManagerService等等很多系統(tǒng)服務(wù)都是采用C/S架構(gòu)吼野;

  2. Native Framework層:這是C++層,作為Server端繼承(或間接繼承)于BBinder類两波,Client端繼承(或間接繼承)于BpBinder箫锤。例如MediaPlayService(用于多媒體相關(guān))作為Server端,繼承于BBinder類雨女,而相應(yīng)的MediaPlay作為Client端谚攒,間接繼承于BpBinder類。

本文參考:
https://www.zhihu.com/question/39440766/answer/89210950
https://blog.csdn.net/boyupeng/article/details/47011383

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氛堕,一起剝皮案震驚了整個(gè)濱河市馏臭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讼稚,老刑警劉巖括儒,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锐想,居然都是意外死亡帮寻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門赠摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)固逗,“玉大人浅蚪,你說(shuō)我怎么就攤上這事√陶郑” “怎么了惜傲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贝攒。 經(jīng)常有香客問(wèn)我盗誊,道長(zhǎng),這世上最難降的妖魔是什么隘弊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任哈踱,我火速辦了婚禮,結(jié)果婚禮上梨熙,老公的妹妹穿的比我還像新娘嚣鄙。我一直安慰自己,他們只是感情好串结,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布哑子。 她就那樣靜靜地躺著,像睡著了一般肌割。 火紅的嫁衣襯著肌膚如雪卧蜓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天把敞,我揣著相機(jī)與錄音弥奸,去河邊找鬼。 笑死奋早,一個(gè)胖子當(dāng)著我的面吹牛盛霎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耽装,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愤炸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了掉奄?” 一聲冷哼從身側(cè)響起规个,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姓建,沒(méi)想到半個(gè)月后诞仓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡速兔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年墅拭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣狗。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谍婉,死狀恐怖舒憾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屡萤,我是刑警寧澤珍剑,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布掸宛,位于F島的核電站死陆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唧瘾。R本人自食惡果不足惜措译,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饰序。 院中可真熱鬧领虹,春花似錦、人聲如沸求豫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝠嘉。三九已至最疆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚤告,已是汗流浹背努酸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杜恰,地道東北人获诈。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像心褐,于是被迫代替她去往敵國(guó)和親舔涎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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