1. 程式人生 > >Linux與android程序間的通訊及android Binder機制詳解

Linux與android程序間的通訊及android Binder機制詳解

關於程序之間的通訊又很多種方式,不同的方式適用於不同的場景。

五種不同形式的IPC形式

1.訊息傳遞(管道,FIFO和訊息佇列)

2.同步(互斥量,條件變數,讀寫鎖,檔案和記錄鎖,訊號量)

3.共享記憶體(匿名的和具名的)

4.遠端過程呼叫(Solaris門和Sun RPC 以及Android Binder)

5.通過計算機網路通訊的程式,使用TCP/IP協議族API(跨網路IPC)

1.管道(pipe)

特點:單向的,具有“讀取”端和“寫入”端,容量有限。

2.Signal 實時訊號量

3.Trace 跟蹤

以上三種只適合父程序與子執行緒或者 兄弟程序之間的通訊

4.System V 之 報文佇列(Message

5.System V 之  共享記憶體(ShareMessage)

實現共享記憶體的步驟

1.建立記憶體共享區

2.對映記憶體區

3.訪問記憶體共享區

4.程序間通訊

5.撤銷記憶體對映區

6.刪除記憶體共享區

6.System V 之 訊號量 (Semaphore)

訊號量與PV原語是由Dijkstra發明的,也是使用最為廣泛的互斥方法之一。

P操作的執行過程

  • 訊號量S自減1
  • 如果此時S依然>=0。說明共享資源此時是允許訪問的,因而呼叫者直接返回,然後開始操作共享資源
  • 否則的話就要等待別人主動釋放資源,這種情況呼叫者會被加入等待序列,直到後續被喚醒
  • 當某人釋放了共享資源後,等待佇列中的相關(取決於具體情況)物件會被喚醒,此時該物件具備訪問資源的權力
V操作執行的過程
  • 訊號量S自增1
  • 此時如果S>0 ,說明當前沒有希望訪問資源的等待者,所以直接返回
  • 否則V操作要喚醒等待佇列中的相關物件,對應P操作中的最後一步。

7.基於TCP/IP的Socket IPC通訊

8.同步

由Posix執行緒標準定義的兩種同步形式:互斥鎖(Mutex)、讀寫鎖和條件變數。

Mutex 中文釋義為互斥體。

它與Semaphore的區別:

如果允許多個變數同時訪問,稱為Counting Semaphores;而對於只允許取值0或1 則叫做Binary Semaphore 後者與Mutex具有相同的性質。

Mutex通常對某一排他資源的共享控制要麼資源被佔用(locked)要麼就是可以訪問(unlocked)。

 兩者沒有本質區別

管程 :它實際是對Semaphore的擴充套件和延伸,是一種控制更為簡單的同步手段

9.Unix Domain Socket

UDS是專門針對單機內的程序間通訊提出來的,有時被稱為IPC socket。實際實現機制不依賴於TCP/IP協議族。

  1. 服務端監聽IPC請求
  2. 客戶端發起IPC申請
  3. 雙方成功建立IPC連線
  4. 客戶端向服務端傳送資料,證明IPC通訊有效

10.System V 訊息佇列,訊號量,和共享記憶體與 Posix  訊息佇列,訊號量,和共享記憶體的區別?

11.android中的同步機制

Mutex

Condition:是條件變數在android系統中的實現類,

Barrier:同時基於Mutex和Condition實現的一個模型,

Android Binder 

Socket作為一款通用的介面,其傳輸效率低,開銷大,主要用在跨網路的程序間通訊和本機程序間的低速通訊。

訊息佇列和管道採取儲存-轉發方式,即資料先從傳送方快取區拷貝到核心開闢的緩衝區中,再從核心緩衝區拷貝到接收方快取區,至少兩次拷貝過程。

共享記憶體雖然無需拷貝,但是控制複雜,難以使用。

Binder只需拷貝一次

傳統IPC沒有任何安全做措施,完全依賴上層協議來確保。

這時android需要建立一套新的IPC機制來滿足系統對通訊的要求

Binder提供遠端呼叫(Remote Procedure Cails)功能,可以讓C++或者Java的物件例項從一個程序遷移到另一個程序,從而透明地實現跨程序的呼叫面向對象思想的引入將程序間通訊化為通過對Binder的引用調的方,特之處在於Binder是一個可以程序引用的對,它的實體位於一個程序中,它的引用卻遍佈於系統的各個程序之中。最人的是,這個引用和java引用一樣可以是強類型,也可以是弱類型,而且可以從一個程序傳其它程序,讓大家都能訪問同一Server,就將一個對象或引用賦值給另一個引用一樣。Binder了程序邊界,化了程序間通訊過程,個系統彷彿執行於同一個面向對的程式之中。形形色色Binder以及星羅棋佈的引用彷彿粘接各個應用程式的膠水,這也是Binder的原意 

主要組成部分:Server ,Client ,ServiceManager 以及Binder驅動

1.binder驅動:

它位於核心,是通訊的核心,負責程序之間Binder通訊的建立,Binder在程序之間的傳,Binder引用計數管理,資料包在程序之間的傳互等一系列底層支援。 

2.ServiceManager(SMgr)

DNS類似,SMgr的作用是將字元形式的Binder名字轉Client中對Binder的引用,使Client通過Binder名字ServerBinder實體的引用。

3.Server

Server建立一個Binder實體,Client在獲得實體引用後,向Server傳送資料,Server收到資料後做出相應的處理。

4.Client

ServerSMgr註冊Binder實體及其名字後,Client就可以通過名字得該Binder的引用了

完成一次通訊的過程

1.客戶端程序呼叫Stub介面

2.Stub根據系統的要求進行打包

3.核心來完成與伺服器的具體互動,它負責將客戶端的資料傳送給服務端核心

4.服務端Stub解包,並呼叫與資料包匹配的程序

5.程序執行操作

6.服務端以上述步驟的逆向過程返回給客戶端