介紹一下進程之間的通訊,以及我在工做中對於進程通訊的選擇。android
爲何有這個進程通訊的概念呢。緩存
其實是由於進程是一個獨立的運行單位,它分配的內存地址不可以被其餘進程訪問,這樣的設計實際上是爲了安全。安全
可是有時候咱們進程之間須要交換信息,那麼怎麼辦呢?操做系統給了咱們路口。app
進程通訊有下面幾種方式:操作系統
圖:設計
看圖:code
舉個栗子。blog
不知道各位有沒有開發過android,android app之間是如何通訊的呢?隊列
app確定是不一樣的進程,他們有一種Ashmem來實現共享內存,有興趣能夠看看。進程
管道是指用於鏈接讀寫進程的一個共享文件,又名pipe 文件。其實就是在內存中開闢一個大小固定的緩衝區。
注:管道只能採用半雙工通訊,某一段時間內只能實現單項的傳輸。若是要實現雙通道,那麼要兩根。
它的運做方式是這樣的,好比說進程一寫完了數據後,進程二才能去讀取數據。
這種管道是1對1的概念,只能一個進程對另一個進程,而不能1對多。
由於是這樣子的,只有管道寫滿以後,另一個進程才能讀取,在另一個進程讀取完畢以後,前面一個進程才能繼續寫。
因此說管道通訊實際上是有很是嚴格的要求的。
進程間的數據交換以格式化的消息爲單位。進程經過操做系統提供的"發送消息/接收消息"兩個原語來進行數據交換。
具體操做以下:
消息傳遞有兩種方式,一種是直接通訊方式,一種是間接通訊方式。
直接通訊是這樣子的,一個進程經過發送原語發送消息,這些消息操做系統會把這些消息掛載到目的進程消息緩存隊列中,若是目的進程須要接收,那麼目的進程能夠經過接收原語接收。
所謂原語,通常是指由若干條指令組成的程序段,用來實現某個特定功能,在執行過程當中不可被中斷。
間接通訊方式,消息先發送到中間實體(信箱)中,所以也稱「信箱通訊方式」。
形象點以下: