Android Binder機制初識(一)
阿新 • • 發佈:2020-10-11
程序間通訊(IPC)
程序空間劃分
- 在Linux中,一個程序空間可以分為 使用者空間(User space) & 核心空間(Kernel space),即把程序內 使用者 & 核心 隔離開來;
- 使用者空間中的資料不可共享,核心空間中的資料可共享,這樣做的目的在於保證核心的安全;
- 程序內 使用者 與 核心 進行互動 稱為系統呼叫
程序隔離與通訊
- 程序間通訊(inter-Process Communication, IPC),是指兩個程序之間進行資料交換的過程。而在Linux系統中為了保證 安全性 & 獨立性,一個程序不能直接操作或者訪問另一個程序,即Android的程序是相互獨立、隔離的。
- 隔離後,由於某些需求,程序間 需要合作 / 互動,主要分為兩步:1. 先通過程序間的核心空間進行 資料互動; 2. 再通過 程序內 的使用者空間 & 核心空間進行 資料互動,從而實現 程序間的使用者空間 的資料互動。
- 而上面的兩個程序間通訊 實質上是在核心區間中分配記憶體並開闢一塊核心快取區,通過copy_from_user函式將資料拷貝到到核心空間的緩衝區中,然後呼叫 copy_to_user() 函式將資料從核心快取區拷貝到接收程序。但這種IPC機制需要傳遞兩次資料,且傳遞資料儲存空間浪費,效率較為低下。
Binder機制
基於記憶體對映的Binder機制的出現解決了這個問題,使得程序間通訊效率大為提升。
- Binder 只需要拷貝一次資料,而一般的IPC需要拷貝兩次;
- 通過驅動核心空間拷貝資料,不需要額外的同步處理;
- 不會因為不知道資料的大小而浪費空間或者時間,效率更高。
Binder機制模型
Binder 跨程序通訊機制 模型 基於 Client - Server 模式,模型原理圖如下:
- Client程序: Android客戶端,使用服務的程序;
- Server程序:伺服器端,提供服務的程序;
- Service Manger程序:中轉站,管理Sevice註冊與查詢;
- Binder驅動:一種虛擬裝置驅動,連線Server程序、Client程序、ServerManger程序的橋樑,實現程序間資料傳遞與執行緒控制。
註冊服務
Service Manger 註冊 Server程序 資訊
- Server程序 向 Binder驅動 發起服務註冊請求;
- Binder驅動 將註冊請求轉發給 Service Manger程序;
- Service Manger程序 新增該 Server程序。
獲取服務
Client 與 Server建立連線
- Client程序 向 Binder驅動發起獲取服務的請求,傳遞要獲取的服務名稱;
- Binder驅動將該請求轉發給 Service Manger程序;
- Service Manger 查詢需要的Service 對應的伺服器資訊;
- 通過Binder驅動將上述服務資訊返回給Client程序。
使用服務
-
Client程序將引數資料傳送給Server程序:
- Client程序將需要傳送的資料放到 Client程序的共享記憶體;
- Binder驅動從Client程序的共享記憶體中讀取上述資料,並根據Service Manger 程序裡的Server資訊找到對應的Server程序;
- Binder驅動 把上述資料拷貝到Server程序的共享記憶體中,並通知Server程序執行解包。
-
Server程序根據Client程序要求呼叫目標方法:
- 收到Binder驅動驅動通知後,Server程序從執行緒池中取出執行緒,進行資料解包&呼叫目標方法;
- 將最終執行結果寫入自己的共享記憶體中。
-
Server程序將目標方法的結果返回給Client程序
- Binder驅動將Server程序的共享記憶體中的資料(目標方法執行結果)拷貝到Client程序的共享記憶體;
- 通知Client程序獲得返回結果(此時Client程序之前掛起的執行緒被重新喚醒)。