1. 程式人生 > >linux程序間通訊的幾種機制的比較及適用場合

linux程序間通訊的幾種機制的比較及適用場合

用於程序間通訊(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也用於傳遞小的控制資訊,系統處理這些小訊息所需的時間就由延遲提供.這兩個數都很重要.