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

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

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

Linux中進程相關概念


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

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

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

linux的用戶程序和進程

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

全部的進程構成一個以 init 爲根的樹狀結構,這是由於 Linux 內核 並不提供直接創建新進程的系統調用。剩下的全部進程都是 init 進程經過 fork 機制創建的。新的進程要經過老的進程複製自身獲得,這就是 fork。fork 是一個系統調用。函數

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

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

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

由於進程隔離的緣由,進程A和進程B之間不能直接進行通信。線程

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

進程間通訊方式(IPC)

雖然不一樣進程在用戶空間不能直接進行通信,但它們倒是共享一分內核空間。很顯然,當一個用戶進程想與另一個用戶進程進行通訊時,就能夠經過內核空間來完成了blog

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

推薦閱讀

image image

Android開發藝術探索image

相關文章
相關標籤/搜索