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