Android進程間通信機制

移步系列Android跨進程通信IPC系列

Android所擁有的IPC

Android系統中有大量IPC(進程間通信)的場景,比如我們想要

  • 創建一個新的進程,需要通過Socket這種IPC方式去讓Zygote Fork新進程;
  • 如果我們要殺掉一個進程,需要通過信號這種IPC方式去將SIGNAL_KILL信號傳遞到系統內核;
  • 如果我們想要喚醒主線程處于休眠中的Looper,需要管道這種IPC方式來喚醒;
  • 我們想要在應用開發中使用AIDL,廣播或者Messager等方式來進行跨進程通信,其實底層都是使用了Binder這種IPC方式。

那么,Android到底有多少種進程間通信的方式呢?什么樣的場景要選擇什么樣的通信方式呢?這些IPC通信方式怎么使用呢?這些IPC通信的底層原理又是什么呢?


可以看到,Android所擁有的IPC總共有這些:

  • 基于Unix系統的IPC的管道,FIFO,信號
  • 基于SystemV和Posix系統的IPC的消息隊列,信號量,共享內存
  • 基于Socket的IPC
  • Linux的內存映射函數mmap()
  • Linux 2.6.22版本后才有的eventfd
  • Android系統獨有的Binder和匿名共享內存Ashmen

管道

Android進程間通信機制-管道

信號(signal)

Android跨進程通信-信號(Signal)

消息隊列

Android跨進程通信-消息隊列

信號量(semaphore)

Android跨進程通信-信號量

上面提到的IPC的方式都是在內核空間中開辟內存來存儲數據,寫數據時,需要將數據從用戶空間拷貝到內核空間,讀數據時,需要從內核空間拷貝到自己的用戶空間,
共享內存就只需要一次拷貝,而且共享內存不是在內核開辟空間,所以可以傳輸的數據量大

共享內存(share memory)

Android跨進程通信-共享內存

套接字(Socket)

Android跨進程通信-socket

Android跨進程通信-mmap函數
Android進程間通信-eventfd

8 Linux的幾種跨進程通信的方式的比較

8.1 效率比較

類型 無連接 可靠 流控制 優先級
匿名PIPE N Y Y N
命名PIPE(FIFO) N Y Y N
信號量 N Y Y Y
消息隊列 N Y Y Y
共享內存 N Y Y Y
UNIX流SOCKET N Y Y N
UNIX數據包SOCKET Y Y N N

PS:無連接是指無需調用某種行動是OPEN,就有發送消息的能力流控制,如果系統資源短缺或者不能接受更多的消息,則發送進程能進進行流量控制

8.2 優缺點比較

  • 匿名管道(pipe):速度慢,容量有限,只有父子進程能通訊
  • 有名管道(FIFO): 任務進程都能通訊,但速度慢
  • 消息隊列(message queue):容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據問題。
  • 信號量:不能傳遞復雜消息,只能用來同步
  • 共享內存區:能夠容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題。相當于線程中的線程安全,當然,共享內存區同樣可以做線程間通訊,不過沒有這個必要,線程間本來就已經共享了同一進程內的一塊內存

8.3 使用場景

  • 如果用戶傳遞的信息較少或是需要通過信號來出發某些行為,上面提到的軟中斷信號機制不失為一種簡潔有效的一種進程間通信方式。但若是進程間要求傳遞的信息量比較大或者進程間存在交換數據的要求,那就需要考慮別的通信方式。
  • 匿名管道簡單方便,但局限于單向通信的工作方式,并且只能創建它的進程及其子孫進程之間實現管道的共享。
  • 有名管道雖然可以提供給任意關系的進程使用,但是由于其長期存在于系統之中,使用不當容易出錯。所以不建議初級開發者使用。
  • 消息緩存可以不再局限于父子進程,而允許任意進程間通過共享消息隊列來實現進程間通信,并由系統調用函數來實現消息發送和接受方之間的同步,從而使得用戶在使用消息緩沖進行通信時不再需要考慮同步問題,使用方便,但是信息的復制需要額外的消耗CPU的時間,不適宜信息量大或操作頻繁的場合。
  • 共享內存針對消息緩存的缺點而改進,利用了內存緩存區直接交換信息,無需復制,快捷、信息量大的是其優點。但是共享內存的通信方式是通過將共享內存緩存直接附加到進程的虛擬地址空間中來實現的。因此這些進程之間的讀寫操作的同步問題操作系統無法實現。必須由各進程利用其它同步工具解決。另外, 由于內存實體存在于計算機系統中,所以只能由處于同一個計算機系統中的其它進程共享,不方便網絡通信。
  • 共享內存塊提供了在任意數量的進程之間進行高效雙向通信的機制。每個使用者都可以讀取寫入數據,但是所有程序之間必須達成并遵守一定的協議,以防止諸如在讀取信息之前覆寫內存空間等競爭狀態的出現。不行的是,Linux無法嚴格保證提供對共享內存塊的獨占訪問,同時,多個使用共享內存塊的進程之間必須協調使用同一個鍵值。

參考

Android跨進程通信IPC之1——Linux基礎
深入理解Android進程間通信機制

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容