進程管理——進程通信
- 低級通信:只能傳遞狀態和整數值(控制信息),其交換的信息少。信號量機制屬於低級通信
- 高級通信:用戶可直接利用操作系統所提供的一組通信命令高效地傳送大量數據的一種通信方式。操作系統隱藏了進程通信的實現細節,即對用戶是透明的。
一、進程通信的類型
- 共享存儲器系統
- 管道通信
- 消息傳遞系統
1、共享存儲器系統
(1)共享數據結構的通信方式
要求諸進程公用某些數據結構,來實現進程間的信息交換。
(2)共享存儲區的通信方式
為了傳輸大量的數據,在存儲器中劃出一塊共享存儲區,諸進程通過對共享存儲區中數據的讀或寫來實現通信。
2、管道通信
管道:是指用於連接一個讀進程和一個寫進程以實現他們之間通信的一個共享文件,又名pipe
- 發送進程(寫進程)以字符流形式向管道提供輸入大量的數據。
- 接收進程(讀進程)則從管道中接收(讀)數據。
3、消息傳遞系統
在消息傳遞系統中,進程間的數據交換,是以格式化的消息為單位的,將通信的數據封裝在消息中,並利用OS提供的一組通信命令(原語),在進程間進行消息傳遞,完成進程間的數據交換。
不僅能實現大量數據的傳遞,而且還隱藏了通信的實現細節
二、消息傳遞通信的實現方式
多個進程在進行交換信息時,如何傳遞信息,即消息傳遞通信的實現方法。按照源進程向目標進程傳遞消息時是以直接的或間接的方式而分為直接通信方式、間接通信方式。
1、直接消息傳遞系統(直接通信方式)
利用OS提供的發送原語,直接把消息發送給目標進程
(1)直接通信原語
OS提供兩條通信命令(原語):
- 對稱尋址方式
Send(receiver,message); //發送一個消息給接收進程;
Receive(sender,message); //接收Sender發來的消息;
- 非對稱尋址方式
Receive (id,message); //返回接收到該消息進程的標識符
(2)消息的格式
- 定長消息格式
在單機系統中,發送進程和接收進程處於同一臺機器中,環境相同,傳遞的消息格式比較簡單。
消息較短,存放消息的內存空間比較小,但對於發送消息的用戶不方便。
- 變長消息格式
在計算機網絡環境下,發送進程和接收進程所處環境不同,消息格式較復雜。
長度可變,對於發送消息的用戶較方便,但存放消息的內存空間較大。
(3)進程的同步方式 (消息傳遞系統中進程的同步機制)
設置適當的同步機制使進程間能夠協調的進行通信
- 發送和接收進程同時阻塞(無消息要傳遞時)
- 發送進程的狀態不限制(有則發,沒有也不阻塞),接收進程通常處於阻塞狀態
- 發送和接收進程都不阻塞,在發送進程和接收進程之間設一個消息隊列;這種機制是一種常見的進程同步形式,也即消息緩沖隊列通信機制。
(4)通信鏈路
為了在發送進程和接收進程之間能進行通信,必須在兩者之間建立一條通信鏈路。
- 第一種方式:顯式“建立連接”,顯式拆除鏈路。(計算機網絡)
- 第二種方式:在發送進程執行發送命令後,系統會自動地建立一條鏈路。 (單機系統)
2、信箱通信(間接通信方式)
進程之間的通信需要通過設置一個共享數據結構的實體來完成
(1)信箱通信原語
- 信箱的創建和撤銷
- 消息的發送和接收
Send(mailbox, message); //將一個消息發送到指定信箱;
Receive(mailbox, message); //從指定信箱中接收一個消息;
(2)信箱類型
- 私用信箱 (由用戶進程創建的,私有的)
- 公用信箱 (由操作系統創建的,共享的)
- 共享信箱 (由某個進程創建的,共享的)
(3)發送進程和接收進程間的關系
- 一對一關系
- 多對一關系:提供服務進程和多個用戶通信(客戶/服務器)
- 一對多關系: 一個發送進程與多個接收進程交互(廣播方式)
- 多對多關系
三、直接消息傳遞系統實例
1、消息緩沖隊列通信機制中的數據結構
(1)消息緩沖區
type struct message_buffer { //記錄型
int sender; //發送者進程標識符
int size; //消息長度
char *text; //消息正文
struct message_buffer *next; //指向下一個消息緩沖區的指針
}
(2)PCB中有關通信的數據項
type struct processcontrol_block {
…
mq; //消息隊列隊首指針
mutex; //消息隊列互斥信號量用於實現進程互斥
sm; //消息隊列資源信號量用於實現進程共同步
…
}
這就是PCB中應增加的三項數據,這些都是保存在接收進程的PCB中的。
(3)發送原語
void send(receiver,a) {
getbuf(a.size, i);
i.sender := a.sender;
i.size := a.size;
copy(i.text, a.text);
i.next := 0;
getid(PCB set, receiver.j);
wait(j.mutex);
insert(j.mq, i);
signal(j.mutex);
signal(j.sm);
}
(4)接收原語
void receive(b) {
j := internal name;
wait(j.sm);
wait(j.mutex);
remove(j.mq, i);
signal(j.mutex);
b.sender := i.sender;
b.size := i.size;
copy(b.text, i.text);
releasebuf(i);
}
(5)消息緩沖通信
進程管理——進程通信