因爲不一樣的進程運行在各自不一樣的內存空間中.一方對於變量的修改另外一方是沒法感知的.所以.進程之間的信息傳遞不可能經過變量或其它數據結構直接進行,只能通進程間通訊來完成。網絡
根據進程通訊時信息量大小的不一樣,能夠將進程通訊劃分爲兩大類型:控制信息的通訊和大批數據信息的通訊.前者稱爲低級通訊,後者稱爲高級通訊。數據結構
低級通訊主要用於進程之間的同步、互斥、終止、掛起等等控制信息的傳遞。socket
高級通訊主要用於進程間數據塊的交換和共享 常見的高級通訊有管道(PIPE)、消息隊列(MESSAGE)、共享內存(SHARED MEM0RY)等。函數
管道通訊(PIPE)
兩個進程利用管道進行通訊時.發送信息的進程稱爲寫進程.接收信息的進程稱爲讀進程。管道通訊方式的中間介質就是文件.一般稱這種文件爲管道文件.它就像管道同樣將一個寫進程和一個讀進程鏈接在一塊兒,實現兩個進程之間的通訊。寫進程經過寫入端(發送端)往管道文件中寫入信息;讀進程經過讀出端(接收端)從管道文件中讀取信息。兩個進程協調不斷地進行寫和讀,便會構成雙方經過管道傳遞信息的流水線。
利用系統調用PIPE()能夠建立一個無名管道文件,一般稱爲無名管道或PIPE;利用系統調用MKNOD()能夠建立一個有名管道文件.一般稱爲有名管道或FIFO。無名管道是一種非永
久性的管道通訊機構.當它訪問的進程所有終止時,它也將隨之被撤消。無名管道只能用在具備家族聯繫的進程之間。有名管道能夠長期存在於系統之中.並且提供給任意關係的進程使用,可是使用不當容易致使出錯.因此操做系統將命名管道的管理權交由系統來加以控制管道文件被建立後,能夠經過系統調用WRITE()和READ()來實現對管道的讀寫操做;通訊完後,可用CLOSE()將管道文件關閉。性能
消息緩衝通訊(MESSAGE)
多個獨立的進程之間能夠經過消息緩衝機制來相互通訊.這種通訊的實現是以消息緩衝區爲中間介質.通訊雙方的發送和接收操做均以消息爲單位。在存儲器中,消息緩衝區被組織成隊列,一般稱之爲消息隊列。消息隊列一旦建立後便可由多進程共享.發送消息的進程能夠在任意時刻發送任意個消息到指定的消息隊列上,並檢查是否有接收進程在等待它所發送的消息。如有則喚醒它:而接收消息的進程能夠在須要消息的時候到指定的消息隊列上獲取消息.若是消息尚未到來.則轉入睡眠狀態等待。測試
共享內存通訊(SHARED MEMORY)
針對消息緩衝須要佔用CPU進行消息複製的缺點.OS提供了一種進程間直接進行數據交換的通訊方式一共享內存 顧名思義.這種通訊方式容許多個進程在外部通訊協議或同步,互斥機制的支持下使用同一個內存段(做爲中間介質)進行通訊.它是一種最有效的數據通訊方式,其特色是沒有中間環節.直接將共享的內存頁面經過附接.映射到相互通訊的進程各自的虛擬地址空間中.從而使多個進程能夠直接訪問同一個物理內存頁面.如同訪問本身的私有空間同樣(但實質上不是私有的而是共享的)。所以這種進程間通訊方式是在同一個計算機系統中的諸進程間實現通訊的最快捷的方法.而它的侷限性也在於此.即共享內存的諸進程必須共處同一個計算機系統.有物理內存能夠共享才行。spa
1.無名管道簡單方便.但侷限於單向通訊的工做方式.而且只能在建立它的進程及其子孫進程之間實現管道的共享:有名管道雖然能夠提供給任意關係的進程使用.可是因爲其長期存在於系統之中,使用不當容易出錯。線程
2.消息緩衝能夠再也不侷限於父子進程.而容許任意進程經過共享消息隊列來實現進程間通訊.並由系統調用函數來實現消息發送和接收之間的同步.從而使得用戶在使用消息緩衝進行通訊時再也不須要考慮同步問題.使用方便,可是信息的複製須要額外消耗CPU的時間.不適宜於信息量大或操做頻繁的場合。
3.共享內存針對消息緩衝的缺點改而利用內存緩衝區直接交換信息,無須複製,快捷、信息量大是其優勢。可是共享內存的通訊方式是經過將共享的內存緩衝區直接附加到進程的虛擬地址空間中來實現的.所以,這些進程之間的讀寫操做的同步問題操做系統沒法實現。必須由各進程利用其餘同步工具解決。另外,因爲內存實體存在於計算機系統中.因此只能由處於同一個計算機系統中的諸進程共享。不方便網絡通訊。
補充:
1.
# 管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
# 信號量( semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
# 信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
#共享內存( shared memory):共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的IPC方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步和通訊。# 套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。
管道的主要侷限性正體如今它的特色上:
只支持單向數據流;
只能用於具備親緣關係的進程之間;
沒有名字;
管道的緩衝區是有限的(管道制存在於內存中,在管道建立時,爲緩衝區分配一個頁面大小);
管道所傳送的是無格式字節流,這就要求管道的讀出方和寫入方必須事先約定好數據的格式,好比多少字節算做一個消息(或命令、或記錄)等等;
2.
用於進程間通信(IPC)的四種不一樣技術:
1. 消息傳遞(管道,FIFO,posix和system v消息隊列)
2. 同步(互斥鎖,條件變量,讀寫鎖,文件和記錄鎖,Posix和System V信號燈)
3. 共享內存區(匿名共享內存區,有名Posix共享內存區,有名System V共享內存區)
4. 過程調用(Solaris門,Sun RPC)
消息隊列和過程調用每每單獨使用,也就是說它們一般提供了本身的同步機制.相反,共享內存區一般須要由應用程序提供的某種同步形式才能正常工做.解決某個特定問題應使用哪一種IPC不存在簡單的斷定,應該逐漸熟悉各類IPC形式提供的機制,而後根據特定應用的要求比較它們的特性.
必須考慮的四個前提:
1. 聯網的仍是非聯網的.IPC適用於單臺主機上的進程或線程間的.若是應用程序有可能分佈到多臺主機上,那就要考慮使用套接字代替IPC,從而簡化之後向聯網的應用程序轉移的工做.
2. 可移植性.
3. 性能,在具體的開發環境下運行測試程序,比較幾種IPC的性能差別.
4. 實時調度.若是須要這一特性,並且所用的系統也支持posix實時調度選項,那就考慮使用Posix的消息傳遞和同步函數.
各類IPC之間的一些主要差別:
1. 管道和FIFO是字節流,沒有消息邊界.Posix消息和System V消息則有從發送者向接受者維護的記錄邊界(eg:TCP是沒有記錄邊界的字節流,UDP則提供具備記錄邊界的消息).
2. 當有一個消息放置到一個空隊列中時,Posix消息隊列可向一個進程發送一個信號,或者啓動一個新的線程.System V則不提供相似的通知形式.
3. 管道和FIFO的數據字節是先進先出的.Posix消息和System V消息具備由發送者賦予的優先級.從一個Posix消息隊列讀出時,首先返回的老是優先級最高的消息.從一個System V消息隊列讀出時,讀出者能夠要求想要的任意優先級的消息.
4. 在衆多的消息傳遞技術—管道,FIFO,Posix消息隊列和System V消息隊列—中,可從一個信號處理程序中調用的函數只有read和write(適用於管道和FIFO).
比較不一樣形式的消息傳遞時,咱們感興趣的有兩種測量尺度:
1.帶寬(bandwidth):數據經過IPC通道轉移的速度.爲測量該值,咱們從一個進程向另外一個進程發送大量數據(幾百萬字節).咱們還給不一樣大小的I/O操做(例如管道和FIFO的write和read操做)測量該值,期待發現帶寬隨每一個I/O操做的數據量的增加而增加的規律.
2. 延遲(latency):一個小的IPC消息從一個進程到令一個進程再返回來所花的時間.咱們測量的是隻有一個1個字節的消息從一個進程到令一個進程再回來的時間(往返時間)
在現實世界中,帶寬告訴咱們大塊數據經過一個IPC通道發送出去需花多長時間,然而IPC也用於傳遞小的控制信息,系統處理這些小消息所需的時間就由延遲提供.這兩個數都很重要.