作業系統6 程序間通訊IPC

2021-08-20 05:21:33 字數 4163 閱讀 8224

四.管道通訊

五.訊息傳遞機制

六.客戶機-服務機系統

七.參考資料

程序通訊是指程序間的資訊交換。在程序的互斥與同步中,也在程序之間交換了一些資訊,因此不少學者也將他們歸為低階程序通訊。他們低階的原因在與:① 效率低 ② 通訊對與使用者不透明.

在程序間要傳遞大量資料是,應當利用os提供的的高階通訊工具,目前,常見的高階通訊機制可歸為四類:共享儲存器,管道通訊系統,訊息傳遞系統,客戶機-服務機系統.

1. 概述

相互通訊的程序間共享某些資料結構或者共享儲存去,程序之間通過他們進行通訊,據此把他們分為兩種型別:基於共享資料結構,基於共享儲存區。

2. 共享某些資料結構

在這種通訊方式下,要就諸程序公用某些資料結構,藉此來實現諸程序間的資訊交換。資料結構的設定和同步處理都是由使用者完成的嗎,不透明,效率低,僅用於傳遞少量資料.

3. 共享儲存區

這周通訊方式下,程序向系統申請共享儲存區的乙個分割槽,並指定該分割槽的關鍵字,並將該分割槽連線到本程序對其進行寫。另一程序可根據關鍵字將該分割槽連線到自己之上對其進行讀寫,通過同一分割槽的讀寫,實現兩程序間的資訊交換。

1.概述

管道也稱共享檔案方式,基於檔案系統,利用開啟的共享檔案連線兩個相互通訊的程序,檔案作為緩衝傳輸介質。

管道就是用於連線讀程序和寫程序的共享檔案,寫程序想管道傳送字元流。讀程序從管道中接受字元流。

2. 管道機制必須提供的協調能力

3. linux中的無名管道

a.特點:

b.原型:

c.例子

#include

#include

intmain()

else

return0;

}

4. linux中的命名管道(fifo)

a.特點:

b.原型:

c.例子

fifo的通訊方式類似於在程序中使用檔案來傳輸資料,只不過fifo型別檔案同時具有管道的特性。在資料讀出時,fifo管道中同時清除資料,並且「先進先出」。下面的例子演示了使用 fifo 進行 ipc 的過程:

write_fifo.c

#include

#include

// exit

#include

// o_wronly

#include

#include

// time

intmain()

for(i=

0; i<10;

++i)

sleep(1

);// 休眠1秒

}close

(fd)

;// 關閉fifo檔案

return0;

}

read_fifo.c

#include#include#include#include#includeint main()

while((len = read(fd, buf, 1024)) > 0) // 讀取fifo管道

printf("read message: %s", buf);

close(fd); // 關閉fifo檔案

return 0;

}

1. 概述

在該機制中,以格式化的訊息(message)為通訊單位;利用系統為程序提供的兩個高階通訊原語send和received進行通訊,隱藏看通訊的實現細節,對使用者是透明的,使用非常方便,是使用最廣泛的程序通訊機制。

send: 但要進行訊息傳遞時,執行send

receive:當接收者要接收訊息是執行receive。

根據實現方式不同,可進一步將他們分為兩種:

2.直接訊息傳遞系統的實現方式

a.直接通訊原語

直接資訊傳遞系統分為兩種。

對稱定址方式,這種方式下,傳送程序和程序都要求以顯式方式提供對方的的識別符號,通常,系統提供的原語如下

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

receive(sender,message);接受傳送程序的訊息

非對稱定址方式,這種方式中,接受程序的原語中,並不需要命名傳送程序。只填寫表示源程序引數。原語如下:

send(p,message);

recrive(id,message);

b.訊息的格式

訊息的格式常用的就是較短的定長訊息格式,和較長的可變的訊息格式。定長的訊息格式處理簡單,儲存空間開銷少。可變的訊息格式方便使用者的使用,但是處理和儲存空間需要更多的更大的開銷.

c.通路鏈路

為了在傳送程序和接受程序自己能進行通訊,必須在兩者之間建立一條通訊鏈路。

有兩種方式建立通訊鏈路:

第一種:由傳送程序在通訊之前用顯示的"通訊連線"命令請求系統為之建立一條通訊鏈路。在鏈路使用完後拆除鏈路。(主要用於計算機網路)

第二種:傳送程序無需明確提出建立鏈路的請求,只需要利用系統提供的傳送命令原因,系統會自動為之建立一條鏈路。

3.信箱通訊的實現方式

信箱通訊屬於間接的通訊方式,即程序之間的通訊,通過某種實體來完成。接受程序可以從該實體中取出傳送程序的訊息,通常我們把這份實體成為信箱(郵箱),每乙個信箱都有唯一乙個識別符號。

a.信箱的結構

信箱定義為一種資料結構,通常從邏輯上分為兩部分。

資訊頭:存放有關信箱的描述資訊,如信箱識別符號,信箱的擁有者,信箱的口令,信箱的空格數。

信箱體:由若干個可以存放訊息(或者訊息頭)的信箱個。

b.信箱通訊原語

系統為信箱通訊提供了若干個原語:

信箱的建立和取消。程序可以利用信箱建立原語來建立乙個新信箱,建立者程序應該給出信箱的名字,信箱的屬性;對於共享信箱還應該給出共享者。當程序不再需要信箱時,可以利用撤銷原語撤銷。

訊息的傳送和接受

send(mainbox,message); //將乙個資訊傳送到指定的信箱中

receive(mainbox,message);//從指定的信箱中取出資訊

c.信箱的型別

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

4.直接訊息傳遞系統例項

a.資料結構

在訊息緩衝佇列通訊方式中,主要利用的資料結構是訊息緩衝區

描述如下:

typedef struct message_buffer
在pcb有關通訊的資料項中。加入以下項

typedef struct processcontrol_blockpcb
b.傳送原語傳送原語描述如下:

void send(receiver,a)
c.接收原語接受原語描述如下:

void receive(b)
前面所述的各種技術,雖然也實現了不同計算機間程序的通訊,但客戶機——伺服器的通訊機制,在網路環境的各種應用已成為當前主流,其主要的實現方式分為三類:套接字(scoket),遠端過程呼叫和遠端方法呼叫。

1. 套接字scoket

乙個套接字就是有關通訊標識型別的資料結構,包含了通訊目的地,通訊使用的埠號,通訊網路的傳輸層協議,程序所在的網路位址,以及針對客戶或者伺服器所提供的不同的系統呼叫。通常套接字包括兩類:

套接字的優勢在於,它不僅適用於同一臺計算機內部的程序通訊,也適用於網路環境中不同計算機間的程序通訊。

2. 遠端過程呼叫和遠端方法呼叫

遠端過程呼叫,是乙個通訊協議,用於通過網路連線的系統。該協議允許執行一台主機系統上的程序呼叫另一台主機系統上的程序,而對程式設計師表現為常規的程序呼叫,無需為此額外程式設計。

《作業系統 第四版》

程序間通訊(ipc)介紹

作業系統12 程序間通訊IPC

1.程序通訊 ipc,inter process communication 1.1直接通訊 1.2間接通訊 1.3阻塞通訊 1.4非阻塞通訊 2.訊號 signal 3.管道 pipe 4.訊息佇列 5.共享記憶體 程序通訊是程序進行通訊和同步的機制 ipc提供2個基本操作 傳送操作 send m...

作業系統 程序間通訊

程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...

作業系統 程序間通訊

include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...