Binder總結

Binder簡介

Binder是Android系統進程通信的方式之一。我們都知道android系統是基於linux的,linux爲了避免進程之間的干擾進程之間是隔離的,一個進程內又分爲內核空間和用戶空間。這個隔離也是分爲兩部分,進程間隔離和進程內的隔離。那既然存在隔離也就存在通信,進程間的通信就是IPC。用戶空間和內核空間的通信就是系統調用。

android系統是基於linux的,也需要解決進程間的通信。這個方式就是binder。但是linux本身也是有直接的IPC方式,包括管道、socket 、消息隊列和共享內存,爲什麼不使用這些呢,我認爲是出於性能和安全性的考慮。

  1,性能 socket是一個通用的通信接口,效率低開銷大主要用來進行跨網絡的進程間通信。消息隊列和管道呢是需要複製兩次數據

需要先從發送方的緩衝區拷貝到內核開闢的緩存區中,然後再拷貝到接收方的緩存區中,至少需要兩次數據拷貝。而binder呢只需要一次。

  2,安全性:Android作爲一個開放式的開發平臺需要保證終端數據的安全,linux的IPC方式呢沒有安全的身份驗證機制。因此在Andoird中出現了binder自帶身份驗證而且性能較高的這種IPC進程間通信方式。

Binder通信模型

Binder由四部分組成,分別是server、client、serviceManager和binder驅動,server client serviceManager運行在用戶空間,驅動運行在內核空間中。這個四個部分跟互聯網類似,server是服務器,client是客戶端,serviceManager是(DNS)域名服務器,驅動是路由器。

binder驅動呢雖然叫做驅動但它和硬件沒有關係,主要是實現方式和硬件驅動類似。它工作再內核空間中提供mmap ioctl這些標準的文件操作,負責進程間binder通信的建立 數據包的傳遞和交互等一系列底層的支持。驅動和應用程序之間定義了一套接口協議主要是由ioctl完成,一次調用完成先讀後寫滿足同步交互,不必分別調用read和write。

serviceManager的作用是將字符形式的binder名字轉化成client對binder對象的引用,使得client能夠通過binder名字獲得server中binder實體的引用,

通信流程: 1,server服務端通過dinder驅動在serviceManager中註冊我們的服務

2,客戶端通過binder驅動查詢對應server在serviceManager中註冊的服務

3,serviceManager返回通過binder驅動返回服務端的代理對象

4,client拿到返回的服務端代理對象就可以進行進程間通信機制。

Binder內存映射

Binder驅動負責管理數據和接收緩存,實現了mmap系統調用來創建接收數據的緩存空間。通過mmap()在接收方開闢一個緩存空間,這個mmap的返回值就是這個空間內存地址,這個空間是由驅動管理的,用戶不能直接進行訪問。空間創建好作爲接收數據的緩存池,通過ioctl()一次完成讀寫,數據傳遞完成。

 

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