Android開發(fā)的進程間通訊弊决,整個Android的應用都依賴于binder做底層通信機制。而Linux中提供的進程間通訊方式并沒有binder機制擅威,那么android中為什么要單獨創(chuàng)造這種通訊方式呢壕探?帶著這個問題,繼續(xù)往下讀郊丛。
Linux中進程相關概念
Linux將系統(tǒng)內存劃分成了 用戶空間 和 內核空間 兩部分:
用戶空間 : 普通應用程序則運行在用戶空間上李请,它們不能使用某些特定的系統(tǒng)功能瞧筛,不能直接訪問硬件,不能直接訪問內核空間捻艳。
內核空間 : 系統(tǒng)的核心軟件會運行在較高的特權級別上驾窟,它們駐留在被保護的內存空間上,擁有訪問硬件設備的所有權限认轨。
用戶程序只能運行在用戶空間绅络,用戶空間訪問內核空間的唯一方式就是系統(tǒng)調用。
linux的用戶程序和進程
在linux中嘁字,所有的用戶程序執(zhí)行時狀態(tài)都是進程恩急。進程間存在父子關系來表示同一個用戶程序開啟的多個同步任務。
所有的進程構成一個以 init 為根的樹狀結構纪蜒,這是因為 Linux 內核 并不提供直接建立新進程的系統(tǒng)調用衷恭。剩下的所有進程都是 init 進程通過 fork 機制建立的。新的進程要通過老的進程復制自身得到纯续,這就是 fork随珠。fork 是一個系統(tǒng)調用。
每個進程都在內存中分配有屬于自己的一片空間 (內存空間猬错,包含棧窗看、堆、全局靜態(tài)區(qū)倦炒、文本常量區(qū)显沈、程序代碼區(qū))。進程之間相互隔離資源:
- 進程隔離是為保護進程之間互不干擾的執(zhí)行逢唤。
- 進程隔離技術使用了虛擬地址空間拉讯,即進程A的虛擬地址和進程B的虛擬地址不同,這樣就防止進程A將數(shù)據(jù)信息寫入進程B鳖藕。
因為進程隔離的原因魔慷,進程A和進程B之間不能直接進行通訊。
但是開發(fā)中吊奢,總難免要遇到進程通訊的地方(例如一個應用不通進程之間相互傳遞數(shù)據(jù)等場景)盖彭。
進程間通信方式(IPC)
雖然不同進程在用戶空間不能直接進行通訊,但它們卻是共享一份內核空間页滚。很顯然,當一個用戶進程想與另外一個用戶進程進行通信時铺呵,就可以通過內核空間來完成了裹驰。
Linux中常見的進程間通訊的幾種方式:
1.管道(Pipe)及有名管道(named pipe):管道可用于具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制片挂,因此幻林,除具有管道所具有的功能外贞盯,它還允許無親緣關系進程間的通信;
2.信號(Signal):信號是比較復雜的通信方式沪饺,用于通知接受進程有某種事件發(fā)生躏敢,除了用于進程間通信外,進程還可以發(fā)送信號給進程本身整葡;linux除了支持Unix早期信號語義函數(shù)sigal外件余,還支持語義符合Posix.1標準的信號函數(shù)sigaction(實際上,該函數(shù)是基于BSD的遭居,BSD為了實現(xiàn)可靠信號機制啼器,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù))俱萍;
3.報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表端壳,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息枪蘑,被賦予讀權限的進程則可以讀走隊列中的消息损谦。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點岳颇。
4.共享內存:使得多個進程可以訪問同一塊內存空間照捡,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的赦役。往往與其它通信機制麻敌,如信號量結合使用,來達到進程間的同步及互斥掂摔。
5.信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段术羔。
6.套接口(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信乙漓。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的级历,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。
上面的6種都是內核里的程序:
進程A發(fā)起請求給內核里的程序叭披,內核里的程序再將請求轉發(fā)給進程B寥殖,從而達到進程間通信。
Android中的Binder誕生
Android系統(tǒng)通過Linux的動態(tài)可加載內核模塊涩蜘,添加一個內核模塊運行在內核空間嚼贡,用戶進程之間的通過這個模塊作為橋梁,就可以完成通信同诫。就是我們后面要涉及到的:Binder驅動粤策。
google通過新增內核模塊完成了進程間通信協(xié)議的實現(xiàn),然后使用binder驅動來調用這個新增的內核模塊误窖,來為上層應用提供接口叮盘,最后在framework層封裝這個接口來提供 java API 調用接口秩贰。
Android系統(tǒng)為什么需要再實現(xiàn)一個進程間通信協(xié)議Binder呢?
- 在移動設備上柔吼,Binder的傳輸效率和可操作性很好毒费。
- Binder機制能夠很好地實現(xiàn)Client-Server架構。
- Binder機制的安全性高愈魏。
- 傳統(tǒng)方式對于通信雙方的身份并沒有做出嚴格的驗證觅玻,只有在上層協(xié)議上進行架設;
- 比如Socket通信ip地址是客戶端手動填入的蝌戒,都可以進行偽造串塑;
- 而Binder機制從協(xié)議本身就支持對通信雙方做身份校檢,因而大大提升了安全性北苟。
感謝您的閱讀桩匪,本系列會繼續(xù)創(chuàng)作關于android中進程通訊的具體用法。歡迎前來觀望友鼻。