進程的通信方式及特點

原文轉自:http://blog.csdn.net/chenhuajie123/article/details/9315477

進程通信的含義

進程是轉入內存並準備執行的程序,每個程序都有私有的虛擬地址空間,由代碼,數據以及它可利用的系統資源(如文件,管道)組成.多進程/多線程是windows操作系統的一個基本特徵.Linux系統一般都統稱爲進程.

由於不同的進程運行在各自不同的內存空間中,其中一個進程對於變量的修改另一方是無法感知的,因此,進程之間的消息傳遞不能通過變量或其他數據結構直接進行,只能通過進程間通信來完成.進程間通信是指不同進程間進行數據共享和數據交換.

進程通信的分類

根據進程通信時信息量大小的不同,可以將進程通信劃分爲兩大類型:控制信息的通信(低級通信)和大批數據信息的通信(高級通信).

低級通信主要用於進程之間的同步,互斥,終止和掛起等等控制信息的傳遞.

高級通信主要用於進程間數據塊數據的交換和共享,常見的高級通信有管道,消息隊列,共享內存等.

進程通信的方式

1)文件和記錄鎖定

爲避免兩個進程間同時要求訪問同一資源而引起訪問和操作的混亂,在進程對共享資源進行訪問前必須對其鎖定,該進程訪問完後再釋放.這是UNIX爲共享資源提供的互斥性保障.

2)管道

管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用.進程的親緣關係一般指的是父子關係.管道一般用於兩個不同進程之間的通信.當一個進程創建了一個管道,並調用fork創建自己的一個子進程後,父進程關閉讀管道端,子進程關閉寫管道端,這樣提供了兩個進程之間數據流動的一種方式.

3)有名管道

有名管道也是一種半雙工的通信方式,但是它允許無親緣關係進程間的通信.

4)FIFO

FIFO是一種先進先出的隊列.它類似於一個管道,只允許數據的單向流動.每個FIFO都有一個名字,允許你不相關的進程訪問同一個FIFO,因此也成爲命名管.

5)信號量

信號量是一個計數器,可以用來控制多個線程對共享資源的訪問.,它不是用於交換大批數據,而用於多線程之間的同步.它常作爲一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源.因此,主要作爲進程間以及同一個進程內不同線程之間的同步手段.

6)信號

信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生.

7)消息隊列

消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識.消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特點.消息隊列是UNIX下不同進程之間可實現共享資源的一種機制,UNIX允許不同進程將格式化的數據流以消息隊列形式發送給任意進程.對消息隊列具有操作權限的進程都可以使用msget完成對消息隊列的操作控制.通過使用消息類型,進程可以按任何順序讀信息,或爲消息安排優先級順序.

8)共享內存

共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問.共享內存是最快的IPC(進程間通信)方式,它是針對其它進程間通信方式運行效率低而專門設計的.它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步與通信.

9)套接字(socket)

套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同進程及其間進程的通信.

通信方式的優缺點

幾種通信方法總結綜上所述.進程之間的多種通信方法各自有各自的優點和缺點:如果用戶傳遞的信息較少.或是需要通過信號來觸發某些行爲.前文提到的軟中斷信號機制不失爲一種簡捷有效的進程間通信方式.但若是進程間要求傳遞的信息量比較大或者進程間存在交換數據的要求,那就需要考慮別的通信方式了。無名管道簡單方便.但侷限於單向通信的工作方式.並且只能在創建它的進程及其子孫進程之間實現管道的共享:有名管道雖然可以提供給任意關係的進程使用.但是由於其長期存在於系統之中,使用不當容易出錯.所以普通用戶一般不建議使用。消息緩衝可以不再侷限於父子進程.而允許任意進程通過共享消息隊列來實現進程間通信.並由系統調用函數來實現消息發送和接收之間的同步.從而使得用戶在使用消息緩衝進行通信時不再需要考慮同步問題.使用方便,但是消息隊列中信息的複製需要額外消耗CPU的時間.不適宜於信息量大或操作頻繁的場合共享內存針對消息緩衝的缺點改而利用內存緩衝區直接交換信息,無須複製,快捷、信息量大是其優點。但是共享內存的通信方式是通過將共享的內存緩衝區直接附加到進程的虛擬地址空間中來實現的.因此,這些進程之間的讀寫操作的同步問題操作系統無法實現。必須由各進程利用其他同步工具解決。另外,由於內存實體存在於計算機系統中.所以只能由處於同一個計算機系統中的諸進程共享,不方便網絡通信不同的進程通信方式有不同的優點和缺點.因此.對於不同的應用問題,要根據問題本身的情況來選擇進程間的通信方式。

一般來說,進程間的通信根據通信內容可以劃分爲兩種:即控制信息的傳送與大批數據傳送。有時也把進程間控制信息的交換稱爲低級通信,而把進程間大批量數據的交換稱爲高級通信。


發佈了10 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章