Android Binder 跨進程通信

1.基本前提知識:

   1.1 進程隔離

     1.LINUX 中 每個進程有自己的虛擬內存空間,操作系統將這種虛擬內存空間映射到物理內存空間 ,每個進程不能操作其他進程的內存空間;

     2.只有操作系統纔有權限操作物理內存空間;

     3.  1 和 2  保證了進程的內存安全;

   1.2 用戶空間和內核空間

  • 用戶空間:表示進程運行在一個特定的操作模式中,沒有接觸物理內存或設備的權限
  • 內核空間:表示獨立於普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限
  • (2位操作系統而言,它的尋址空間(虛擬存儲空間)爲4G ,了保證用戶進程不能直接操作內核,保證內核的安全,操心繫統將虛擬空間劃分爲兩部分,一部分爲內核空間,一部分爲用戶空間。針對linux操作系統而言,將最高的1G字節,供內核使用,稱爲內核空間,而將較低的3G字節,供各個進程使用,稱爲用戶空間)

    1.3 內核模塊/驅動

  • 通過系統調用,用戶空間可以訪問內核空間 :Linux的動態可加載內核模塊機制解決了這個問題,模塊是具有獨立功能的程序,它可以被單獨編譯,但不能獨立運行;
  • Android系統可以通過添加一個內核
  • 傳統的進程:通信方式對於通信雙方的身份並沒有做出嚴格的驗證,只有在上層協議上進行架設
  • 模塊運行在內核空間,用戶進程之間的通過這個模塊作爲橋樑,就可以完成通信了
  • 在Android系統中,這個運行在內核空間的,負責各個用戶進程通過Binder通信的內核模塊叫做Binder驅動
  • (用戶空間:用戶進程A <---> 內核空間:Binder驅動 <---> 用戶空間:用戶進程B)
  1. Linux的虛擬內存機制導致內存的隔離,進而導致進程隔離
  2. 進程隔離的出現導致對內存的操作被劃分爲用戶空間和內核空間
  3. 用戶空間需要跨權限去訪問內核空間,必須使用系統調用去實現
  4. 系統調用需要藉助內核模塊/驅動去完成

 

2.Binder 的優勢:

LINUX 中有:管道、消息隊列、信號量、內存共享、套接字等跨進程方式 ;

2.1 傳輸性能好

  • Socket:是一個通用接口,導致其傳輸效率低,開銷大
  • 共享內存:雖然在傳輸時不需要拷貝數據,但其控制機制複雜
  • Binder:複雜數據類型傳遞可以複用內存,需要拷貝1次數據
  • 管道和消息隊列:採用存儲轉發方式,至少需要拷貝2次數據,效率低

2.2 安全性好

  • 傳統的進程:通信方式對於通信雙方的身份並沒有做出嚴格的驗證,只有在上層協議上進行架設
  • Binder機制:從協議本身就支持對通信雙方做身份校檢,因而大大提升了安全性

3.Binder 通信原理

  1. Service端通過Binder驅動在ServiceManager的查找表中註冊Object對象的add方法
  2. Client端通過Binder驅動在ServiceManager的查找表中找到Object對象的add方法,並返回proxy對象的add方法,add方法是個空實現,proxy對象也不是真正的Object對象,是通過Binder驅動封裝好的代理類的add方法
  3. 當Client端調用add方法時,Client端會調用proxy對象的add方法,通過Binder驅動去請求ServiceManager來找到Service端真正對象,然後調用Service端的add方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章