進程之間的通信方式

進程通信

  1. 數據傳輸
  2. 資源共享
  3. 通知事件
  4. 進程控制

分類

1. 管道
在這裏插入圖片描述
| 是管道的意思,它的作用就是把前一條命令的輸出作爲後一條命令的輸入。如果兩個進程要通信的話,可以使用這種管道進行通信,因爲 | 沒有名字,所以成爲匿名管道,匿名管道一般用於有父子進程關係的進程中 。並且這種通信方式是單向的,只能把第一個命令的輸出作爲第二個命令的輸入,如果進程之間想要通信的話,需要創建兩個管道。當然也可以給管道命名,以下就命名一個名字爲test的管道。
在這裏插入圖片描述
然後用一個進程給這個管道寫入數據,可以發現如果這個數據沒有被讀出的話,命令就一直停在那裏。只有另外一個進程把try裏的數據讀走這條命令纔會結束。
在這裏插入圖片描述
用另一個進程來讀取try中的數據。當讀取完以後,上一個命令也結束了。
在這裏插入圖片描述總結:
管道的通知機制類似於緩存,把一個進程的數據放在某個緩存區域,然後等另外一個進程去拿。並且管道是單向傳輸的。這種通信方式不適合頻繁通信的進程。但是它比較簡單,能夠保證我們的數據已經被其他進程拿走了。
2. 消息隊列
如果想把進程的數據放在某個內存之後不用其他進程來取就讓進程返回的話,可以使用消息隊列,假如A要給B發送消息,只需要把消息放在消息隊列中就可以了,B在需要的時候再去對應的消息隊列中取出來。
總結:
這種方式如果進程A給進程B發送的數據佔的內存比較大,並且通信頻繁的話,就不太適合了,因爲此時發送數據(拷貝)需要花很長時間讀內存。
3. 共享內存
這種方法可以很好的解決拷貝所消耗的時間。系統加載一個進程的時候,分配給內存的並不是實際物理內存,而是虛擬內存空間。所以可以讓兩個進程各自拿出一塊虛擬地址空間映射到相同的物理內存中,從而實現內存共享。
4. 信號量
內存共享會有多進程競爭內存的問題,爲此,可以使用信號量。信號量本質上是一個計數器,用來實現進程之間的互斥與同步,比如信號量初始值是1,A進程來訪問內存1時,我們把信號量的值設爲0,當進程B來訪問內存1時,發現信號量是0就知道有進程在訪問,進程B就不會訪問內存1了。
5. socket
以上4種都是多個進程在一個主機上通信,如果是不同主機的進程進行通信,就要用socket了。
【補充】
參考的是微信公衆號 苦逼的碼農 ,這上面真是乾貨多多,每天必讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章