Binder是Android平臺上一種跨進(jìn)程交互技術(shù)笑窜。
在Android應(yīng)用層次上耀里,基本上已經(jīng)沒有了進(jìn)程的概念。
但實(shí)現(xiàn)層上它還是需要構(gòu)建在進(jìn)程之上霞怀。Binder通信采用C/S架構(gòu)传货,從組件視角來說屎鳍,包含Client宏娄,Server问裕,ServiceManager以及binder驅(qū)動,其中ServiceManager用于管理系統(tǒng)中的各種服務(wù)孵坚。無論是注冊服務(wù)還是獲取服務(wù)的過程都需要ServiceManager粮宛,它是整個Binder通信機(jī)制的大管家窥淆。Client,Server巍杈,ServiceManager之間都是通過Binder驅(qū)動進(jìn)行交互的忧饭。Binder驅(qū)動位于內(nèi)核空間。Client筷畦,Server词裤,ServiceManager位于用戶空間。Binder驅(qū)動和ServiceManager可以看做事Android平臺的基礎(chǔ)架構(gòu)鳖宾,而Client和Server是Android的應(yīng)用層吼砂。
Binder通信一次拷貝原理,使用mmap內(nèi)存映射方式實(shí)現(xiàn)鼎文。虛擬進(jìn)程地址空間和虛擬內(nèi)核地址空間都映射到同一塊物理內(nèi)存空間渔肩。當(dāng)Client端與Server端發(fā)送數(shù)據(jù)時,Client先從自己的進(jìn)程空間把IPC通信數(shù)據(jù)copy_from_user拷貝到內(nèi)核空間拇惋,而Server端與內(nèi)核共享數(shù)據(jù)周偎,不需要再拷貝數(shù)據(jù),而是通過內(nèi)存地址空間偏移量撑帖,即可獲取內(nèi)存地址蓉坎。整個過程只發(fā)送一次拷貝。
linux系統(tǒng)除了使用mmap能實(shí)現(xiàn)0拷貝胡嘿,sendfile也可以實(shí)現(xiàn)0拷貝袍嬉,并且比mmap效率還高。