登錄

進程間通信

百科 > 計算機 > 進程間通信

1.什么是進程間通信

  進程間通信是指在并行計算過程中,各進程之間進行數(shù)據(jù)交互或消息傳遞, 其通信量的大小主要取決于并行設計的粒度劃分和各個執(zhí)行進程之間的相對獨立性。也就是在多進程環(huán)境下,使用的數(shù)據(jù)交互、事件通知等方法使各進程協(xié)同工作。

2.進程間通信的內容

  進程間通信就是在不同進程之間傳播或交換信息,那么不同進程之間存在著雙方都可以訪問的介質,進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內存區(qū)。但是,系統(tǒng)空間卻是“公共場所”,所以內核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數(shù)據(jù)庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。由于不同的進程運行在各自不同的內存空間中.一方對于變量的修改另一方是無法感知的。因此,進程之間的信息傳遞不可能通過變量或其它數(shù)據(jù)結構直接進行,只能通過進程間通信來完成。

  根據(jù)進程通信時信息量大小的不同,可以將進程通信劃分為兩大類型:控制信息通信和大批數(shù)據(jù)信息的通信.前者稱為低級通信,后者稱為高級通信。低級通信主要用于進程之間的同步、互斥、終止、掛起等等控制信息的傳遞。高級通信主要用于進程間數(shù)據(jù)塊的交換和共享,常見的高級通信有管道(PIPE)、消息隊列(MESSAGE)、共享內存(SHARED MEM0RY)等。

  在終止進程之前,父進程必須關閉子進程和它的主線程的句柄,以避免在應用程序運行時泄漏資源。當然,當進程終止運行時,系統(tǒng)會自動消除這些泄漏現(xiàn)象,但是,當進程不再需要訪問 子進程和它的線程時,編寫得較好的軟件應該顯式關閉這些句柄 (通過調用CloseHandle函數(shù)來關閉)。忘記關閉這些句柄是開發(fā)人員最常犯的錯誤之一。由于某些原因,許多開發(fā)人員認為,關閉進程或線程的句柄,會促使系統(tǒng)撤消該進程或線程。實際情況并非如此,關閉句柄只是告訴系統(tǒng),對進程或線程的統(tǒng)計數(shù)據(jù)不感興趣。進程或線程將繼續(xù)運行,直到它自己終止運行。進程間通信主要包括管道,系統(tǒng)IPC(Inter-Process Communication,進程間通信)(包括消息隊列,信號,共享存儲), 套接字(SOCKET)。管道包括三種:

  1. 普通管道PIPE, 通常有兩種限制,一是單工,只能單向傳輸;二是只能在父子或者兄弟進程間使用。
  2. 流管道s_pipe: 去除了第一種限制,為半雙工,可以雙向傳輸。
  3. 命名管道:name_pipe, 去除了第二種限制,可以在許多并不相關的進程之間進行通訊。

3.進程間通信的方式

  進程間通信是同一臺處理機或不同處理機的多個進程間傳送數(shù)據(jù)消息的一些技術或方法,方式有:

  • 管道(pipe)及有名管道(named?pipe):?

  管道可用于具有親緣關系進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關系進程間的通信。???

  信號是在軟件層次上對中斷機制的一種模擬,它是比較復雜的通信方式,用于通知進程有某事件發(fā)生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一致得。???

  • 消息隊列(message?queue):?

  消息隊列是消息的鏈接表,它克服了上兩種通信方式中信號量有限的缺點,具有寫權限得進程可以按照一定得規(guī)則向消息隊列中添加新信息;對消息隊列有讀權限得進程則可以從消息隊列中讀取信息。???

  • 共享內存(shared?memory):?

  可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數(shù)據(jù)得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。???

  • 信號量(semaphore):主要作為進程之間及同一種進程的不同線程之間得同步和互斥手段。???
  • 套接字(socket);這是一種更為一般得進程間通信機制,它可用于網(wǎng)絡中不同機器之間的進程間通信,應用非常廣泛。

4.進程間通信的目的

  1. 數(shù)據(jù)傳輸:一個進程需要將它的數(shù)據(jù)發(fā)送給另一個進程,發(fā)送的數(shù)據(jù)量在一個字節(jié)到幾兆字節(jié)之間。
  2. 共享數(shù)據(jù):多個進程想要操作共享數(shù)據(jù),一個進程對共享數(shù)據(jù)的修改,別的進程應該立刻看到。
  3. 通知事件:一個進程需要向另一個或一組進程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進程終止時要通知父進程)。
  4. 資源共享:多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。
  5. 進程控制:有些進程希望完全控制另一個進程的執(zhí)行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態(tài)改變。

  進程通過與內核及其它進程之間的互相通信來協(xié)調它們的行為。如Linux支持多種進程間通信(IPC)機制,信號和管道是其中的兩種。除此之外,Linux還支持System V的IPC機制(用首次出現(xiàn)的Unix版本命名)。

評論  |   0條評論