今天是Process最後一節了,撐住阿!!!!!
OS中,絕大多數情況下不是只有一個程式在跑。而是多的Process同時運作。Process之間就像一間公司一樣,可能各做各的,也可能彼此配合、傳遞資料。這就產生了「行程間通訊(IPC)」的需求。我們可以將行程分成兩類:
至於Process之間需要溝通的可能如下:
要完成IPC可以通過一下兩種方式操作:
第一,Shared Memory(共享記憶體):建立一塊記憶體區塊,讓多個行程能同時存取那塊記憶體(J個我們會在後續記憶體當中去談到)。
第二,Message Passing(訊息傳遞):Process之間用「傳送訊息」的方式來溝通,就像同桌之間的傳紙條一樣。
下圖分別表示了Shared Memory(左)與Message Passing(右)
Message Passing的精髓在於:Process之間不直接共享記憶體,而是透過傳送訊息來溝通。所以Process每一次互動就是:
send(message); // 傳送訊息
receive(message); // 接收訊息
而當我們在設計Message Passing時,會需要考慮以下三個問題:
第一,命名方式(Naming):就像寫信一樣。Process彼此之間需要知道「誰傳給誰」。依據Naming可以區分為:
send(P, msg):傳訊息給 P
receive(Q, msg):從 Q 收訊息
send(A, msg):傳送給信箱 A
receive(A, msg):從信箱 A 收訊息
第二,同步方式(Synchronization):當Process在傳送或接收時,要不要等對方?當 send() 和 receive() 呼叫時,會不會「等對方」?
當 send() 和 receive() 都是 blocking,稱為 rendezvous(會合點) → 雙方等彼此,成功才繼續。這邊就用表格來做呈現~
Blocking | Non-blocking | |
---|---|---|
Send | 傳送後卡住,等對方收到才繼續 | 傳送後就繼續跑,不管對方有沒有收到 |
Receive | 沒收到就卡住,一直等 | 嘗試接收,有的話就收,沒有就回傳 null |
第三,緩衝區設計(Buffering):送出去的訊息要暫存在哪裡?如果空間不夠,訊息就塞不進去。即使是 message passing,訊息在送達之前也要有地方暫存,即為buffer(緩衝區)。
類型 | 說明 |
---|---|
0 容量 (Zero Capacity) | 緩衝區不能存訊息 → send() 會卡住,直到 receive() 把訊息收走 |
有限容量 (Bounded Capacity) | 緩衝區最多可存 n 筆訊息,如果滿了 → send() 會等 |
無限容量 (Unbounded Capacity) | 想送幾筆就送幾筆,send() 永遠不會卡住(理論上) |
到這邊,我們的Process就算告一的段落拉~~~