理解同步/異步/阻塞/非阻塞IO區別


5種IO模型

1、阻塞式I/O模型

阻塞IO

阻塞I/O(blocking I/O)模型,進程調用recvfrom,其系統調用直到數據報到達且被拷貝到應用進程的緩沖區中或者發生錯誤才返回。進程從調用recvfrom開始到它返回的整段時間內是被阻塞的。

2、非阻塞式I/O模型

非阻塞IO

當一個應用進程像這樣對一個非阻塞描述字循環調用recvfrom時,我們稱之為輪詢(polling)。應用進程持續輪詢內核,以查看某個操作是否就緒。

3、I/O多路復用(事件驅動)模型

IO復用模型

4、信號驅動式I/O(SIGIO)

信號驅動IO

5、異步I/O模型

異步IO

6、I/O模型的比較:

模型的比較

根據上述5種IO模型,前4種模型-阻塞IO、非阻塞IO、IO復用、信號驅動IO都是同步I/O模型,因為其中真正的I/O操作(recvfrom)將阻塞進程,在內核數據copy到用戶空間時都是阻塞的。

7、同步IO、異步IO、阻塞IO、非阻塞IO

同步和異步的概念描述的是用戶線程與內核的交互方式:同步是指用戶線程發起IO請求后需要等待或者輪詢內核IO操作完成后才能繼續執行;而異步是指用戶線程發起IO請求后仍繼續執行(直接返回),當內核IO操作完成后會通知用戶線程,或者調用用戶線程注冊的回調函數。
阻塞和非阻塞的概念描述的是用戶線程調用內核IO操作的方式:阻塞是指IO操作需要徹底完成后才返回到用戶空間;而非阻塞是指IO操作被調用后立即返回給用戶一個狀態值,無需等到IO操作徹底完成。

一個IO操作可以分為兩個步驟:發起IO請求和實際的IO操作

阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那么就是傳統的阻塞IO,如果不阻塞,那么就是非阻塞IO。

同步IO和異步IO的區別就在於第二個步驟是否阻塞,如果實際的IO讀寫阻塞請求進程(IO操作完成后才能返回),那么就是同步IO,因此阻塞IO、非阻塞IO、IO復用、信號驅動IO都是同步IO,如果不阻塞,而是操作系統做完IO兩個階段的操作再將結果返回給用戶線程,那么就是異步IO。

8、IO多路復用

IO多路復用,就是通過一種機制,一個進程可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應的讀寫操作。

從流程上來看,使用select函數進行IO請求和同步阻塞模型沒有太大的區別,甚至還多了添加監視socket,以及調用select函數的額外操作,效率更差。但是,使用select以后最大的優勢是用戶可以在一個線程內同時處理多個socket的IO請求。用戶可以注冊多個socket,然后不斷地調用select讀取被激活的socket,即可達到在同一個線程內同時處理多個IO請求的目的。而在同步阻塞模型中,必須通過多線程的方式才能達到這個目的。

IO多路復用方式允許單線程內處理多個IO請求,但是每個IO請求的過程還是阻塞的(在select函數上阻塞),平均時間甚至比同步阻塞IO模型還要長。如果用戶線程只注冊自己感興趣的socket或者IO請求,然后去做自己的事情(在第一個IO請求階段異步),等到數據到來時再進行處理,則可以提高CPU的利用率。
由於select函數是阻塞的,因此多路IO復用模型也被稱為異步阻塞IO模型。注意,這里的所說的阻塞是指select函數執行時線程被阻塞,而不是指socket。一般在使用IO多路復用模型時,socket都是設置為NONBLOCK的,不過這並不會產生影響,因為用戶發起IO請求時,數據已經到達了,用戶線程一定不會被阻塞。
IO多路復用是最常使用的IO模型,但是其異步程度還不夠“徹底”,因為它使用了會阻塞線程的select系統調用。因此IO多路復用只能稱為異步阻塞IO,而非真正的異步IO。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM