所謂進程通信,就是不同進程之間進行一些"接觸",這種接觸有簡單,也有復雜。機制不同,復雜度也不一樣。通信是一個廣義上的意義,不僅僅指傳遞一些massege。
他們的使用方法是基本相同的,所以只要掌握了一種的使用方法,然后記住其他的使用方法就可以了。
1. 信號
在我學習的內容中,主要接觸了信號來實現同步的機制,據說信號也可以用來做其它的事情,但是我還不知道做什么。
信號和信號量是不同的,他們雖然都可用來實現同步和互斥,但前者是使用信號處理器來進行的,后者是使用P,V操作來實現的。
使用信號要先知道有哪些信號,在Linux下有31個需要記住的通用信號,據說也是systemV中最常用的那些。這里略。
1. 1信號相關函數:
#include
int sigaction(int signo, const struct sigaction *act, struct sigaction
*oact);
該函數用來為進程安裝信號處理器,struct sigaction數據是用來保存信號處理器的相關信息。
#include
int sigemptyset(sigset_t *set);
將信號集合清空。
int sigfillset(sigset_t *set);
將信號集合設置成包含所有的信號。在對信號進行操作以前一定要對信號集進行初始化。
int sigaddset(sigset_t *set, int signo);
向信號集中加入signo對應的新信號。
int sigdelset(sigset_t *set, int signo);
從信號集中刪除signo對應的一個信號。
int sigismember(const sigset_t *set, int signo);
判斷某個信號是否在信號集中。返回1則在,0則不在。
#include
int sigprocmask(int how,const sigset_t *set, sigset_t *oset);用來設置進程的信號屏蔽碼。信號屏蔽碼可以用來在某段時間內阻塞一些信號集中的信號,如果信號不在信號集中,就不必討論它,因為肯定不響應,是否能生成也不肯定,我沒有做過試驗。
1.2我所理解的使用信號機制的方法:
使用信號,主要做的事情就是信號處理器的工作,這里面是你想做的事情。就像中斷處理函數一樣。
在使用信號以前,首先要初始化信號集,只有在信號集里面的信號才會被考慮。
有兩種方法可以初始化信號集,一種是設置空信號集,一種是將所有的信號都加到信號集中。如果你自己想要的信號集不是這兩種,可以在初始化了以后通過添加和刪除信號進行定制。
如果在進程執行的一段時間內不想對某些信號進行響應,則可以使用sigprocmask對當前的信號集中的一些信號進行阻塞,稍后再執行。
用於進程間通訊(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也用於傳遞小的控制信 息,系統處理這些小消息所需的時間就由延遲提供.這兩個數都很重要.
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也用於傳遞小的控制信 息,系統處理這些小消息所需的時間就由延遲提供.這兩個數都很重要.