低階通訊 是指 程序間只能傳遞很少量的控制資訊,一般來說只有乙個位元組或乙個整型變數,例如,訊號量和訊號就是低階通訊方式。
訊號量:記錄當前可用資源的數量(如飯店空閒桌子的數量。)
訊號量由作業系統來維護,使用者程序只能通過初始化和兩個標準原語 p原語v原語 訪問它。在初始化的時候,可以指定乙個非負整數值來表示空閒資源的個數;原語是就是乙個函式,用來實現某個特定的操作,是作業系統核心的乙個組成部分,所以必須在管態下執行且執行過程中不會被中斷所打斷。
利用訊號量對臨界資源互斥訪問的過程:首先定義乙個訊號量mutex,並初始化為1.表示在任何時刻,最多允許乙個程序進入臨界區,然後,每個程序要進入臨界區時,要呼叫乙個p原語,判斷當前能否進入,若能,則p原語結束,進入臨界區,若不能,該程序就會被阻塞起來。在退出臨界區時,需要呼叫v原語句來釋放資源。
高階通訊: 指 程序之間可以傳送任意數量的資料,一般不是乙個或幾個位元組而是一大塊資料,如乙個檔案或者乙個緩衝區的內容。這種方式主要包括 共享記憶體、訊息傳遞、管道。
下面詳細介紹以上幾種高階通訊方式。
(1)共享記憶體:現代作業系統普遍採用虛擬儲存管理,每個程序都有自己的虛擬位址空間,作業系統可以把這些虛擬的位址空間對映到物理記憶體。共享記憶體就是作業系統提供一些api函式,允許多個程序吧自己位址空間中的某些部分共享出來,對映到相同的一塊物理記憶體區域,就可以實現程序間的資訊交流和共享,如果乙個程序對這塊區域內容進行了修改,另乙個程序立即就能看到修改後的結果。
(2)訊息傳遞:所謂訊息就是 若干的資料位所組成的一段資訊。訊息傳遞就是由作業系統呼叫傳送和接收操作實現程序之間資訊的交換。如果兩個程序要進行通訊首先在兩個程序間建立乙個通訊鏈路然後呼叫傳送和接受操作來交換訊息。
(3)管道 :以檔案系統為基礎,管道就是乙個共享檔案,用於要同信的兩個程序之間的資料通訊,程序對管道的讀寫操作就相當於對檔案的write/read,而且資料流的長度、格式沒有限制。管道通訊的過程:傳送程序可以不斷地從管道一段寫入資料流,接受程序在需要的時候可從管道的另一端按先進先出的順序讀取資料,這樣就實現了兩個程序間的通訊。另外,在對管道檔案進行讀寫操作的過程中,在傳送程序和接受程序之間也要進行正確的同步和互斥,以確保通訊的正確性。
採用共享記憶體的程序間通訊需要通訊程序建立共享記憶體區域,程序通過向此區域讀寫或交換資訊。共享記憶體是解決生產者與消費者問題方法中的一種。為了允許生產者程序和消費者程序能併發執行,必須在共享記憶體區域有乙個緩衝來被生產者填充並且被消費者使用。
緩衝分為無限緩衝和有限緩衝。無限緩衝顧名思義,就是對大小沒有限制,因此生產者總是可以產生新項,而消費者有時候卻需要等待新項的產生。有限緩衝就是緩衝大小固定,如果緩衝為空,那麼消費者必須等待,如果緩衝為滿,那麼生產者必須等待。
訊息傳遞系統通過報文的方式來傳遞訊息,訊息傳遞系統的接收與傳送有如下幾種操作方法:
1、直接或者間接通訊
直接就是乙個傳送端,乙個接收端,每對程序間只有一條線路。間接就是傳送端傳送到第三方郵箱(或者稱為物件)中,再由第三端發到接收端。對於間接通訊,乙個程序可能通過許多不同的郵箱與其他程序通訊,但兩個程序僅在其共享至少乙個郵箱時可以相互通訊。
2、同步與非同步通訊
同步與非同步也稱為阻塞與非阻塞
傳送者阻塞:傳送程序阻塞,直到訊息被接收程序或者郵箱接收。
傳送者非阻塞:傳送程序傳送訊息並且繼續操作。
接收者阻塞:接受者阻塞,直到有訊息可用。
接收者非阻塞:接收者收到乙個有效訊息或者空訊息。
3、緩衝
零容量:線路中不能有任何資訊處於等待,因此必須阻塞傳送,直到接收者接收資訊
有限容量:就是緩衝大小固定,如果緩衝為空,那麼消費者必須等待,如果緩衝為滿,那麼生產者必須等待。
無限容量:就是對大小沒有限制,因此生產者總是可以產生新項,而消費者有時候卻需要等待新項的產生。
php程序間通訊 yoc PHP程序間通訊
php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...
程序間通訊
實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...
程序間通訊
最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...