【Android】Binder機制 以及 爲什麼要使用Binder機制

之前在阿里二面的時候被問到了這個問題,面試官讓我講講Handler機制,我之前雖然瞭解過但是沒有深入研究過,稀裏糊塗說了一堆我自己都聽不懂的話,面試官也很無奈,說你說的我也沒大聽清(估計是我說的太亂了,面試官委婉的表示我的回答並不好),然後問我知道爲什麼要用Binder知道嗎,我想了會也沒想出一個好的理由,遂放棄,面完後查閱資料深入瞭解了一下Binder機制,以下是我的個人總結:

一句話總結:

ServerManager的作用是將字符形式的Binder名字轉化成Client中對該Binder的引用,使得Client能夠通過Binder名字獲得對Server中Binder實體的引用。

爲什麼要用Binder

先說說爲什麼用Binder吧,因爲Android是基於linux底層實現的,而linux已經有了幾個進程間通訊的方式,比如管道、消息隊列,共享內存,但是管道和消息隊列的實現方式大概是,一個提供服務的進程也就是發送方,將提供的數據從發送方的緩存區拷貝到內核的緩存區,然後接收方再開闢一塊緩存區,從內核緩存區將數據拷貝的自己的緩存區,期間需要進行兩次拷貝,而且拷貝過程中,接收方不知道需要開闢一塊多大的緩存區才能放得下發送方發送的數據,所以只能開闢一塊儘可能大的緩存區,這樣會造成空間的浪費,或者先通過進程通信瞭解到需要開闢多大的緩存區,再來開闢緩存區,這樣雖然不會造成空間上的浪費但是會造成時間上的浪費,而共享內存不用進行數據的拷貝,但是對於數據的訪問難以控制,安全性不好,所以Android提供了一個Binder機制,用於進程間的通信。

Binder機制及原理

Binder基於Client和Server通信模式,提供數據或者是服務的發送方相當於Server,需要請求服務的相當於Client,整個Binder機制有四個重要的部分,分別是Client,Server,ServerManager和Binder,首先Server創建一個Binder的實體,爲這個Binder起一個名字,然後將這個Binder和名字一塊發送給ServerManager,讓ServerManagerqu去註冊這個Binder,ServerManager收到以後去內核區創建一個Binder的實體,同時自己持有這個Binder的引用。
這裏還有一點是server和serverManager是處於不同的進程的,server通知serverManager註冊Binder的時候,也用到了Binder來實現進程間的通訊,就好像我要一隻雞,但是前提需要有個雞蛋,而雞蛋必須雞才能下下來, Android採取的方式是先創造一隻雞來下蛋,serverManager在註冊的時候會自動創建一個Binder實體,編號爲0,這是內核裏創建出來的第一個Binder實體,剛纔提到的,提供數據或服務的server,相對於serverManager來說就是一個Client,server通過那個編號0獲取第一個Binder的引用,藉此來完成與serverManager的通信。
Server中的Binder實體在serverManager裏註冊完後,Client通過那個編號爲0的Binder與serverManager通信,告訴serverManager他想要請求哪個server,然後告訴serverManager它所要請求的server所持有的Binder的名字,serverManager收到Client的請求信息後,通過Client發送的Binder名字,在已經註冊的索引表中找到對應的Binder,將這個Binder的引用發回給Client,Client就可以通過這個Binder的引用,來獲取Server中的數據或者使用Server中的服務了。

實名Binder與匿名Binder

上面所說的是實名Binder,因爲一個Server的Binder在serverManager裏註冊以後,任何一個Client都可以獲取到這個Binder的名字,進而獲取Server中的數據或者使用Server中的服務,還有一種方式是匿名Binder,匿名Binder是建立在實名Binder基礎上的,當一個Client通過實名Binder獲取到Binder的引用後,他就可以和持有這個實名Binder實體的Server進行通信了,就相當於Client和Server建立了連接,–然後Server可以將它內部的另一個匿名Binder實體的引用,通過這個連接發送給Client,Client通過這個Binder與Server建立了第二條連接,這個連接是私密的,是一對一的,實名Binder是多對一的,匿名的意思是說這個Binder是沒有在ServerManager裏註冊的,這個匿名Binder並沒有名字,只要Server沒有主動將這個Binder的引用發送給其他Client,其他的Client就不能獲取這個Binder的引用,也就不能通過這個私密的Binder與Server建立私密連接,而只能通過已經在ServerManager裏註冊的Binder來建立連接。

Binder優點

Binder的優點在於數據傳輸速率比較快,相比於傳統的IPC管道通信,Binder只需要進行一次數據的拷貝,而且每一個進程都有對應的ID,安全性也比較高。
關於Binder爲什麼只需要進行一次數據的拷貝,因爲Binder是server創建的,而serverManager又在內核區創建了了Binder的實體,當server需要發送數據給client的時候,他知道server要發送的數據的大小,然後通知client開闢出一塊這麼大的內存,然後數據直接從server拷貝到了client開闢出的內存區,這樣client就可以訪問這些數據了。

大概就這些了,以上是我根據大佬的博客總結出來的,我將Binder總結成比較容易講述的語言以便我面試的時候和面試官交流,想深入瞭解Binder原理請查看此篇博客:

作者:universus 來源:CSDN 原文:https://blog.csdn.net/universus/article/details/6211589
感謝大佬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章