淺析五種IO模型
1 理解IO
IO是資料的輸入輸出,在網路中其實就是對於socket的讀取和傳送。在一次IO過程中,資料首先是傳送到對端的接受緩衝區裡,然後作業系統在從緩衝區中拿走資料。但是並不是我們呼叫recv介面,作業系統就可以直接從緩衝區裡面拿資料的,而是需要緩衝區裡面有資料才可以,所以這就需要我們等待資料就緒。
IO整個的過程歸納起來,分為兩步:1 等待資料就緒, 2 資料搬遷。
等待資料就緒中其實有很多種等待的方式,這些等待方式就是IO模型。
2 同步IO和非同步IO
簡單來說,同步IO就是自己等(自己發起,自己進行資料搬遷),非同步IO就是別人幫你來等(自己發起,別人幫忙進行資料搬遷)。
【注】這裡的同步和非同步和執行緒中的同步、非同步不是一個概念(執行緒中的同步和互斥是為了防止資料的二義性而做的保護措施)!!!
3 五種IO模型
(1)阻塞IO
阻塞IO:在資料準備就緒之前什麼都不做(相當於被掛起),直至等待資料就緒。
圖示:
對於程式呼叫recv介面這個過程是:
a. 應用程式呼叫recv介面;
b. 作業系統沒有準備好資料,應用程式進行等待;
c. 資料準備就緒,應用程式進行資料拷貝,返回。
阻塞IO的優點:簡單,一般預設情況下套接字都是阻塞式的
資料能夠及時返回,不延遲
缺點:效能較差
(2)非阻塞IO
非阻塞IO:若資料沒有就緒,直接返回。需要以輪詢的方式來檢測資料有沒有就緒。
圖示:
對於應用程式呼叫recv介面,這個過程是:
a. 應用程式呼叫recv介面;
b. 作業系統沒有準備好資料,應用程式直接返回;
c. 過一段時間再去檢測資料是否準備就緒,若還沒有再返回;
d. 直至檢測時資料已經準備就緒,應用程式進行資料拷貝,返回。
非阻塞IO的優點:可以在等待期間做別的事情
缺點:需要以輪訓的方式進行等待,很麻煩
由於是一段時間檢測一次,所以在資料就緒時不能立刻進行資料拷貝
(3)訊號驅動
訊號驅動:在資料就緒的時候,作業系統傳送SIGIO的訊號告訴應用程式資料準備就緒。
圖示:
對於應用程式呼叫recv介面,這個過程是:
a. 應用程式建立SIGIO訊號處理程式;
b. 作業系統等待資料就緒時,遞交SIGIO訊號;
c. 應用程式呼叫recv介面;
d. 完成資料拷貝,返回。
訊號驅動優點:在等待資料就緒期間可以做別的事情
缺點:需要建立維護訊號處理程式
(4)多路轉接
多路轉接:在等待資料就緒的過程中,不再一次等待一個檔案描述符,而是一次等待多個檔案描述符,其中任何一個就緒都可以進行資料搬遷了。
圖示:
對於應用程式呼叫recv介面,這個過程是:
a. 應用程式呼叫select/poll/epoll介面;
b. 作業系統等待資料就緒,返回;
c. 應用程式呼叫recv介面;
d. 完成資料拷貝,返回。
多路轉接的優點:一次可以等待多個檔案描述符,縮短了等待時間,使IO更加高效
缺點:為了實現多路轉接,需要消耗部分資源
(5)非同步IO
非同步IO:在作業系統完成資料搬遷之後通知應用程式,應用程式本身不參加IO的相關細節。
圖示:
在網路中整個過程是:
a. 應用程式呼叫介面;
b. 作業系統等待資料,資料準備就緒;
c. 作業系統完成資料拷貝;
d. 作業系統嚮應用程式遞交相關訊號,告知已完成資料拷貝。
非同步IO優點:應用程式不需要參與IO的整個過程,都由核心完成
缺點:非同步IO的簡單只是對於API的使用者而言,但是還有很多系統不支援非同步IO
(最初,非同步IO是為了資料庫而設計的,因此非同步IO的讀寫不會被快取,無法利用作業系統的快取機制)(參考這裡:https://www.jianshu.com/p/486b0965c296)