天天看點

《UNIX網絡程式設計 卷2:程序間通信(第2版)》——1.2 程序、線程與資訊共享

本節書摘來自異步社群《unix網絡程式設計 卷2:程序間通信(第2版)》一書中的第1章,第1.2節,作者:【美】w. richard stevens著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

按照傳統的unix程式設計模型,我們在一個系統上運作多個程序,每個程序都有各自的位址空間。unix程序間的資訊共享可以有多種方式。圖1-1對此作了總結。

《UNIX網絡程式設計 卷2:程式間通信(第2版)》——1.2 程式、線程與資訊共享

(1)左邊的兩個程序共享存留于檔案系統中某個檔案上的某些資訊。為通路這些資訊,每個程序都得穿越核心(例如read、write、lseek等)。當一個檔案有待更新時,某種形式的同步是必要的,這樣既可保護多個寫入者,防止互相串擾,也可保護一個或多個讀出者,防止寫入者的幹擾。

(2)中間的兩個程序共享駐留于核心中的某些資訊。管道是這種共享類型的一個例子,system v消息隊列和system v信号量也是。現在通路共享資訊的每次操作涉及對核心的一次系統調用。

(3)右邊的兩個程序有一個雙方都能通路的共享記憶體區。每個程序一旦設定好該共享記憶體區,就能根本不涉及核心而通路其中的資料。共享該記憶體區的程序需要某種形式的同步。

注意沒有任何東西限制任何ipc技術隻能使用兩個程序。我們講述的技術适用于任意數目的程序。在圖1-1中隻展示兩個程序是為了簡單起見。

線程

雖然unix系統中程序的概念已使用了很久,一個給定程序内多個線程(thread)的概念卻相對較新。posix.1線程标準(稱為“pthreads”)是于1995年通過的。從ipc角度看來,一個給定程序内的所有線程共享同樣的全局變量(也就是說共享記憶體區的概念對這種模型來說是内在的)。然而我們必須關注的是各個線程間對全局資料的同步通路。同步盡管不是一種明确的ipc形式,但它确實伴随許多形式的ipc使用,以控制對某些共享資料的通路。

本書中我們講述程序間的ipc和線程間的ipc。我們假設有一個線程環境,并作類似如下形式的陳述:“如果管道為空,調用線程就阻塞在它的read調用上,直到某個線程往該管道寫入資料。”要是你的系統不支援線程,那你可以将該句子中的“線程”替換成“程序”,進而提供“阻塞在對空管道的read調用上”的經典unix定義。然而在支援線程的系統上,隻有對空管道調用read的那個線程阻塞,同一程序中的其餘線程才可以繼續執行。向該空管道寫資料的工作既可以由同一程序中的另一個線程去做,也可以由另一個程序中的某個線程去做。