文章目錄
文章目錄
前言
一、Binder是什么?
二、為什么要使用Binder
三、IPC機制原理
傳統IPC機制如何實作跨行程通信
Binder IPC機制原理
小結
前言
記得剛開始做Andorid那會,面試時最怕被問到Binder,就感覺戰戰兢兢不知道從什么地方說起,導致后來一直有一種恐懼感,當然現在沒有這種感覺了,但是這塊知識點一直模模糊糊的,最近在學Andorid framework課程,借此機會簡單總結下其中Binder相關知識點,
一、Binder是什么?
Binder是Android中一種行程間通信機制,我們平時使用的Activity、Service、Broadcast Receive等組件之間的通信,以及組件與系統層的AMS、PMS等服務間的通信,都是基于Binder的行程間通信機制來實作的,相當于是Android中的血管,可見Binder機制在Android中非常重要,這里要知道的是,Zygote行程的IPC采用的是Socket機制,因為這時Binder還未初始化,
從代碼層面來說,Binder是一個能發起通信的Java類,AIDL中Stub類即繼承自Binder,具有跨行程的能力,
Binder是一個虛擬的物理設備驅動,提供跨行程的能力,
二、為什么要使用Binder
Android系統的基礎是Linux內核,而Linux中實作IPC的機制有管道、訊息佇列、共享記憶體、Socket、信號量、信號這些,為什么Android還要另起爐灶呢?主要是性能、安全、易用性等方面的原因,
性能上來說資料拷貝次數越少越好,什么是拷貝下文再介紹,傳統IPC機制(Socket、管道、訊息佇列等)都是拷貝兩次,共享記憶體雖然無需拷貝,但會有安全、死鎖、易用性差等問題,Binder只需拷貝一次,因此性能僅次于共享記憶體優于Socket,
安全性上來說Binder會為每個APP分配唯一的UID,Binder根據UID可以找到對應APP,傳統IPC依賴上層協議是不安全的,無法獲得對方的UID從而不能鑒別身份,傳統IPC訪問接入點是開放的,相當于誰都可以訪問;Binder既有實名服務又有匿名服務,實名就跟傳統IPC一樣,誰都可以訪問,AMS、WMS都是實名服務,匿名類似于打滴滴,用戶直接聯系不到司機,需要通過滴滴(系統)平臺拿到司機號碼,通過系統拿到服務的代理物件,再通過代理物件找到服務,Binder實名和匿名區別在于有沒有在ServiceManager注冊,注冊了即為實名,沒注冊稱為匿名,我們自己使用AIDL等方式一般為匿名,
幾種IPC機制對比
| Binder | 共享記憶體 | Socket | |
|---|---|---|---|
| 性能 | 一次拷貝 | 無需拷貝 | 兩次拷貝 |
| 特點 | 基于C/S架構, 易用性高 | 控制復雜, 易用性差 | 傳輸效率低, 開銷大 |
| 安全性 | 為每個APP分配UID, 同時支持實名和匿名 | 依賴上層協議, 訪問接入點是開放的 不安全 | 依賴上層協議, 訪問接入點是開放的 不安全 |
三、IPC機制原理
傳統IPC機制如何實作跨行程通信
一個行程中的記憶體被作業系統分為用戶空間(用戶態)和內核空間(內核態),用戶空間是用戶程式代碼運行的地方,內核空間是系統內核代碼運行的地方,為了保護用戶不能直接操作內核,兩者是隔離的,用戶空間可以申請系統呼叫來傳遞資料,從用戶空間拷貝到內核空間通過copy_from_user函式(內核態), 從內核空間拷貝到用戶空間通過copy_to_user函式(用戶態),用戶態和內核態之間轉換有一個背景關系切換非常消耗時間,
資料拷貝,指的就是copy_from_user或copy_to_user呼叫了幾次系統呼叫(syscall),
虛擬記憶體和物理記憶體(記憶體條)關系,虛擬記憶體通過記憶體管理單元(MMU管理映射)映射到物理記憶體,所有行程內核空間映射到同一塊物理記憶體(記憶體共享),每個用戶空間則映射到不同的物理記憶體,
傳統IPC機制兩次拷貝:呼叫一次系統呼叫將資料從用戶空間拷貝到內核空間,然后通過copy_to_user將資料從內核空間拷貝到另一行程的用戶空間,完成行程間通信,如下圖所示

Binder IPC機制原理
傳統IPC機制需要兩次拷貝,而Binder IPC只需一次拷貝,如何實作的?
記憶體映射(mmap):Linux通過將一個虛擬記憶體區域與一個磁盤上的物件關聯起來,以初始化這個虛擬記憶體區域的內容,這個程序稱為記憶體映射(memory mapping),
實作映射關系后,就可以采用指標的方式讀寫操作這一段記憶體,而系統會自動回寫到對應的檔案磁盤上,
Binder就是通過記憶體映射將發送端內核空間和接收端用戶空間指向同一塊物理記憶體,這樣就可以共享這塊記憶體,當資料發送端通過系統呼叫將資料copy到內核空間,因此也就相當于把資料發送到了接收端的用戶空間,這樣就只有發送端的一次系統呼叫,所以只有一次拷貝,如下圖所示:

小結
Binder基于C/S架構,安全性好,易用性高,在Android中的位置非常重要,Binder里的知識點相當復雜,本文只是對一些概念的粗淺理解,如有不足的地方歡迎評論交流,如果覺得文章還不錯的話,點擊下方鏈接給我投個票吧,十分感謝!
我正在參加年度博客之星評選,請大家幫我投票打分,您的每一分都是對我的支持與鼓勵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398717.html
標籤:其他
