一文帶你區(qū)分阻塞、非阻塞、同步、異步IO

前言:在之前的Redis面試套路拆解的文章[Redis面試套路拆解(一)]中有提到過IO模型,并且IO模型本身也是一個比較容易混淆的高頻面試考點,小黑板將在本篇文章幫你理清思路,區(qū)分各種IO模型~

img

其實網(wǎng)絡(luò)上已經(jīng)有很多博客講了這個問題,但是總是覺得看完之后還是迷迷糊糊的,感覺大家有點太執(zhí)著于把這個問題講的通俗易懂了,經(jīng)常會舉各種各樣的例子,比如燒水、去銀行辦理業(yè)務(wù)之類的,然而看完之后反倒會產(chǎn)生更多的疑問,因為可能舉得例子并不能完美的適用于同步異步、阻塞非阻塞的概念

所以我們今天就不舉例子了,小黑板想從專業(yè)概念的角度來幫助大家理解各種概念~

image

在討論問題之前,我們需要確定一下上下文,以免產(chǎn)生誤解,本文討論的背景是基于Linux的網(wǎng)絡(luò)IO開展的


實際上無論是哪一種IO模型,都可以分為兩個階段(read操作為例):

  • 等待數(shù)據(jù)準(zhǔn)備就緒

  • 將數(shù)據(jù)從內(nèi)核態(tài)拷貝到用戶空間

這里我們需要解釋一下,什么是內(nèi)核態(tài)用戶態(tài)


img

  • 用戶態(tài):也稱為用戶空間,即上層應(yīng)用程序的活動空間,應(yīng)用程序的執(zhí)行必須依賴于內(nèi)核提供的資源

  • 內(nèi)核態(tài):也稱為內(nèi)核空間,控制計算機的硬件資源,并提供上層應(yīng)用程序運行的環(huán)境

:用戶態(tài)可以通過系統(tǒng)調(diào)用切換到內(nèi)核態(tài),這是主動進(jìn)入到內(nèi)核態(tài)。此外在出現(xiàn)異常或者外圍設(shè)備的中斷也會進(jìn)入到內(nèi)核態(tài),不過是被動響應(yīng)的

先說結(jié)論:各種IO模型其實是根據(jù)它在上述兩個階段的不同表現(xiàn)(用戶進(jìn)程或者線程是否阻塞)來區(qū)分的?。。?/strong>


在第一個階段用戶進(jìn)程是否阻塞用來區(qū)分阻塞/非阻塞,在第二個階段用戶是否阻塞用來區(qū)分同步/異步?。?!

阻塞IO

image

當(dāng)用戶進(jìn)程發(fā)起系統(tǒng)調(diào)用recvfrom時,在第一階段,內(nèi)核首先會等待****數(shù)據(jù)準(zhǔn)備就緒,這個過程中用戶進(jìn)程是阻塞的;在第二階段,當(dāng)數(shù)據(jù)準(zhǔn)備就緒之后,數(shù)據(jù)會從內(nèi)核空間拷貝到用戶空間(應(yīng)用程序空間),這個過程中用戶進(jìn)程同樣是阻塞的,直到數(shù)據(jù)拷貝完成才恢復(fù)。

所以,阻塞IO在兩個階段都是阻塞的!!

非阻塞IO

image

非阻塞IO和阻塞IO相似,區(qū)別在于第一階段,在等待數(shù)據(jù)準(zhǔn)備就緒的過程中,用戶進(jìn)程不會阻塞,而是在數(shù)據(jù)沒有準(zhǔn)備就緒的時候得到一個error返回,這是用戶進(jìn)程就知道數(shù)據(jù)還沒有準(zhǔn)備好,然后就可以繼續(xù)發(fā)起recvfrom操作直到數(shù)據(jù)準(zhǔn)備就緒

在第二階段,數(shù)據(jù)從內(nèi)核空間向用戶空間拷貝時,非阻塞IO用戶進(jìn)程同樣是阻塞的

IO多路復(fù)用

img

IO多路復(fù)用實際上是通過select/epoll等函數(shù)輪詢多個socket,當(dāng)用戶進(jìn)程調(diào)用了select函數(shù),整個用戶進(jìn)程就會被阻塞,直到收到數(shù)據(jù)準(zhǔn)備就緒的返回

后續(xù)的操作和非阻塞IO是類似的,由于在recvfrom系統(tǒng)調(diào)用之前,需要的數(shù)據(jù)就已經(jīng)準(zhǔn)備就緒了,所以第一個階段是非阻塞的;第二個階段同樣還是阻塞

所以IO多路復(fù)用整個過程中,用戶進(jìn)程都是阻塞的~


異步IO

img

異步IO實際上是用戶進(jìn)程發(fā)起read操作之后,就會立刻收到一個返回,所以用戶進(jìn)程就可以去完成其他的工作,而不需要阻塞;直到數(shù)據(jù)準(zhǔn)備就緒并且完成了從內(nèi)核空間向用戶空間拷貝的工作,這時用戶進(jìn)程會收到一個通知,告訴他read操作已完成


整個過程中用戶進(jìn)程不會被阻塞


總結(jié)

所以實際上阻塞IO和非阻塞IO都是同步IO,用到了特殊的異步函數(shù)才是異步IO


如果能從IO過程的兩個階段來看待這些問題,就不會被這些概念和一些例子繞暈了


關(guān)注【后端技術(shù)小黑板】,發(fā)送“面試套路”,更多的面試套路拆解和知識分享等你喲~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容