程序通訊的型別

2021-07-13 13:52:56 字數 4441 閱讀 8956

3.5.1 程序通訊的型別

1、程序通訊的定義

程序之間的資訊交換。

2、按程序通訊機制發展來分

◆ 低階程序通訊機制

◇少量的資訊交換,沒有專門的通訊機制,如訊號量機制(同步和互斥);

◇效率低,通訊對使用者不透明。

◆ 高階程序通訊機制

大量的資訊交換,有專門的通訊機制。

◇共享儲存器系統(shared-memory system)

相互通訊的程序共享某些資料結構和共享儲存區,程序之間能夠通過它們進行通訊。

▲ 基於共享資料結構的通訊方式

要求各程序公用某些資料結構,程序通過它們交換資訊。效率低,只適於少量資料傳遞。

▲ 基於共享儲存區的通訊方式

在儲存器中劃出一塊共享儲存區,各程序通過對共享儲存區中的資料進行讀或寫來實現通訊。

◇訊息傳遞系統(message passing system)

程序間的資料交換以訊息(message—在計算機網路中稱為報文)為單位,程式設計師直接利用系統提供的一組通訊命令(原語)來實現通訊。能夠通過它們進行通訊。目前系統中的主要程序通訊方式。

不論是單機系統、多機系統,還是計算機網路,訊息傳遞機制都是用得最廣泛的一種程序間通訊的機制。在訊息傳遞系統中,程序間的資料交換,是以格式化的訊息(message)為單位的;在計算機網路中,又把message稱為報文。程式設計師直接利用系統提供的一組通訊命令(原語)進行通訊。作業系統隱藏了通訊的實現細節,大大減化了通訊程式編制的複雜性,而獲得廣泛的應用。訊息傳遞系統的通訊方式屬於高階通訊方式。又因其實現方式的不同而進一步分成直接通訊方式和間接通訊方式兩種。

▲ 直接通訊方式

傳送程序直接將訊息傳送給接收程序,並將其掛在接收程序的訊息緩衝佇列上。接收程序從訊息緩衝佇列中取得訊息。

▲ 間接通訊方式

傳送程序將訊息發到某種中間實體(一般稱為信箱)中,接收程序從中取得訊息。

◇管道(pipe)通訊

所謂「管道」,是指用於連線乙個讀程序和乙個寫程序以實現他們之間通訊的乙個共享檔案,又名pipe檔案。向管道(共享檔案)提供輸入的傳送程序(即寫程序), 以字元流形式將大量的資料送入管道;而接受管道輸出的接收程序(即讀程序),則從管道中接收(讀)資料。由於傳送程序和接收程序是利用管道進行通訊的,故又稱為管道通訊。這種方式首創於unix系統,由於它能有效地傳送大量資料,因而又被引入到許多其它作業系統中。

為了協調雙方的通訊,管道機制必須提供以下三方面的協調能力:① 互斥,即當乙個程序正在對pipe執行讀/寫操作時,其它(另一)程序必須等待。 ② 同步,指當寫(輸入)程序把一定數量(如4 kb)的資料寫入pipe,便去睡眠等待, 直到讀(輸出)程序取走資料後,再把他喚醒。當讀程序讀一空pipe時,也應睡眠等待,直至寫程序將資料寫入管道後,才將之喚醒。③ 確定對方是否存在,只有確定了對方已存在時,才能進行通訊。

3.5.2 訊息傳遞通訊的實現方法

1、直接通訊方式

是指傳送程序利用os所提供的傳送命令,直接把訊息傳送給目標程序。此時,要求傳送程序和接收程序都以顯式方式提供對方的識別符號。通常,系統提供下述兩條通訊命令(原語):

send(receiver, message); 傳送乙個訊息給接收程序。

receive(sender, message); 接收sender發來的訊息。

如原語send(p2,m1)表示將訊息m1傳送給接收程序p2;而原語receive(p1,m1)則表示接收由p1發來的訊息m1。

在某些情況下,接收程序可與多個傳送程序通訊,因此,它不可能事先指定傳送程序。例如,用於提供列印服務的程序,它可以接收來自任何乙個程序的「列印請求」訊息。對於這樣的應用,在接收程序接收訊息的原語中的源程序引數,是完成通訊後的返回值,接收原語可表示為:

receive (id, message);

我們還可以利用直接通訊原語,來解決生產者-消費者問題。當生產者生產出乙個產品(訊息)後,便用send原語將訊息傳送給消費者程序;而消費者程序則利用receive原語來得到乙個訊息。如果訊息尚未生產出來,消費者必須等待,直至生產者程序將訊息傳送過來。生產者-消費者的通訊過程可分別描述如下:

repeat

…produce an item in nextp;

…send(consumer, nextp);

until false;

repeat

receive(producer, nextc);

…consume the item in nextc;

until false;

2、間接通訊方式

◆ 信箱的建立和撤消

程序可利用信箱建立原語來建立乙個新信箱。建立者程序應給出信箱名字、信箱屬性(公用、私用或共享);對於共享信箱,還應給出共享者的名字。當程序不再需要讀信箱時,可用信箱撤消原語將之撤消。

◆ 訊息的傳送和接收

當程序之間要利用信箱進行通訊時,必須使用共享信箱,並利用系統提供的下述通訊原語進行通訊。

send(mailbox, message); 將乙個訊息傳送到指定信箱

receive(mailbox, message); 從指定信箱中接收乙個訊息

