登錄

進(jìn)程間通信

百科 > 計(jì)算機(jī) > 進(jìn)程間通信

1.什么是進(jìn)程間通信

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

2.進(jìn)程間通信的內(nèi)容

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

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

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

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

3.進(jìn)程間通信的方式

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

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

  管道可用于具有親緣關(guān)系進(jìn)程間的通信,有名管道除了具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信。???

  信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,它是比較復(fù)雜的通信方式,用于通知進(jìn)程有某事件發(fā)生,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求效果上可以說(shuō)是一致得。???

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

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

  • 共享內(nèi)存(shared?memory):?

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

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

4.進(jìn)程間通信的目的

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

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

評(píng)論  |   0條評(píng)論