五種進程間通信

一、管道(PIPE)
管道,通常指無名管道,是 UNIX 系統IPC(進程間通信)最古老的形式。
特點:
1、它是半雙工的(即數據只能在一個方向上流動),具有固定的讀端和寫端。
2、它只能用於具有親緣關係的進程之間的通信(也是父子進程或者兄弟進程之間)。
3、它可以看成是一種特殊的文件,對於它的讀寫也可以使用普通的read、write 等函數。但是它不是普通的文件,並不屬於其他任何文件系統,並且只存在於內存中。
二、FIFO
FIFO,也稱爲命名管道,它是一種文件類型。
特點:
1、FIFO可以在無關的進程之間交換數據,與無名管道不同。
2、FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。
三、消息隊列
消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
特點:
1、消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
2、消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
3、消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。
四、信號量
信號量(semaphore)與已經介紹過的 IPC 結構不同,它是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。
特點:
1、信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
2、信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
3、每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。
4、支持信號量組。
五、共享內存(mmap)
共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。
特點
1、共享內存是最快的一種 IPC,因爲進程是直接對內存進行存取。
2、因爲多個進程可以同時操作,所以需要進行同步。
3、信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問。

五種通信方式總結
1、管道:速度慢,容量有限,只有父子進程能通訊
2、FIFO:任何進程間都能通訊,但速度慢
3、消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
4、信號量:不能傳遞複雜消息,只能用來同步
5、共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存

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