[OS] 作業系統筆記-Process間的溝通
鼠年全馬鐵人挑戰 - WEEK 18
前言
上篇筆記過Process的狀態及管理,本篇筆記Process間的溝通
Process間的溝通
現代作業系統中,通常不會只有一個Process存在於作業系統內,通常有好幾個Processes同時存在並同時執行。
這些執行的Process可以分成兩大類
- independent process(獨立行程): 該Process無法影響其它Process的執行,同時它也不受其他Process影響,獨立的Process之間不會有任何共享資料。
- cooperating process(合作行程):該Process能夠影響其它Process,或是受其它Process影響,故Process之間會有共享的資料,需要有進行資訊交換的管道
簡單做個整理:
independent process | cooperating process |
---|---|
Process之間不會有任何共享的資料 | Process之間會有部分共享的資料 |
Process間的溝通需透過IPC(interprocess communication) ,IPC有兩種模式設計:
- Share Memory
- Message Passing
可以用生產者(Producer)跟消費者(Consumer)間的關係來解釋這兩種模式,Producer會產生資料放在有限或是無限的buffer中等Consumer來消費。
Process在傳輸資料時,buffer有三種型態:
- zero capacity:一定要收完之後才能再送,沒有地方給資料排隊。
- bounded capacity:有限度的空間給資料排隊,若是滿了就必須要等。
- unbounded capacity:無限的空間給資料,發送者可以一直送資料。
Share Memory (共享記憶體)
Process之間共享一部分的記憶體(共享變數;Shared Variables),透過存取記憶體達到彼此溝通、交換資訊的目的。
shared memory是用read跟write資料來完成資訊交換
也可以這麼說:
producer會把資料放進buffer內(write),而consumer會去同一個buffer把資料取出來(read)
Message Passing (訊息傳遞)
Process間會建立連接通道(Communication Link)來溝通,非借助共享變數
過程會是:
- 建立Communication Link
- 互傳訊息 (Message)
- 傳輸完畢,中斷連接通道 (release link)
建立連接通道時,會分做傳送(send)方與接收(receive)方,而通訊(Communication)的方式也分成兩種:
- 直接傳訊息(Direct)
- 間接傳遞(Indirect)
Direct | Indirect |
---|---|
建立link用send跟receive來傳送訊息 | 訊息是從 mailbox 裡直接接收(只能共享mailbox資料) |
為自動建立 | 每個mailbox都有個獨特的ID |
一個Link剛好連接一對Process | 一對process之間,可能存在多條Link |
每個行程必須要明確地命名 | 要建立連結,只能是行程共享郵箱 |
間接傳遞的過程中,通訊的同步非常重要,分作兩種形式:
- blocking
- Blocking send:訊息傳遞出去,Process被Block阻擋,直到對方訊息收到才可再傳送。
- Blocking receive:不做任何動作,直到訊息送來,再回傳收到的資訊。
- non-blocking
- Non-blocking send:不管對方有無收到訊息,持續發送訊息給對方。
- Non-blocking receive:接收者只接收有效訊息,或是沒有訊息。
將兩者的比較做個整理:
Share Memory | Message Passing | |
---|---|---|
溝通方式 | 共享一部分的記憶體(透過共享變數存取資料) | Process 之間建立Communication Link |
共享性 | 共享變數所有process皆可存取 | process間有專屬的Link,不會隨意被其他Process共用 |
多個Process間,如何確定是哪個Process接收到訊息?
- 規定在某一時間內,只有一個Process可以接收訊息。
- 由系統決定,是哪個Process接收,再回傳訊息告知是誰收到。