1.程序通訊(ipc, inter-process communication)程序通訊是程序進行通訊和同步的機制1.1直接通訊
1.2間接通訊
1.3阻塞通訊
1.4非阻塞通訊
2.訊號(signal)
3.管道(pipe)
4.訊息佇列
5.共享記憶體
ipc提供2個基本操作 傳送操作:send(message) 接收操作:
receive(message)
程序通訊流程 在通訊程序間建立通訊鏈路 通過
send/receive
交換訊息
通訊方式
通訊方式大致分為直接通訊和間接通訊。直接通訊使用共享通道來通訊,間接通訊使用核心來間接通訊。
程序必須正確的命名對方
send (p, message) –
傳送資訊到程序p
receive(q, message) –
從程序q
接受訊息
通訊鏈路的屬性
自動建立鏈路,
一條鏈路恰好對應一對通訊程序,每對程序之間只有乙個鏈結存在,鏈結可以是單向的,但通常為雙向的
通過作業系統維護的訊息佇列實現程序間的訊息接收和傳送,每個訊息佇列都有乙個唯一的標識,只有共享了相同訊息佇列的程序,才能夠通訊。
通訊鏈路的屬性
只有共享了相同訊息佇列的程序,才建立連線,連線可以是單向或雙向,訊息佇列可以與多個程序相關聯,每對程序可以共享多個訊息佇列
阻塞傳送 傳送者在傳送訊息後進入等待,直到接收者成功收到
阻塞接收 接收者在請求接收訊息後進入等待,直到成功收到乙個訊息
非阻塞傳送 傳送者在訊息傳送後,可立即進行其他操作
非阻塞接收 沒有訊息傳送時,接收者在請求接收訊息後,接收不到任何訊息
ipc通訊方式主要由訊號,管道,訊息佇列和共享記憶體等。
程序間的軟體中斷通知和處理機制
訊號的接收處理
捕獲(catch)
:執行程序指定的訊號處理函式被呼叫 忽略
(ignore)
:執行作業系統指定的預設處理
遮蔽(mask
):禁止程序接收和處理訊號
訊號的實現
程序間基於記憶體
檔案的通訊機制
子程序從父程序繼承檔案描述
符 預設檔案描述符:0
stdin
, 1
stdout
, 2
stderr
程序不知道(或不關心)的另一端
與管道相關的系統調
用讀管道:
read(
fd, buffer,
nbytes)
寫管道:
write(
fd, buffer,
nbytes)
建立管道:
pipe(
rgfd) rgfd
是2個檔案描述符組成的陣列 rgfd
[0]是讀檔案描述符 rgfd
[1]是寫檔案描述符
建立管道 為
ls建立乙個程序
, 設定
stdout
為管道寫端
為more
建立乙個程序
, 設定
stdin
為管道讀端
訊息佇列是由作業系統維護的以位元組序列為基本單位的間接通訊機制.
每個訊息
(message
)是乙個位元組序列
相同標識的訊息組成按先進先出順序組成乙個訊息佇列(message queues)
訊息佇列的系統呼叫
msgget
( key, flags
) 獲取訊息佇列標識
msgsnd
( qid,
buf, size, flags
)傳送訊息
msgrcv
( qid,
buf, size, type, flags
)接收訊息
msgctl
( …
) 訊息佇列控制
共享記憶體是把同乙個物理記憶體區域同時對映到多個程序的記憶體位址空間的通訊機制。
每個程序都有私有記憶體位址空間,每個程序的記憶體位址空間需明確設定共享記憶體段。
同一程序中的執行緒總是共享相同的記憶體位址空間。
快速、方便地共享資料;必須用額外的同步機制來協調資料訪問
共享記憶體的
實現
利用邏輯位址到實體地址的對映來完成
共享記憶體
系統呼叫
shmget
( key, size, flags
)建立共享段
shmat
( shmid
, *shmaddr
, flags
)把共享段對映到程序位址空間
shmdt
( *shmaddr
)取消共享段到程序位址空間的對映
shmctl
( …)共享段控制
需要訊號量等機制協調共享記憶體的訪問衝突
參考:清華大學 作業系統 陳渝
作業系統6 程序間通訊IPC
四.管道通訊 五.訊息傳遞機制 六.客戶機 服務機系統 七.參考資料 程序通訊是指程序間的資訊交換。在程序的互斥與同步中,也在程序之間交換了一些資訊,因此不少學者也將他們歸為低階程序通訊。他們低階的原因在與 效率低 通訊對與使用者不透明.在程序間要傳遞大量資料是,應當利用os提供的的高階通訊工具,目...
作業系統 程序間通訊
程序間通訊涉及到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...