Linux IPC 機(jī)制
IPC(InterProcess Communication)進(jìn)程間通訊袖牙,我們都知道Android內(nèi)核其實(shí)就是Linux內(nèi)核,而每個(gè)Android Application進(jìn)程其實(shí)就是一個(gè)Linux進(jìn)程仙辟,Linux 已經(jīng)有比較好的IPC機(jī)制枚抵,為什么Android用Binder實(shí)現(xiàn)IPC機(jī)制呢瓢宦?,分析Linux 一下的IPC 機(jī)制搞动,方便深入理解Android Binder機(jī)制。
Linux 現(xiàn)有IPC機(jī)制
- 1.管道(pipe)
- 2.信號(hào)量
- 3.信號(hào)
- 4.消息隊(duì)列
- 5.共享內(nèi)存
- 6.socket
管道
- 數(shù)據(jù)拷貝兩次(讀取端 & 寫(xiě)入端)
- 借助內(nèi)核緩存區(qū)(4K 限制)
信號(hào)量
- 資源共享渣刷,(PV操作)信號(hào)量提供互斥鎖鹦肿,防止多進(jìn)程訪問(wèn)資源沖突。主要用于多進(jìn)程和多線程的同步手段
信號(hào)
- 進(jìn)程間通信外辅柴,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身箩溃,多用于消息傳遞 & 通知,不適合傳遞信息碌嘀。
消息隊(duì)列
- 數(shù)據(jù)拷貝兩次涣旨,數(shù)據(jù)有最大限制。
共享內(nèi)存
- 可直接加載到內(nèi)存股冗,但是不提供同步工具霹陡,需要結(jié)合類(lèi)似信號(hào)量使用。
socket
- 傳輸效率低止状,C/S架構(gòu)烹棉,多用于跨網(wǎng)絡(luò),跨設(shè)備的通信
參考
為什么選用Binder作為Android IPC機(jī)制呢
- 從性能來(lái)說(shuō),管道怯疤、消息隊(duì)列浆洗、Socket對(duì)數(shù)據(jù)都會(huì)進(jìn)行兩次拷貝,耗費(fèi)性能集峦,而B(niǎo)inder只需要一次伏社,對(duì)于移動(dòng)設(shè)備來(lái)說(shuō),性能不得不考慮塔淤。
- 從架構(gòu)來(lái)看摘昌,C/S架構(gòu),功能分離明確高蜂,穩(wěn)定性好
- 最重要的一點(diǎn)第焰,Linux IPC 無(wú)法鑒別身份,而B(niǎo)inder 可以鑒別用戶進(jìn)程Uid妨马,給予Android身份機(jī)制挺举。
- 從語(yǔ)言來(lái)說(shuō),Linux 是基于C語(yǔ)言面向過(guò)程烘跺,而B(niǎo)inder是基于Java面向?qū)ο髞?lái)實(shí)現(xiàn)的湘纵。
貼出 Gityuan 的架構(gòu)分析
最后,簡(jiǎn)單講講Android
- Binder架構(gòu)Binder在Android系統(tǒng)中江湖地位非常之高滤淳。在Zygote孵化出system_server進(jìn)程后梧喷,在system_server進(jìn)程中出初始化支持整個(gè)Android framework的各種各樣的Service,而這些Service從大的方向來(lái)劃分,分為Java層Framework和Native Framework層(C++)的Service铺敌,幾乎都是基于BInder IPC機(jī)制汇歹。
- Java framework:作為Server端繼承(或間接繼承)于Binder類(lèi),Client端繼承(或間接繼承)于BinderProxy類(lèi)偿凭。例如 ActivityManagerService(用于控制Activity产弹、Service、進(jìn)程等) 這個(gè)服務(wù)作為Server端弯囊,間接繼承Binder類(lèi)痰哨,而相應(yīng)的ActivityManager作為Client端,間接繼承于BinderProxy類(lèi)匾嘱。 當(dāng)然還有PackageManagerService斤斧、WindowManagerService等等很多系統(tǒng)服務(wù)都是采用C/S架構(gòu);
- Native Framework層:這是C++層霎烙,作為Server端繼承(或間接繼承)于BBinder類(lèi)撬讽,Client端繼承(或間接繼承)于BpBinder。例如MediaPlayService(用于多媒體相關(guān))作為Server端悬垃,繼承于BBinder類(lèi)锐秦,而相應(yīng)的MediaPlay作為Client端,間接繼承于BpBinder類(lèi)盗忱。