Binder 詳解

什麼是 Binder

Binder 是一種進程間通信機制,基於開源的 OpenBinder 實現;OpenBinder 起初由 Be Inc. 開發,後由 Plam Inc. 接手。從字面上來解釋 Binder 有膠水、粘合劑的意思,顧名思義就是粘和不同的進程,使之實現通信。

Binder 的由來

我們知道,Android 系統就是運行在 Linux 系統之上。而 Linux 本身就具備一些跨進程通信的方式,比如:

1. 管道。性能損耗比較嚴重,一次通信需要 copy 兩次數據
2. 共享內存。管理比較混亂,容易出錯
3. socket。主要用於網絡通信,有點殺雞用牛刀。

出於 安全性穩定性性能的考慮,Android 系統提供了 Binder 進行 IPC 進程間通信

性能

Socket 作爲一款通用接口,其傳輸效率低,開銷大,主要用在跨網絡的進程間通信和本機上進程間的低速通信。消息隊列和管道採用存儲-轉發方式,即數據先從發送方緩存區拷貝到內核開闢的緩存區中,然後再從內核緩存區拷貝到接收方緩存區,至少有兩次拷貝過程。共享內存雖然無需拷貝,但控制複雜,難以使用。Binder 只需要一次數據拷貝,性能上僅次於共享內存。

穩定性

Binder 基於 C/S 架構,客戶端(Client)有什麼需求就丟給服務端(Server)去完成,架構清晰、職責明確又相互獨立,自然穩定性更好。共享內存雖然無需拷貝,但是控制負責,難以使用。從穩定性的角度講,Binder 機制是優於內存共享的。

安全性

Android 作爲一個開放性的平臺,市場上有各類海量的應用供用戶選擇安裝,因此安全性對於 Android 平臺而言極其重要。作爲用戶當然不希望我們下載的 APP 偷偷讀取我的通信錄,上傳我的隱私數據,後臺偷跑流量、消耗手機電量。
傳統的 IPC 沒有任何安全措施,完全依賴上層協議來確保。首先傳統的 IPC 接收方無法獲得對方可靠的進程用戶ID/進程ID(UID/PID),從而無法鑑別對方身份。
Android 爲每個安裝好的 APP 分配了自己的 UID,故而進程的 UID 是鑑別進程身份的重要標誌。傳統的 IPC 只能由用戶在數據包中填入 UID/PID,但這樣不可靠,容易被惡意程序利用。可靠的身份標識只有由 IPC 機制在內核中添加。其次傳統的 IPC 訪問接入點是開放的,只要知道這些接入點的程序都可以和對端建立連接,不管怎樣都無法阻止惡意程序通過猜測接收方地址獲得連接。
同時 Binder 既支持實名 Binder,又支持匿名 Binder,安全性高。

Binder 優勢總結

  • 性能:只需要 copy 一次數據,僅次於內存共享
  • 穩定性:基於 C/S 架構,架構清晰、職責明確又相互獨立
  • 安全性:爲每個 APP 都分配一個 UID,用於進程的身份識別

Binder 通信機制

首先從宏觀上看一下 Binder 是怎麼完成一次數據的跨進程傳輸的。

在這裏插入圖片描述

再來從微觀上看一下數據是怎麼進行傳遞的

在這裏插入圖片描述

上面兩個圖中涉及到了 Linux 中跨進程通信的一些概念

  1. 進程隔離
  2. 進程空間劃分:用戶空間(User Space)/內核空間(Kernel Space)
  3. 系統調用:用戶態/內核態

進程隔離

簡單的說就是操作系統中,進程與進程間內存是不共享的。兩個進程就像兩個平行的世界,A 進程沒法直接訪問 B 進程的數據,這就是進程隔離的通俗解釋。A 進程和 B 進程之間要進行數據交互就得采用特殊的通信機制:進程間通信(IPC)。

進程空間劃分:用戶空間(User Space)/內核空間(Kernel Space)

內核空間(Kernel)是系統內核運行的空間,用戶空間(User Space)是用戶程序運行的空間。爲了保證安全性,它們之間是隔離的。

系統調用:用戶態與內核態

雖然從邏輯上進行了用戶空間和內核空間的劃分,但不可避免的用戶空間需要訪問內核資源,比如文件操作、訪問網絡等等。爲了突破隔離限制,就需要藉助系統調用來實現。系統調用是用戶空間訪問內核空間的唯一方式,保證了所有的資源訪問都是在內核的控制下進行的,避免了用戶程序對系統資源的越權訪問,提升了系統安全性和穩定性。

Binder 四個重要角色

基本概念性東西都已經介紹完了,主要在於那兩張圖。圖中一共涉及四個重要角色 ServerClientServiceManagerBinder驅動

在這裏插入圖片描述

上面說到 Binder 是基於 B/S 架構設計,Client、Server、Service Manager 運行在用戶空間,Binder 驅動運行在內核空間。其中 Service Manager 和 Binder 驅動由系統提供,而 Client、Server 由應用程序來實現。
Client、Server 和 ServiceManager 均是通過系統調用 open、mmap 和 ioctl 來訪問設備文件 /dev/binder,從而實現與 Binder 驅動的交互來間接的實現跨進程通信。

這裏用一張圖來總結一下

在這裏插入圖片描述

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