本文為「巨型服務架構」第五章 輸入輸出設計 閱讀重點筆記。有興趣的朋友們歡迎購買原書來閱讀。
目錄
定義呼叫方和接收方的訊息通訊機制
- 同步:
- 呼叫方發出 request,直到接收方處理完成,才能收到 response
- 發,收
- 非同步:
- 呼叫方發出 request,會先收到接收方回傳的 response,但要求尚未處理完成。之後接收方處理完再回傳給呼叫方
- 發,收,收
定義呼叫方發出 request 到收到 response 之間的狀態
- 阻塞:
- 呼叫方發出 request,再等到 response 之前都必須暫停,直到 response 回來才能繼續下去
- 發,停下等待,收
- 非阻塞:
- 呼叫方發出 request,再等到 response 之前可以繼續做別的事情,不會被暫停
- 發,做別的事,收
非同步作業,討論阻塞和非組塞沒有太大的意義,因為非同步會立刻得到回應。因此一般我們提
- 阻塞式IO == 同步阻塞式IO
- 非阻塞式IO == 同步非阻塞式IO
IO模型
- 直接操作介面:通常是嵌入式系統
- 程式直接對介面進行雙向操作
- 程式 <-> 介面
- 操作快取:一般我們遇到的系統皆是
- 程式會透過快取對介面進行兩階段雙向操作
- 發送資料:程式 -> 快取 -> 介面
- 接收資料:程式 <- 快取 <- 介面
阻塞式 IO 模型 (Blocking IO, BIO)
- 常見的 IO 模型
- 呼叫方呼叫 IO 操作後,執行緒被暫停,等待接收階段 (介面 -> 快取) 和 複製階段 (快取 -> 程式) 完成後才會被喚醒
非阻塞式 IO 模型 (Non-blocking IO, NIO)
- 呼叫方發起 IO 操作,無論接收階段是否完成,IO 會立刻發出回應
- 呼叫方執行緒不會被暫停
- 呼叫方必須自行輪詢 IO 狀態來得知是否接收完成
- 雖然呼叫方不會被暫停,但輪詢 IO 卻會帶來性能的浪費
- 是同步非阻塞操作
- 不常用此模型,但會作為後面模型的基礎
訊號驅動式 IO 模型
- 因為非組塞要輪詢浪費效能,這邊改用監聽的方式來優化
- 先註冊監聽。監聽 callback 後再進行 IO 操作
- 是非同步操作
- 不常用此模型,但會作為後面模型的基礎
重複使用式 IO 模型
- 與訊號驅動式非常相似,但是在註冊監聽後會被阻塞,直到 callback 回來才能操作
- 這個模型再度將非阻塞變成阻塞,直覺上不合理
- 差異是一次灑出多個 IO 操作,並註冊同一個監聽後阻塞
- IO 只要其一接收完成,就會呼叫 callback,程式即可被喚醒並處理資料
- 解決阻塞式模型一執行緒只能做一 IO 操作
非同步式 IO 模型
- 訊號驅動式設定監聽並回呼後,需要自行再對 IO 操作取得資料,這兩步驟是必然的順序
- 此模型直接將兩步驟做掉,不用在程式中顯式做兩次呼叫
- 只需設定監聽,最後回呼就能得到資料