1.同步,異步,阻塞,非阻塞的概念:
一般來說,一個輸入操作包含兩個階段:
(1)等待數(shù)據(jù)準(zhǔn)備好
(2)將數(shù)據(jù)從內(nèi)核拷貝到用戶空間
同步:針對上述兩個過程,用戶進(jìn)程是否有阻塞,體現(xiàn)在消息通知機(jī)制上;
阻塞:進(jìn)程是否知道何時數(shù)據(jù)準(zhǔn)備好了,也就是第一個階段是否阻塞。
2.Unix五種IO模型:

(1)阻塞式IO模型:

在這個IO模型中,用戶進(jìn)程執(zhí)行一個系統(tǒng)調(diào)用(recvfrom),內(nèi)核準(zhǔn)備好數(shù)據(jù),并將數(shù)據(jù)從內(nèi)核復(fù)制到用戶空間,才會返回結(jié)果給用戶進(jìn)程,整個IO過程都是阻塞的,Java BIO就是這種實(shí)現(xiàn)方式。
(2)非阻塞式IO模型

非阻塞式IO也就是在等待數(shù)據(jù)的階段是可以做其他事情的,而應(yīng)用進(jìn)程通過反復(fù)調(diào)用recvfrom等待返回成功指示(輪詢),而第二步仍然是需要等待的。Java NIO是這種實(shí)現(xiàn)方式。
(3)IO多路復(fù)用模型

IO多路復(fù)用有三種方式:select,poll,epoll。為何叫多路復(fù)用,是因?yàn)樗麵/O多路復(fù)用可以同時監(jiān)聽多個fd,如此就減少了為每個需要監(jiān)聽的fd開啟線程的開銷。通過Java NIO實(shí)現(xiàn)的Reactor模式使用了這種編程模型。
select調(diào)用是內(nèi)核級別的,可以等待多個socket,能實(shí)現(xiàn)同時對多個IO端口進(jìn)行監(jiān)聽,當(dāng)其中任何一個socket的數(shù)據(jù)準(zhǔn)好了,就能返回進(jìn)行可讀,然后進(jìn)程再進(jìn)行recvform系統(tǒng)調(diào)用,將數(shù)據(jù)由內(nèi)核拷貝到用戶進(jìn)程,這個過程是阻塞的。
I/O復(fù)用模型會用到select、poll、epoll函數(shù),這幾個函數(shù)也會使進(jìn)程阻塞,但是和阻塞I/O所不同的的,這幾個函數(shù)可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數(shù)進(jìn)行檢測,直到有數(shù)據(jù)可讀或可寫時(不是等到socket數(shù)據(jù)全部到達(dá)再處理, 而是有了一部分?jǐn)?shù)據(jù)就會調(diào)用用戶進(jìn)程來處理),才真正調(diào)用I/O操作函數(shù)。
在IO multiplexing Model中,實(shí)際中,對于每一個socket,一般都設(shè)置成為non-blocking,但是,如上圖所示,整個用戶進(jìn)程其實(shí)是一直被阻塞的。在第一個階段,進(jìn)程是被select這個函數(shù)阻塞,而不是被socket IO給阻塞。
和同步阻塞IO的區(qū)別就是:
同步阻塞IO:幼兒園的一個老師負(fù)責(zé)一個小朋友的上廁所行為,老師一直等待小朋友想去廁所,直到小朋友想過去了,才帶著他去。
IO多路復(fù)用:由一個老師負(fù)責(zé)一批小朋友的上廁所行為,其中某個小朋友或者某一批小朋友想去廁所,都會帶著他們?nèi)ァK韵啾韧阶枞鸌O,減少了為每個需要監(jiān)聽的fd開啟線程的開銷。
(4)信號驅(qū)動式IO模型

首先我們允許Socket進(jìn)行信號驅(qū)動IO,并安裝一個信號處理函數(shù),進(jìn)程繼續(xù)運(yùn)行并不阻塞。當(dāng)數(shù)據(jù)準(zhǔn)備好時,進(jìn)程會收到一個SIGIO信號,可以在信號處理函數(shù)中調(diào)用I/O操作函數(shù)處理數(shù)據(jù)。
也就是說第一個階段,完全是非阻塞的,等數(shù)據(jù)到達(dá)內(nèi)核會給一個信號通知,第二個階段recvfrom還是阻塞過程。
(5)異步IO模型

用戶進(jìn)程調(diào)用aio_read之后,內(nèi)核會立即返回。當(dāng)內(nèi)核兩階段都準(zhǔn)備好后,會用信號通知給用戶進(jìn)程,然后用戶進(jìn)程可處理結(jié)果,所以兩個階段都是非阻塞的。通過Java AIO實(shí)現(xiàn)的Proactor模式即是異步I/O模型的實(shí)現(xiàn)。
參考資料:
https://mp.weixin.qq.com/s?__biz=MzI3MTQ1NzU2NA==&mid=2247484007&idx=1&sn=bcd034abc76bd83cc003233f37de68d9&chksm=eac0ce14ddb7470207bd8b8de22d1b5ab393d990b345d90eff54470648d6877f7d344773c657&scene=21#wechat_redirect
https://segmentfault.com/a/1190000003063859