Unix IO模型

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模型:


unix io模型.png

(1)阻塞式IO模型:


阻塞式io模型1.png

在這個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模型.png

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

(3)IO多路復(fù)用模型


io多路復(fù)用.png

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模型

信號驅(qū)動式io模型.png

首先我們允許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模型
異步io模型.png

用戶進(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

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

相關(guān)閱讀更多精彩內(nèi)容

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