Android源碼(7) --- Binder(1) Linux IPC 機制

Linux IPC 機制

IPC(InterProcess Communication)進程間通訊,我們都知道Android內核其實就是Linux內核,而每個Android Application進程其實就是一個Linux進程,Linux 已經有比較好的IPC機制,爲什麼Android用Binder實現IPC機制呢?,分析Linux 一下的IPC 機制,方便深入理解Android Binder機制。

Linux 現有IPC機制

  • 1.管道(pipe)
  • 2.信號量
  • 3.信號
  • 4.消息隊列
  • 5.共享內存
  • 6.socket

管道

  • 數據拷貝兩次(讀取端 & 寫入端)
  • 藉助內核緩存區(4K 限制)

信號量

  • 資源共享,(PV操作)信號量提供互斥鎖,防止多進程訪問資源衝突。主要用於多進程和多線程的同步手段

信號

  • 進程間通信外,進程還可以發送信號給進程本身,多用於消息傳遞 & 通知,不適合傳遞信息。

消息隊列

  • 數據拷貝兩次,數據有最大限制。

共享內存

  • 可直接加載到內存,但是不提供同步工具,需要結合類似信號量使用。

socket

  • 傳輸效率低,C/S架構,多用於跨網絡,跨設備的通信

參考

參考Gityuan 分析的Binder的結果

爲什麼選用Binder作爲Android IPC機制呢

  • 從性能來說,管道、消息隊列、Socket對數據都會進行兩次拷貝,耗費性能,而Binder只需要一次,對於移動設備來說,性能不得不考慮。
  • 從架構來看,C/S架構,功能分離明確,穩定性好
  • 最重要的一點,Linux IPC 無法鑑別身份,而Binder 可以鑑別用戶進程Uid,給予Android身份機制。
  • 從語言來說,Linux 是基於C語言面向過程,而Binder是基於Java面向對象來實現的。

貼出 Gityuan 的架構分析

最後,簡單講講Android
* Binder架構Binder在Android系統中江湖地位非常之高。在Zygote孵化出system_server進程後,在system_server進程中出初始化支持整個Android framework的各種各樣的Service,而這些Service從大的方向來劃分,分爲Java層Framework和Native Framework層(C++)的Service,幾乎都是基於BInder IPC機制。
* Java framework:作爲Server端繼承(或間接繼承)於Binder類,Client端繼承(或間接繼承)於BinderProxy類。例如 ActivityManagerService(用於控制Activity、Service、進程等) 這個服務作爲Server端,間接繼承Binder類,而相應的ActivityManager作爲Client端,間接繼承於BinderProxy類。 當然還有PackageManagerService、WindowManagerService等等很多系統服務都是採用C/S架構;
* Native Framework層:這是C++層,作爲Server端繼承(或間接繼承)於BBinder類,Client端繼承(或間接繼承)於BpBinder。例如MediaPlayService(用於多媒體相關)作爲Server端,繼承於BBinder類,而相應的MediaPlay作爲Client端,間接繼承於BpBinder類。

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