◆ 示例

◆ 信箱分類

信箱可由作業系統建立,也可由使用者程序建立,建立者是信箱的擁有者。據此,可把信箱分為以下三類。

◇ 私用信箱

使用者程序可為自己建立乙個新信箱,並作為該程序的一部分。信箱的擁有者有權從信箱中讀取訊息,其他使用者則只能將自己構成的訊息傳送到該信箱中。這種私用信箱可採用單向通訊鏈路的信箱來實現。 當擁有該信箱的程序結束時,信箱也隨之消失。

◇ 公用信箱

它由作業系統建立,並提供給系統中的所有核准程序使用。核准程序既可把訊息傳送到該信箱中,也可從信箱中讀取傳送給自己的訊息。顯然,公用信箱應採用雙向通訊鏈路的信箱來實現。通常,公用信箱在系統執行期間始終存在。

◇ 共享信箱

它由某程序建立,在建立時或建立後,指明它是可共享的,同時須指出共享程序(使用者)的名字。信箱的擁有者和共享者,都有權從信箱中取走傳送給自己的訊息。

◆ 傳送程序和接收程序之間的關係

在利用信箱通訊時,在傳送程序和接收程序之間,存在以下四種關係:

◇ 一對一關係

這時可為傳送程序和接收程序建立一條兩者專用的通訊鏈路,使兩者之間的互動不受其他程序的干擾。

◇多對一關係

允許提供服務的程序與多個使用者程序之間進行互動,也稱為客戶/伺服器互動(client/server interaction)。

◇一對多關係

允許乙個傳送程序與多個接收程序進行互動,使傳送程序可用廣播方式,向接收者(多個)傳送訊息。

◇多對多關係

允許建立乙個公用信箱,讓多個程序都能向信箱中投遞訊息;也可從信箱中取走屬於自己的訊息。

3.5.3 訊息傳遞系統實現中的若干問題

1、通訊鏈路(communication link)

◆ 建立方式:

◇ 顯式建立鏈路

◇ 隱式建立鏈路

◆ 分類:

◇ 按連線方法

▲ 點—點連線通訊鏈路

一條鏈路只連線兩個結點(程序);

▲ 多點連線鏈路

指用一條鏈路連線多個(n>2)結點(程序)。

◇ 按通訊方式

▲ 單向通訊鏈路

只允許傳送程序向接收程序傳送訊息;

▲ 雙向鏈路

既允許由程序a向程序b傳送訊息,也允許程序b同時向程序a傳送訊息。

◇ 按通訊線路的容量

▲ 無容量通訊鏈路

在通訊鏈路上沒有緩衝區,不能暫存任何訊息。

▲ 有容量通訊鏈路

在通訊鏈路中設定了緩衝區,能暫存訊息。緩衝區數目愈多,容量越大。

2、訊息的格式(message format)

3、程序同步方式(process synchronous mode)

◆ 傳送程序阻塞、 接收程序阻塞——匯合

◆ 傳送程序不阻塞、 接收程序阻塞

◆ 傳送程序和接收程序均不阻塞

3.5.4 訊息緩衝佇列通訊機制

1、訊息緩衝佇列通訊機制中的資料結構

◆ 訊息緩衝區

struct message buffer

◆ pcb中有關通訊的資料項

在設定訊息緩衝佇列的同時,還應增加用於對訊息佇列進行操作和實現同步的訊號量,並將它們置入程序的pcb中。

struct process_control_block

2、傳送原語與接受原語

傳送程序在利用傳送原語傳送訊息之前,應先在自己的記憶體空間,設定一傳送區a,見下圖所示,把待傳送的訊息正文、傳送程序識別符號、訊息長度等資訊填入其中,然後呼叫傳送原語,把訊息傳送給目標(接收)程序。傳送原語首先根據傳送區a中所設定的訊息長度a.size來申請一緩衝區i,接著,把傳送區a中的資訊複製到緩衝區i中。為了能將i掛在接收程序的訊息佇列mq上,應先獲得接收程序的內部識別符號j,然後將i掛在j.mq上。由於該佇列屬於臨界資源,故在執行insert操作的前後,都要執行wait和signal操作。

send(receiver,a)

receive(b)

signal(j.sm);

接收原語

}傳送原語

程序間的通訊方式型別及其比較

管道 pipe 訊號量 semophore 訊息佇列 message queue 訊號 singal 共享記憶體 shared memory 套接字 socket 型別 無連線可靠 流控制記錄訊息型別 優先順序普通pipeny yn流pipeny yn命名pipe fifo ny yn訊息佇列ny ...

程序通訊 程序管道

程序間通訊的幾種常用方式 管道 命名管道 訊號 訊號量 共享記憶體 訊息佇列 套接字。管道 pipe 一種半雙工的通訊方式,資料只能單向流動且只能在具有共同祖先的程序間使用。命名管道 name pipe 也是一種半雙工的通訊方式,但他允許不相關程序間的通訊。訊號 sinal 乙個程序通過訊號通知其他...

程序與程序通訊

程序是可執行的程式的例項,包含兩部分,一部分是作業系統用來管理程序的核心物件,一部分是建立時系統分配的資源,主要是記憶體位址空間。2 程序通訊方法 在乙個程序內建立記憶體對映,卻能夠在其他都個程序中使用。這些程序共享的是物理儲存器的同乙個頁面,在把這些物理記憶體對映到虛擬記憶體時各個程序的虛擬位址並...