## Naming ### Direct Communication 寄件人要把收件人的名字寫出來,收件人要寫從誰那裡收 例如: ![image](https://hackmd.io/_uploads/BJH3rGKDp.png) - 在每一對要 communicate 的 process 之間(只能剛好一對,即兩個 process 之間)會自動產生 <font color = "snake">**(communication) link**</font>,且 link 只有剛好一個。 Direct Communication 是一種 <font color = "green">**symmetry in addressing**</font> > 因為 sender 和 receiver 都要寫對方的名字才能溝通 另一種 Direct Communication 的變型用的是 <font color = "green">**asymmetry in addressing**</font> > 只有 sender 要寫出 receiver 是誰, receiver 不用寫從誰那邊收 ### Indirect Communication 把訊息送到 mailbox 或是 port #### mailbox process 可以把 message 放進 mailbox,也可把 message 從 mailbox 拿出來。 - 每個 mailbox 有 unique 的 ID > 例如 POSIX message queue 用 int 來當 mailbox 的 ID ![image](https://hackmd.io/_uploads/HJ_juGKwT.png) - 有共用 mailbox 的一對 process 之間才會有 link - link 可能會連到兩個以上的 processes - 在每一對 communicating process 之間,可能存在好幾條不同的 link, 每一個 link 對應到不同的 mailbox --- ##### 會遇到的問題 >假設 $P_1$, $P_2$, $P_3$ 共用 mailbox A 如果 $P_1$ 把一個訊息丟到 mailbox A,而 $P_2$, $P_3$ 同時執行 `receive()` 哪個 process 會收到? → 答案根據選擇的 method 決定 幾種不同的 method: 1. 允許一個 link 最多存在於兩個 process 間 2. 允許一次最多一個 process 能 exec `receive()` 3. 讓系統任意選要給哪個 process(但不能都給) > 挑哪個 process 的方法可能是系統定義一個 algo,例如說 RR --- ##### mailbox 的擁有者 可能是 process 或 OS 1. ==如果 mailbox 是 process 擁有(即 mailbox 在 process 的 address space 裡)== - 我們會區別 owner(只能從 mailbox 收 message) 和 user(只能寄 message 到 mailbox) > 這樣的話每個 mailbox 只會有一個 unique 的 owner,就不會搞混哪個 process 要收 message - 當擁有 mailbox 的 process terminate,mailbox 即消失 2. ==如果 mailbox 是 OS 擁有== - mailbox 是獨立的,不會 attach 在任何 process 之下 - OS 需要提供一個 mechanism 讓 process 可以: - 建立新的 mailbox - 從 mailbox 收/送 message - delete mailbox > 建立新 mailbox 的 process 就是這個 mailbox 預設的 owner 一開始只有這個 process 能透過這個 mailbox 收訊息,但之後擁有權、收訊息的權利可以透過 sys call 讓渡給其他 process --- - 無論是 Direct 還是 Indirect Communication, message 都會被放在一個 <font color = "green">temporary queue</font> 裡, queue 的 implement 有三種類型: 1. ==zero capacity== = message system with no buffering > 完全不能有 message 放在 queue 裡等,所以 sender 必須 block 直到對方收到 message 2. ==bounded capacity== = systems with automatic buffering > 最多 n 個 messages 可以待在 queue 裡,如果 queue 還沒滿,sender 就可以繼續往下執行;但如果 queue 滿了,sender 就要 block 直到 queue 有空間 3. ==unbounded capacity== = systems with automatic buffering > queue 可以無限的放 message,所以 sender 永遠不需要 block --- ## Reference - 恐龍 p.127-