程序間通訊(ipc)
程序通訊,顧名思義,指執行在某個作業系統上不同繼承之間的各種訊息傳遞的方式。
程序間通訊主要需要解決三個問題:
1. 乙個程序如何給另乙個程序傳遞資訊;
2. 如何確保程序之間不互相干擾、妨礙;
3. 當程序間出現依賴關係時,該如何處理。
目前存在的ipc形式主要有以下四種:
1. 訊息傳遞(管道、fifo和訊息佇列);
2. 同步(互斥量、條件變數、讀寫鎖、檔案和記錄鎖、訊號量);
3. 共享記憶體(匿名和具名的);
4. 遠端過程呼叫(門和sunrpc)。
下面對以上四種ipc形式做一簡單的描述,後續章節將一一展開深入研究。
1.
訊息傳遞(管道、
fifo
和訊息佇列)
管道:無名管道僅可用於具有親緣關係程序間的通訊,有名管道(fifo)克服了管道無名字的限制,它能允許無親緣關係程序間的通訊;
訊息佇列:訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。擁有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
2.
同步(互斥量和條件變數、讀寫鎖、檔案和記錄鎖、訊號量)
互斥量:互斥量是乙個可以處於兩態之一的變數:解鎖和加鎖。互斥量保護的是臨界區,實際上保護的是在臨界區內中被操縱的資料(data),故通常用於保護有多個執行緒或多個程序分享的共享資料。
條件變數:條件變數是一種同步機制,允許執行緒掛起,直到共享資料上的某些條件得到滿足。條件變數要和互斥量相聯結,以避免出現條件競爭——乙個執行緒預備等待乙個條件變數,當它在真正進入等待之前,另乙個執行緒恰好觸發了該條件。
讀寫鎖:讀寫鎖最適用於對資料結構的讀操作次數多於寫操作的場合。具體實現可以使用互斥量和條件變數結合實現。
記錄鎖:記錄鎖相當於執行緒同步中讀寫鎖的一種擴充套件型別,可以用來對有親緣或無親緣關係的程序進行檔案讀與寫的同步,通過fcntl函式來執行上鎖操作。
訊號量:訊號量的使用主要是用來保護共享資源,使得資源在乙個時刻只有乙個程序(執行緒)所擁有。訊號量的值為正的時候,說明它空閒。所測試的執行緒可以鎖定而使用它。若為0,說明它被占用,測試的執行緒要進入睡眠佇列中,等待被喚醒。
3.
共享記憶體(匿名和具名的)
共享記憶體:顧名思義,共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體
。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效(最快)的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。
程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,就好像它們是由用c語言函式malloc分配的記憶體一樣。而如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。
4.
遠端過程呼叫(門和
sun rpc
)
以上介紹的主要是在單主機上的ipc形式,還有一種大家十分熟悉的ipc形式,即套接字(socket)方式。
5.
套介面(
socket
)
更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上。
程序間通訊IPC
這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...
程序間通訊 IPC
part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...
程序間通訊IPC
乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...