bio,nio,aio的理解
先上幾個圖
BIO:執行緒發起IO請求,不管核心是否準備好IO操作,從發起請求起,執行緒一直阻塞,直到操作完成。如下圖:
NIO(reactor模型):執行緒發起IO請求,立即返回;核心在做好IO操作的準備之後,通過呼叫註冊的回撥函式通知執行緒做IO操作,執行緒開始阻塞,直到操作完成。如下圖:
AIO(proactor模型):執行緒發起IO請求,立即返回;記憶體做好IO操作的準備之後,做IO操作,直到操作完成或者失敗,通過呼叫註冊的回撥函式通知執行緒做IO操作完成或者失敗。如下圖:
然後很多人說:
io一般分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞
bio就是同步阻塞,nio就是同步非阻塞,aio就是非同步非阻塞
劃重點
什麼是同步什麼是非同步?
同步是這事情要我自己幹。
非同步是這事情我可以喊別人幫我幹,然後後面它通知我返回結果,或者我不需要知道任何結果。
什麼是阻塞和非阻塞?
阻塞:我去銀行取錢,一直在排隊,這就是阻塞,因為一直沒輪到我取錢。
非阻塞:我去銀行,能直接去到錢,沒有人擋著我。
io是要幹什麼?
1.等待io,2讀寫io。
一個請求從過來,首先是io準備,io讀寫。
請求先到作業系統,然後再到我們編寫的應用程式,好了現在主體有2個,作業系統和應用程式。
為什麼說bio是同步阻塞的?
答:一個請求過來,直接就在應用程式開了一個執行緒,然後等io準備好,這就是阻塞。然後讀寫io也是自己幹,所以就是同步。
為什麼nio是同步非阻塞嗎?
答:nio不等待io準備,讓作業系統等待,好了再來通知,但是nio自己來io讀寫,(自己幹)所以是同步。
為什麼aio是非同步非阻塞?
答:aio不等待io那就沒有阻塞說法,然後io讀完之後,再來通知成功或者失敗,那麼io也是作業系統讀寫的,io讀寫這事情也是別人乾的。所以就是非同步。
看到這裡發現了嗎?
這裡兩個主體,作業系統和應用程式,因為應用程式是自己,作業系統是別人,所以等待io,如果是作業系統幹了,那就沒有阻塞自己,如果io讀寫作業系統也幫忙幹了,自己也不需要幹,那就是非同步。
同步非同步大家發現概念很多,但是大家沒搞清楚主體是什麼?我(應用程式)自己幹,就是同步。別人(作業系統)幹相對於應用程式,那就是非同步。參照物是自己。
阻塞和非阻塞。參照物同樣我(應用程式)。如果我要等待,那就是我被阻塞了。如果我不需要等待,那就是非阻塞。
同步非同步指的是sever伺服器的執行方式。阻塞,非阻塞是執行緒的狀態。
關於以下:
NIO 和 AIO 效能上對比
AIO在效能上相對於NIO沒有本質的提升。 AIO只是幫助你從核心中將資料複製到使用者空間中,並呼叫你傳入的回撥方法。 NIO 是需要程式自己從核心中將資料複製到使用者空間中,並需要程式自己呼叫相應的處理邏輯。
為什麼會出現這樣的解釋?
因為一臺機子操作程式和應用程式相對計算機是不是同在一條船上,也是同一個cpu在跑。如果應用程式不幹的事情,作業系統幹,所以實際上好的作業系統會比較重要。比如伺服器選用linux的確會比windows還要強,畢竟少個介面的程式的維護和渲染。
參考文章: