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

個人認爲:

阻塞:某個任務請求資源Ai,如果不可以立即獲得資源,進程就會卡在這裏。比如服務端阻塞listen,沒有客戶端連接進來,進程就卡在這裏;或者是一直在讀緩衝區,緩衝區沒有數據,讀進程就卡在這裏;
非阻塞:某個任務請求資源Ai,如果不可立即獲得資源,就放棄本次請求,並返回。比如服務端非阻塞listen,如果沒有客戶端連接進來,就返回;或者是在讀緩衝區,管緩衝區沒有數據就返回。

同步:進程沒辦法知道數據什麼時候才真正讀取完畢了,所以需要每隔一段時間就去輪詢一下,重新調用 read,看是不是數據真的已經讀取完畢了;
異步:調用在發出之後,這個調用就直接返回了,立刻就可以開始去做其它的事,所以沒有返回結果;等read讀取完畢就會通知進程過來處理數據。另一方面,從kernel的角度,當它收到一個異步read之後,首先它會立刻返回,所以不會對用戶進程產生任何阻塞。然後,kernel會等待數據準備完成,然後將數據拷貝到用戶內存,當這一切都完成之後,kernel會給用戶進程發送一個signal,告訴它read操作完成了。

轉自他人:

1.同步 / 異步
描述的是執行IO操作的主體是誰,同步是由用戶進程自己去執行最終的IO操作。異步是用戶進程自己不關係實際IO操作的過程,只需要由內核在IO完成後通知它既可,由內核進程來執行最終的IO操作

2.阻塞與非阻塞
1).阻塞IO: 資源不可用時,IO請求一直阻塞,直到反饋結果(有數據或超時)。

2).非阻塞IO:資源不可用時,IO請求離開返回,返回數據標識資源不可用
阻塞 / 非阻塞描述的是函數,指訪問某個函數時是否會阻塞線程(block,線程進入阻塞狀態)。
非阻塞同步IO指的是用戶調用讀寫方法是不阻塞的,立刻返回的,而且需要用戶線程來檢查IO狀態。需要注意的是,如果發現有可以操作的IO,那麼實際用戶進程還是會阻塞等待內核複製數據到用戶進程,它與同步阻塞IO的區別是後者全程等待。
非阻塞異步IO指的是用戶調用讀寫方法是不阻塞的,立刻返回,而且用戶不需要關注讀寫,只需要提供回調操作,內核線程在完成讀寫後回調用戶提供的callback

3.這兩個概念的不同造成了編程模型的不同。

非阻塞同步IO由於讀寫方法非阻塞,並且需要用戶自己來進行讀寫,所以每次調用讀寫方法實際讀寫的字節數是不確定的,所以需要一個Buffer來保存每次讀寫的字節狀態。更重要的是用戶不知道什麼時候完成了讀寫,一般需要用while循環判斷Buffer的狀態來跟蹤讀寫。

非阻塞異步IO由於是內核線程進行讀寫,並且在IO完成後會回調用戶提供的callback,編程模型就比較簡單,用戶只需要調用讀寫,提供回調就可以了,比如 read(filename, callback)

4.Linux下的五種I/O模型
1)阻塞I/O(blocking I/O)
2)非阻塞I/O (nonblocking I/O)
3) I/O複用(select 和poll) (I/O multiplexing)
4)信號驅動I/O (signal driven I/O (SIGIO))
5)異步I/O (asynchronous I/O (the POSIX aio_functions))

前四種都是同步,只有最後一種纔是異步IO。

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