Android(IPC)進程間通訊1:詳解Binder由來?

完整原文:http://tryenough.com/android-ipc1

Android開發的進程間通訊,整個Android的應用都依賴於binder做底層通信機制。而Linux中提供的進程間通訊方式並沒有binder機制,那麼android中爲什麼要單獨創造這種通訊方式呢?帶着這個問題,繼續往下讀。

Linux中進程相關概念


Linux將系統內存劃分成了 用戶空間內核空間 兩部分:

用戶空間 : 普通應用程序則運行在用戶空間上,它們不能使用某些特定的系統功能,不能直接訪問硬件,不能直接訪問內核空間。
內核空間 : 系統的核心軟件會運行在較高的特權級別上,它們駐留在被保護的內存空間上,擁有訪問硬件設備的所有權限。

用戶程序只能運行在用戶空間,用戶空間訪問內核空間的唯一方式就是系統調用。

linux的用戶程序和進程

在linux中,所有的用戶程序執行時狀態都是進程。進程間存在父子關係來表示同一個用戶程序開啓的多個同步任務。

所有的進程構成一個以 init 爲根的樹狀結構,這是因爲 Linux 內核 並不提供直接建立新進程的系統調用。剩下的所有進程都是 init 進程通過 fork 機制建立的。新的進程要通過老的進程複製自身得到,這就是 fork。fork 是一個系統調用。

每個進程都在內存中分配有屬於自己的一片空間 (內存空間,包含棧、堆、全局靜態區、文本常量區、程序代碼區)。進程之間相互隔離資源:

  • 進程隔離是爲保護進程之間互不干擾的執行。
  • 進程隔離技術使用了虛擬地址空間,即進程A的虛擬地址和進程B的虛擬地址不同,這樣就防止進程A將數據信息寫入進程B。

完整原文:http://tryenough.com/android-ipc1

因爲進程隔離的原因,進程A和進程B之間不能直接進行通訊。

但是開發中,總難免要遇到進程通訊的地方(例如一個應用不通進程之間相互傳遞數據等場景)。

進程間通信方式(IPC)

雖然不同進程在用戶空間不能直接進行通訊,但它們卻是共享一份內核空間。很顯然,當一個用戶進程想與另外一個用戶進程進行通信時,就可以通過內核空間來完成了

Linux中常見的進程間通訊的幾種方式:

  • 1.管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通信;

  • 2.信號(Signal):信號是比較複雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數);

  • 3.報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。

  • 4.共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

  • 5.信號量(semaphore):主要作爲進程間以及同一進程不同線程之間的同步手段。

  • 6.套接口(Socket):更爲一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

完整原文:http://tryenough.com/android-ipc1

上面的6種都是內核裏的程序:

進程A發起請求給內核裏的程序,內核裏的程序再將請求轉發給進程B,從而達到進程間通信。

Android中的Binder誕生

Android系統通過Linux的動態可加載內核模塊,添加一個內核模塊運行在內核空間,用戶進程之間的通過這個模塊作爲橋樑,就可以完成通信。就是我們後面要涉及到的:Binder驅動。

google通過新增內核模塊完成了進程間通信協議的實現,然後使用binder驅動來調用這個新增的內核模塊,來爲上層應用提供接口,最後在framework層封裝這個接口來提供 java API 調用接口。

Android系統爲什麼需要再實現一個進程間通信協議Binder呢?

  • 在移動設備上,Binder的傳輸效率和可操作性很好。
  • Binder機制能夠很好地實現Client-Server架構。
  • Binder機制的安全性高。
    • 傳統方式對於通信雙方的身份並沒有做出嚴格的驗證,只有在上層協議上進行架設;
    • 比如Socket通信ip地址是客戶端手動填入的,都可以進行僞造;
    • 而Binder機制從協議本身就支持對通信雙方做身份校檢,因而大大提升了安全性。

感謝您的閱讀,本系列會繼續創作關於android中進程通訊的具體用法。歡迎前來觀望。

完整原文:http://tryenough.com/android-ipc1

推薦閱讀

Android開發藝術探索

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