Java程序間通訊與同步機制
阿新 • • 發佈:2018-12-12
程序間通訊問題
- 無名管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
- 高階管道(popen):將另一個程式當做一個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方式。
- 命名管道(named pipe):有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
- 訊息佇列(message queue):訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
- 訊號量(semophore)
- 訊號(signal):訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。
- 共享記憶體(shared memory):共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩兩配合使用,來實現程序間的同步和通訊。
- 套接字(socket)
同步機制的基本準則
- 空閒則讓:當無程序處於臨界區時,表明臨界資源處於空閒狀態,允許一個請求進入臨界區的程序立即進入臨界區,以有效利用臨界資源。
- 忙則等待:當已有程序處於臨界區時,表明臨界資源正在被訪問,因而其他試圖進入臨界區的程序必須等待,以保證對臨界資源的互斥訪問。
- 有限等待:對要求訪問臨界資源的程序,應保證在有限時間內能進入自己的臨界區,以免陷入“死等”狀態。
- 讓權等待:當程序不能進入自己的臨界區時,應立即釋放處理機,以免程序陷入“忙等”狀態。
什麼是臨界區? 每個程序中訪問臨界資源的那段程式稱為臨界區(臨界資源是一次僅允許一個程序使用的共享資源)。每次只准許一個程序進入臨界區,進入後不允許其他程序進入。