前言:在之前的Redis面試套路拆解的文章[Redis面試套路拆解(一)]中有提到過IO模型,并且IO模型本身也是一個比較容易混淆的高頻面試考點,小黑板將在本篇文章幫你理清思路,區(qū)分各種IO模型~
其實網(wǎng)絡(luò)上已經(jīng)有很多博客講了這個問題,但是總是覺得看完之后還是迷迷糊糊的,感覺大家有點太執(zhí)著于把這個問題講的通俗易懂了,經(jīng)常會舉各種各樣的例子,比如燒水、去銀行辦理業(yè)務(wù)之類的,然而看完之后反倒會產(chǎn)生更多的疑問,因為可能舉得例子并不能完美的適用于同步異步、阻塞非阻塞的概念
所以我們今天就不舉例子了,小黑板想從專業(yè)概念的角度來幫助大家理解各種概念~
在討論問題之前,我們需要確定一下上下文,以免產(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)
用戶態(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
當(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
非阻塞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ù)用
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
異步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ā)送“面試套路”,更多的面試套路拆解和知識分享等你喲~