當前位置:
首頁 > 知識 > 阻塞IO、非阻塞IO和非同步IO

阻塞IO、非阻塞IO和非同步IO

文章目錄

IO操作構成

阻塞IO

非阻塞IO

阻塞IO與非阻塞IO區別

非同步IO

非阻塞IO與非同步IO區別

IO操作構成

步驟一 : 準備數據,將數據從存儲介質(例如硬碟、Socket等)載入到內核緩存。

步驟二 : 拷貝數據,將數據從內核緩存拷貝到用戶內存。

阻塞IO

在Linux中,默認情況下所有的Socket都是阻塞IO。一個典型的阻塞讀IO操作如下圖所示:

當應用進程調用了recvfrom這個系統調用,操作系統內核就開始了IO的第一個階段 : 準備數據。

對於網路IO來說,很多情況下數據並不能一次性到達 (比如,還沒有收到一個完整的UDP包 ),此時操作系統內核需要等待完整的數據到來。

此時,應用進程整個進程會被阻塞。

當操作系統內核數據準備好了,它會將數據從內核緩存中拷貝到應用內存,應用進程才解除阻塞的狀態,重新運行。

所以,阻塞IO的特點就是在IO操作的兩個階段準備數據和拷貝數據都被阻塞了。

非阻塞IO

Linux下,可以通過設置Socket使其變為非阻塞IO。一個典型的非阻塞讀IO操作如下圖所示:

當應用進程recvfrom這個系統調用,如果操作系統內核中的數據還沒有準備好,那麼它並不會阻塞應用進程,而是立刻返回一個error。從應用進程角度講 ,它發起一個read操作後,並不需要阻塞,而是馬上就得到了一個結果。當用戶進程判斷結果為error時,它能夠判斷數據還沒有準備好,於是它可以再次發送read操作。

一旦操作系統內核中的數據準備完成,並且又再次收到了用戶進程的read操作,那麼它立刻將數據拷貝到了用戶內存,然後成功標識。

所以,在非阻塞式IO中,用戶進程需要不斷的輪詢操作系統內核數據是否準備好。

阻塞IO與非阻塞IO區別

阻塞IO : 應用進程在準備數據和拷貝數據兩個階段等待數據。

非阻塞IO : 應用進程在準備數據階段輪詢,在拷貝數據階段等待數據。

1

2

注 : 阻塞IO和非阻塞IO均為同步IO。

非同步IO

一個典型的非同步讀IO操作如下圖所示:

非同步IO的讀取操作(aio_read)會通知內核進行讀取操作並將數據拷貝至進程中,並通知內核進程整個操作全部完成後的回調函數。

讀取操作發出後會立刻返回,程序可以進行其它的操作,所有的讀取、拷貝工作都由內核完成。

完成以後,內核調用綁定的回調函數來處理數據。

非阻塞IO與非同步IO區別

非阻塞IO : 應用進程在準備數據階段輪詢,在拷貝數據階段等待數據。

非同步IO : 應用進程在準備數據和拷貝數據兩個階段均不等待,可以進行其他操作。

---------------------

作者:劉志熊

原文:https://blog.csdn.net/liuzhixiong_521/article/details/84670466

版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

阻塞IO、非阻塞IO和非同步IO

打開今日頭條,查看更多圖片

作者: 劉志熊

原文:https://blog.csdn.net/liuzhixiong_521/article/details/84670466

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

J2Cache 和普通緩存框架有何不同,它解決了什麼問題?
LeetCode中那些應該背下來的經典代碼

TAG:程序員小新人學習 |