阻塞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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
打開今日頭條,查看更多圖片作者: 劉志熊
原文:https://blog.csdn.net/liuzhixiong_521/article/details/84670466
※J2Cache 和普通緩存框架有何不同,它解決了什麼問題?
※LeetCode中那些應該背下來的經典代碼
TAG:程序員小新人學習 |