(1)管道通信管道是一種最基本的進程間通信機制。管道就是操作系統在內核中開辟的一段緩沖區,進程1可以將需要交互的數據拷貝到這段緩沖區,進程2就可以讀取了。管道的特點:只能單向通信只能血緣關系的進程進行通信依賴于文件系統生命周期隨進程面向字節流的服務管道內部提供了同步機制
(2)消息隊列通信消息隊列就是一個消息的列表。用戶可以在消息隊列中添加消息、讀取消息等。消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。 每個數據塊都被認為含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。可以通過發送消息來避免命名管道的同步和阻塞問題。但是消息隊列與命名管道一樣,每個數據塊都有一個最大長度的限制。使用消息隊列進行進程間通信,可能會收到數據塊最大長度的限制約束等,這也是這種通信方式的缺點。如果頻繁的發生進程間的通信行為,那么進程需要頻繁地讀取隊列中的數據到內存,相當于間接地從一個進程拷貝到另一個進程,這需要花費時間。
(3)信號量通信共享內存最大的問題就是多進程競爭內存的問題,就像類似于線程安全問題。我們可以使用信號量來解決這個問題。信號量的本質就是一個計數器,用來實現進程之間的互斥與同步。例如信號量的初始值是 1,然后 a 進程來訪問內存1的時候,我們就把信號量的值設為 0,然后進程b 也要來訪問內存1的時候,看到信號量的值為 0 就知道已經有進程在訪問內存1了,這個時候進程 b 就會訪問不了內存1。所以說,信號量也是進程之間的一種通信方式。
(4)信號通信信號(Signals )是Unix系統中使用的最古老的進程間通信的方法之一。操作系統通過信號來通知進程系統中發生了某種預先規定好的事件(一組事件中的一個),它也是用戶進程之間通信和同步的一種原始機制。
(5)共享內存通信共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問(使多個進程可以訪問同一塊內存空間)。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
(6)套接字通信上面說的共享內存、管道、信號量、消息隊列,他們都是多個進程在一臺主機之間的通信,那兩個相隔幾千里的進程能夠進行通信嗎?答是必須的,這個時候 Socket 這家伙就派上用場了,例如我們平時通過瀏覽器發起一個 http 請求,然后服務器給你返回對應的數據,這種就是采用 Socket 的通信方式了。