阻塞IO與非阻塞IO
- 阻塞IO
- 概念 阻塞IO執行的系統調用可能因為無法立即完成而被伺服器挂起,直到等待的事件發生為止。
- 示例 當用戶端發送建立連接配接請求給伺服器端的時候 調用connect 發送sync 請求給伺服器并等待伺服器響應。 當用戶端遲遲沒收到伺服器端的ack 封包的時候,用戶端的connect 系統調用被伺服器挂起, 直到用戶端收到ack 封包并喚醒connect 調用或者等待逾時傳回。
- 包括 accept recv send connect
- 非阻塞IO
- 概念非阻塞IO 執行的系統調用總是立即傳回, 不管事件是否發生, 通過傳回值确定事件是否發生,根據error 資訊确認事件的狀态。非阻塞需要程式不斷的去輪詢檢視資料是否到達。
- ERROR說明
- EAGAIN 事件未發生
- EWOULDBLOCK 事件未發生
- EINPROGRESS connect未完成
阻塞IO 與非阻塞IO 是應用程式在調用系統調用時所處的一種狀态。
同步與異步
- 同步 在IO 資料到達時 需要使用者代碼自行将資料從核心緩沖區讀入到使用者緩沖區,或将資料從使用者緩沖區寫到核心緩沖區。不會通知應用程式
- 異步 在資料到達時,将資料拷貝到使用者緩沖區并通知應用程式。在IO 資料到達時 由核心将資料從核心緩沖區讀到使用者緩沖區或将資料從使用者緩沖區寫入核心緩沖區并通知使用者程式資料就緒。應用程式從使用者緩沖區讀。
同步向應用程式通知IO 就緒事件(需要應用程式自己去讀取資料從核心中)。異步向應用程式通知IO完成事件。(資料已經由核心從核心緩沖區拷貝到使用者緩沖區)
示例 老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)
老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
老張還是覺得自己有點傻,于是變高端了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)
老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
老張覺得自己聰明了。所謂同步異步,隻是對于水壺而言。普通水壺,同步;響水壺,異步。雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。同步隻能讓調用者去輪詢自己(情況2中),造成老張效率的低下。所謂阻塞非阻塞,僅僅對于老張而言。立等的老張,阻塞;看電視的老張,非阻塞。情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對于立等的老張沒有太大的意義。是以一般異步是配合非阻塞使用的,這樣才能發揮異步的效用。——來源網絡,作者不明。