看乙個同學面經的時候看到這個問題,在unp(因此介紹的背景是socket程式設計)上找到了相應的內容介紹:
unix下的io模型有五種:
socket預設是blocking的,這種情況下,發出乙個系統呼叫,如果當前沒有資料可讀(如果呼叫read),那麼該程序會block直到有資料可讀,然後完成讀取,返回
如果是nonblocking,此時如果沒有資料可讀,也會馬上返回,並設定errno為ewouldblock,所以如圖中所示,類似人為的執行輪詢(polling),當有資料可讀了,就完成資料的讀取,並且返回
一般來說,這種手動的輪詢很浪費資源
特點在於這個讓requesting process 阻塞的系統呼叫本身並不執行讀取,而是判斷觀察的檔案描述符集合裡是否有檔案描述符ready,如果沒有,就block(阻塞多久可配置),當有任乙個ready,就返回,此時requesting process再去執行讀資料的系統呼叫,因為已經知道現在可讀,所以此時也就不會再block
首先註冊乙個sigio handler,當有資料到達後(ready),會發出sigio的訊號,被requesting process捕捉後,就可以讀資料了,此時也不用擔心讀時會block
5.asynchronous io
非同步io,此時使用特殊的系統呼叫,即使當前沒有可讀的資料,也能立刻返回,我們可以配置讀的操作完成後,發出乙個訊號通知requesting『 process,從而在signal handler裡對接收成功的資料做下一步的處理
五種io模型的比較:
posix對同步和非同步的定義:
同步:乙個同步的io操作,讓requesting process 阻塞直到io完成
非同步:乙個非同步的io操作,不會造成requesting process 阻塞
根據這個定義,可知前四種是同步的,第五種是非同步的
I O模型 阻塞 非阻塞 I O復用 同步 非同步
第一手教育 2016 10 14 11 25 i o模型不論在實際使用還是準備筆試面試中都是重要的內容,參考unix網路程式設計進行總結如下。尤其注意紅色標註處 1.明確i o考察的物件和流程 參考unix網路程式設計,乙個輸入操作通常包括兩個不同的階段 1 等待資料準備好 2 從核心向程序複製資料...
網路IO模型(同步非同步,阻塞非阻塞)
摘錄自 網路應用需要處理的無非兩大類問題 網路i o,資料計算 網路io的模型大致有如下幾種 同步模型 阻塞非阻塞 多路復用 訊號驅動式 非同步io 網路io的本質是socket的讀取,socket在linux系統被抽象為流,io可以理解為對流的操作。這個操作分為2個階段 1 等待流資料準備 2 從...
談談 IO模型 同步 非同步 阻塞 非阻塞
linux os中,有幾種常見的io模型 程式進行io讀 寫操作通常包括幾個階段 資料準備 資料更新 阻塞式io 程式發起read io請求,核心接受到系統呼叫並開始對磁碟進行讀取資料到核心緩衝區,這一過程程式所在的執行緒是阻塞狀態的。資料準備好,核心需要將資料複製到使用者程序空間,複製過程也是阻塞...