一、什么是Binder
Binder,一個通過內(nèi)存映射實現(xiàn)跨進(jìn)程通信的東東,Android中一個進(jìn)程空間分為用戶空間和內(nèi)核空間,其中用戶空間數(shù)據(jù)不可共享,內(nèi)核空間數(shù)據(jù)可共享。
因此跨進(jìn)程通信需要內(nèi)核空間的支持,傳統(tǒng)IPC通信例如管道,Socket等,它們是內(nèi)核空間的一部分,可以直接拷貝,通過內(nèi)容提供者進(jìn)程copy_from_user()拷貝到內(nèi)核空間,再通過copy_to_user()復(fù)制給內(nèi)容接收方用戶空間,實現(xiàn)的進(jìn)程間通信。
但是Binder不屬于Linux內(nèi)核空間,不能直接進(jìn)行內(nèi)核空間的兩次拷貝,所以需要借助Linux的動態(tài)內(nèi)核可加載模塊機(jī)制。
既然有現(xiàn)有的IPC方式,為什么重新設(shè)計一套Binder機(jī)制呢。主要是出于以上三個方面的考量:
高性能:從數(shù)據(jù)拷貝次數(shù)來看Binder只需要進(jìn)行一次內(nèi)存拷貝,而管道、消息隊列、Socket都需要兩次,共享內(nèi)存不需要拷貝,Binder的性能僅次于共享內(nèi)存。
穩(wěn)定性:上面說到共享內(nèi)存的性能優(yōu)于Binder,那為什么不適用共享內(nèi)存呢,因為共享內(nèi)存需要處理并發(fā)同步問題,控制負(fù)責(zé),容易出現(xiàn)死鎖和資源競爭,穩(wěn)定性較差。而Binder基于C/S架構(gòu),客戶端與服務(wù)端彼此獨立,穩(wěn)定性較好。
安全性:我們知道Android為每個應(yīng)用分配了UID,用來作為鑒別進(jìn)程的重要標(biāo)志,Android內(nèi)部也依賴這個UID進(jìn)行權(quán)限管理,包括6.0以前的固定權(quán)限和6.0以后的動態(tài)權(quán)限,傳榮IPC只能由用戶在數(shù)據(jù)包里填入UID/PID,這個標(biāo)記完全是在用戶空間控制的,沒有放在內(nèi)核空間,因此有被惡意篡改的可能,因此Binder的安全性更高。
延伸閱讀:
二、傳統(tǒng)IPC通信方式
Linux現(xiàn)有的進(jìn)程通信手段有以下幾種:
管道:在創(chuàng)建時分配一個page大小的內(nèi)存,緩存區(qū)大小比較有限; 消息隊列:信息復(fù)制兩次,額外的CPU消耗;不合適頻繁或信息量大的通信;
共享內(nèi)存:無須復(fù)制,共享緩沖區(qū)直接付附加到進(jìn)程虛擬地址空間,速度快;但進(jìn)程間的同步問題操作系統(tǒng)無法實現(xiàn),必須各進(jìn)程利用同步工具解決;
套接字:作為更通用的接口,傳輸效率低,主要用于不通機(jī)器或跨網(wǎng)絡(luò)的通信;
信號量:常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段;
信號: 不適用于信息交換,更適用于進(jìn)程中斷控制,比如非法內(nèi)存訪問,殺死某個進(jìn)程等。