進程間通信
出自 MBA智库百科(https://wiki.mbalib.com/)
進程間通信(Process To Process Communication)
目錄 |
進程間通信是指在並行計算過程中,各進程之間進行數據交互或消息傳遞, 其通信量的大小主要取決於並行設計的粒度劃分和各個執行進程之間的相對獨立性。也就是在多進程環境下,使用的數據交互、事件通知等方法使各進程協同工作。
進程間通信就是在不同進程之間傳播或交換信息,那麼不同進程之間存在著雙方都可以訪問的介質,進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共用記憶體區。但是,系統空間卻是“公共場所”,所以內核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁碟上的普通文件交換信息,或者通過“註冊表”或其它資料庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。由於不同的進程運行在各自不同的記憶體空間中.一方對於變數的修改另一方是無法感知的。因此,進程之間的信息傳遞不可能通過變數或其它數據結構直接進行,只能通過進程間通信來完成。
根據進程通信時信息量大小的不同,可以將進程通信劃分為兩大類型:控制信息的通信和大批數據信息的通信.前者稱為低級通信,後者稱為高級通信。低級通信主要用於進程之間的同步、互斥、終止、掛起等等控制信息的傳遞。高級通信主要用於進程間數據塊的交換和共用,常見的高級通信有管道(PIPE)、消息隊列(MESSAGE)、共用記憶體(SHARED MEM0RY)等。
在終止進程之前,父進程必須關閉子進程和它的主線程的句柄,以避免在應用程式運行時泄漏資源。當然,當進程終止運行時,系統會自動消除這些泄漏現象,但是,當進程不再需要訪問 子進程和它的線程時,編寫得較好的軟體應該顯式關閉這些句柄 (通過調用CloseHandle函數來關閉)。忘記關閉這些句柄是開發人員最常犯的錯誤之一。由於某些原因,許多開發人員認為,關閉進程或線程的句柄,會促使系統撤消該進程或線程。實際情況並非如此,關閉句柄只是告訴系統,對進程或線程的統計數據不感興趣。進程或線程將繼續運行,直到它自己終止運行。進程間通信主要包括管道,系統IPC(Inter-Process Communication,進程間通信)(包括消息隊列,信號,共用存儲), 套接字(SOCKET)。管道包括三種:
- 普通管道PIPE, 通常有兩種限制,一是單工,只能單向傳輸;二是只能在父子或者兄弟進程間使用。
- 流管道s_pipe: 去除了第一種限制,為半雙工,可以雙向傳輸。
- 命名管道:name_pipe, 去除了第二種限制,可以在許多並不相關的進程之間進行通訊。
進程間通信是同一臺處理機或不同處理機的多個進程間傳送數據或消息的一些技術或方法,方式有:
- 管道(pipe)及有名管道(named pipe):
管道可用於具有親緣關係進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關係進程間的通信。
信號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通信方式,用於通知進程有某事件發生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一致得。
- 消息隊列(message queue):
消息隊列是消息的鏈接表,它剋服了上兩種通信方式中信號量有限的缺點,具有寫許可權得進程可以按照一定得規則向消息隊列中添加新信息;對消息隊列有讀許可權得進程則可以從消息隊列中讀取信息。
- 共用記憶體(shared memory):
可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊記憶體空間,不同進程可以及時看到對方進程中對共用記憶體中數據得更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。
- 信號量(semaphore):主要作為進程之間及同一種進程的不同線程之間得同步和互斥手段。
- 套接字(socket);這是一種更為一般得進程間通信機制,它可用於網路中不同機器之間的進程間通信,應用非常廣泛。
- 數據傳輸:一個進程需要將它的數據發送給另一個進程,發送的數據量在一個位元組到幾兆位元組之間。
- 共用數據:多個進程想要操作共用數據,一個進程對共用數據的修改,別的進程應該立刻看到。
- 通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。
- 資源共用:多個進程之間共用同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。
- 進程式控制制:有些進程希望完全控制另一個進程的執行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,並能夠及時知道它的狀態改變。
進程通過與內核及其它進程之間的互相通信來協調它們的行為。如Linux支持多種進程間通信(IPC)機制,信號和管道是其中的兩種。除此之外,Linux還支持System V的IPC機制(用首次出現的Unix版本命名)。