行程與行程抽象

行程間通訊(inter-process communication)

兩個人在各自隔音的辦公室裡,無法隔牆直接交談——他們需要一套安排:兩室之間共用的白板、從門縫塞過去的紙條、一臺對講機,或一個只表示「發生了某件事」的火警鈴。行程正像那些彼此隔離的辦公室:各有自己私有的記憶體,無法讀取別人的。行程間通訊(IPC)就是作業系統提供的一套機制,好讓彼此分離的行程仍能交換資料並協調。

IPC 機制大致分為兩大家族。在共享記憶體中,作業系統讓兩個行程把同一塊實體記憶體映射進各自的位址空間,於是設置好後它們以全速的記憶體速度藉由讀寫那塊共享區域來溝通,但接著它們必須謹慎地同步,以免互相踩到。在訊息傳遞中,行程不共享記憶體;它們改為透過核心收送一則則離散的訊息,由核心複製資料——較簡單也較安全,但帶有複製的額外負擔。常見的具體形式包括:管線(單向的位元組串流,經典上把生產者接到消費者,如 command1 | command2);通訊端(雙向通道,既能用於同一機器上的行程之間,也能跨網路);以及信號(微小的非同步通知,比起傳輸真正的資料,更像是「發生了某件事」,例如用來請求某行程停止)。

IPC 之所以重要,是因為分離行程的整個用意——為了安全而隔離——同時也意味著它們無法隨意共享狀態,所以它們之間的任何合作都必須經由一個明確、由作業系統居中的通道。在各機制間取捨是個真實的權衡:共享記憶體最快,但把同步的重擔推給你;訊息傳遞較易推理、且能跨機器運作,但會複製資料。一個提醒:共享記憶體本身只提供那塊共享區域,它並不協調存取,所以若沒有另外的同步,兩個寫入同一塊共享記憶體的行程可能破壞彼此的資料。

在命令列中,「ls | wc -l」用一條管線連接兩個行程:ls 把它的輸出寫進管線,wc 從管線讀取並計算行數。兩個行程都不共享記憶體;核心在它們之間搬運位元組。

管線是訊息傳遞式的 IPC:一個行程的輸出是另一個行程的輸入。

共享記憶體給你那塊共享區域,但不給你協調。若沒有另外的同步,兩個寫入同一塊共享記憶體的行程仍可能破壞彼此的資料。

又稱
IPC行程間通訊行程間溝通