常見IO模型

阻塞和非阻塞:

阻塞和非阻塞指的是執行一個操作是等操作結束再返回,還是馬上返回。
比如餐館的服務員爲用戶點菜,當有用戶點完菜後,服務員將菜單給後臺廚師,此時有兩種方式:
阻塞:第一種:就在出菜窗口等待,直到廚師炒完菜後將菜送到窗口,然後服務員再將菜送到用戶手中;
非阻塞:第二種:等一會再到窗口來問廚師,某個菜好了沒?如果沒有先處理其他事情,等會再去問一次;

同步和異步:

同步:還拿前面點菜爲例,服務員直接跟廚師打交道,菜出來沒出來,服務員直接指導,但只有當廚師將菜送到服務員手上,這個過程纔算正常完成,這就是同步的事件
異步:同樣是點菜,有些餐館有專門的傳菜人員,當廚師炒好菜後,傳菜員將菜送到傳菜窗口,並通知服務員,這就變成異步的了。

其實異步還可以分爲兩種:帶通知的和不帶通知的。前面說的那種屬於帶通知的。有些傳菜員幹活可能主動性不是很夠,不會主動通知你,你就需要時不時的去關注一下狀態。這種就是不帶通知的異步。

非阻塞I/O ,I/O複用,信號驅動式I/O其實都是非阻塞的,當然是針對“請求”這個階段。非阻塞式是主動查詢外設狀態。I/O複用裏的select,poll也是主動查詢,不同的是select和poll可以同時查詢多個fd(文件句柄)的狀態,另外select有fd個數的限制。epoll是基於回調函數的。信號驅動式I/O則是基於信號消息的。這兩個應該可以歸到“被動接收消息”那一類中。最後就是偉大的AIO的出現,內核把什麼事都幹了,對上層應用實現了全異步,性能最好,當然複雜度也最高。
阻塞I/O:所有過程全阻塞
非阻塞I/O:如果沒有數據buffer,則立即返回EWOULDBLOCK
I/O複用(select和poll):在wait和copy階段分別阻塞
信號驅動I/O(SIGIO):在wait階段不阻塞,但copy階段阻塞(信號驅動I/O,即通知)
異步I/O(aio):完全無阻塞方式,當I/O完成是提供信號

非阻塞型IO是忙等待

一個進程處理多個請求,因爲第一過程被徹底解放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章