進程通訊
- 進程通訊是指進程之間的信息交換
- 交換的信息量:一個狀態或數值,上千個字節。
進程通訊的分類
1)低級通訊:進程的互斥和同步 2)高級通訊:安全
指用戶可直接利用OS提供的一組通訊命令,高效地傳送大量數據的一種通訊方式。對用戶透明。
高級通訊分類
共享存儲器系統
(1)共享數據結構的通訊方式服務器
進程之間經過某種數據結構,如緩衝池進行通訊屬於低級通訊方式。網絡
(2)共享存儲區通訊方式數據結構
爲了傳送大量信息,在存儲器中劃出一塊共享存儲區,進程可經過對共享存儲區進行讀或寫來實現通訊,屬於高級通訊方式。計算機網絡
消息傳遞系統
消息交換的單位是消息或報文,分兩種:code
(1)直接通訊方式進程
(2)間接通訊方式ip
計算機網絡中將消息稱爲報文。同步
直接通訊方式
- 發送進程直接把消息發送給目標進程
- 發送進程和接收進程都以顯式方式分別提供對方的標識符
- 系統提供兩條通訊原語
Send(Receiver,message);it
Receive(Sender,message);
例如:
Send(P2,m1);
Receive(P1,m1);
解決生產者——消費者問題
repeat ...
produce an item in nextp;
...
Send(consumer,nextp);
until false;
repeat
Receive(producer,nextp);
...
Consumer the item in nextc;
until false;
間接通訊方式
- 進程之間的通訊須要經過某種中間實體,該實體用來暫存發送進程發送給目標進程的消息;接收進程則從該實體中取出對方發送給本身的消息。
- 這種中間實體稱爲信箱
- 消息在信箱中能夠安全的保存,只容許覈準的目標用戶隨時讀取,故可實現非實時通訊。
信箱的建立和撤銷
- 進程用信箱建立原語來創建一個新信箱。建立者進程應給出信箱名字、信箱屬性(公用、使用或共享);對於共享信箱,還應給出共享者的名字。
- 用信箱撤銷原語來撤銷
消息的發生於接收
- Send(mailbox,message),將一個消息發送到指定信箱
- Reveieve(mailbox,message),從指定信箱中接收一個消息
信箱分類
私用信箱
- 用戶進程創建,做爲該進程的一部分
- 擁有者有權讀消息,其餘用戶只能發送
- 採用單向通訊鏈路
- 進程結束時信箱也消失
公用信箱
- 由OS建立
- 提供給系統中的全部覈准進程使用
- 進程既發送也可取出
- 採用雙向通訊鏈路的信息來實現
- 系統運行期間始終存在
共享信箱
- 由某進程建立,建立時提供共享進程(用戶)的名字
- 信息的擁有者和共享者,都有權從信箱中取走發送給本身的消息
信息通訊時發送進程和接收進程的關係
- 一對一關係。創建一條專用的通訊鏈路
- 多對一關係。服務進程與多個用戶進程之間進行交互,又稱客戶|服務器交互
- 一對多關係。一個發送進程與多個接收進程進行交互,使發送進程可用廣播形式,向接收者發送消息。
- 多對多關係。創建一個公用信箱,多個進程投遞並取走本身的消息
管道通訊
- 管道通訊方式創建在文件系統(文件系統位於外存)的基礎上,利用共享文件來鏈接兩個相互通訊的進程,此共享文件稱爲管道(Pipe)
- 管道是指用於鏈接一個讀進程和一個寫進程,以實現它們之間通訊的共享文件。
管道通訊必需的協調能力
(1)互斥。當一個進程正在對管道進行讀/寫操做時,另外一進程必須等待。
(2)同步。當寫(輸入)進程把必定量的數據(如4K)寫入管道後,便去睡眠等待,直到讀(輸出)進程取走數據後再把他喚醒。當讀進程發現管道空時,也應睡眠等待,直至寫進程將消息寫入管道後,纔將它喚醒。
(3)判別對方是否存在,只有肯定了對方存在時方能進行通訊。