1.IO的概念 IO簡單來講就是對輸入輸出設備的簡化表達形式 單片機中各種介面,進行數據流的傳輸 從磁碟中讀取數據至記憶體,又或者從記憶體中寫入磁碟 編程中的IO 此時的IO其應用程式的運行態,即進程 》IO調用 特別強調的是我們的應用程式其實並不存在實質的IO過程,真正的IO過程是操作系統的事情, 這 ...
1.IO的概念
- IO簡單來講就是對輸入輸出設備的簡化表達形式
- 單片機中各種介面,進行數據流的傳輸
- 從磁碟中讀取數據至記憶體,又或者從記憶體中寫入磁碟
- 編程中的IO
- 此時的IO其應用程式的運行態,即進程---》IO調用
- 特別強調的是我們的應用程式其實並不存在實質的IO過程,真正的IO過程是操作系統的事情,
- 這裡把應用程式的IO操作分為兩種動作:IO調用和IO執行。
- 因此所有的IO操作算作IO調用,之後由內核進行執行
2.Linux中的5種IO模型
-
5種IO模型
-
同步IO:阻塞IO模型、非阻塞IO模型、IO復用模型、信號驅動的IO模型
-
非同步IO
-
-
阻塞IO模型--bio---blockIO--》
- fd預設是阻塞的,網路編程中accept(),listen(),recv()等這些函數
- 阻塞IO不適合工程代碼,網路IO
- 一旦阻塞,線程會被掛起
-
非阻塞IO模型
- 流程不變,繼續執行
- 比如recv()只會返回一個–1,然後接著執行
- 阻塞---要進行讀寫,沒有數據,線程會被掛起
註:阻塞和非阻塞的屬性,是屬於fd本身,預設為阻塞,可以通過
fcntl( fd,flag | O_NONBLOCK )進行非阻塞設置
-
IO復用模型 :IO多路復用
-
信號驅動的IO模型
- 註冊一個IO信號事件,在數據可操作時通過SIGIO信號通知線程
-
非同步IO
通過使用fdset(fd,cb),一旦檢測到數據調用callback,也不會被阻塞,但是也不會返回-1,因為會自動調用cb
-
reactor---反應堆模型
- reactor是對epoll進行的封裝,讓用戶只需要關註讀什麼和寫什麼和相應的回調函數即可
- 而不是關註epoll的使用
一些概念
- 阻塞和非阻塞---》針對於線程狀態,
- 一旦阻塞,線程被掛起,不能做其它事情)
- 非阻塞可以做其他事情:在等待的過程中可以做其它事情
- 同步和非同步---》線程的做事順序,非同步和同步是相對的
- 同步為一個線程必須做完一件之後,通知再做下一件
- 非同步為不必做完一件之後,再做下一件,可以一次性做多個,做完通知一下
- 同步和互斥--》兩者的角度不同
- 同步按照一定的順序執行,訪問者對資源的有序訪問。
- 互斥:同一個資源同一時間只有一個訪問者可以進行訪問,其他訪問者需要等前一個訪問者訪問結束才可以開始訪問該資源。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
- 總結:同步是一種更為複雜的互斥,而互斥是一種特殊的同步。
3.常用使用形式----》用途
- 阻塞IO模型:阻塞socket
- 進程阻塞掛起不消耗CPU資源,及時響應每個操作;
- 實現難度低、開發應用較容易;
- 適用併發量小的網路應用開發;
- 非阻塞IO模型:socket是非阻塞的方式,超時處理
- 進程輪詢(重覆)調用,消耗CPU的資源;
- 實現難度低、開發應用相對阻塞IO模式較難;
- 適用併發量較小、且不需要及時響應的網路應用開發;
- IO復用模型 :select、poll、epoll三種方案,nginx都可以選擇使用這三個方案
- 專一進程解決多個進程IO的阻塞問題,性能好;Reactor模式;
- 實現、開發應用難度較大;
- 適用高併發服務應用開發:一個進程(線程)響應多個請求
- 信號驅動的IO模型:信號機制不可控,不建議應用於服務層(業務層)
- 回調機制,實現、開發應用難度大;
- 非同步IO:高性能伺服器應用
- 不阻塞,數據一步到位;Proactor模式;
- 需要操作系統的底層支持,LINUX 2.5 版本內核首現,2.6 版本產品的內核標準特性;
- 實現、開發應用難度大;
- 非常適合高性能高併發應用;
4.拓展
-
在網路編程中,為什麼使用IO多路復用,而不是非同步IO?
1.非同步IO處於內核空間中,回調函數在用戶空間中,從系統空間回調到用戶空間
2.內核和用戶空間之間會觸發0x80中斷,系統調用過程,用戶空間經過80中斷進入系統空間代碼,比如open()
3.網路編程中的fd數量有NN多個,會有NN多個callback,因此會頻繁觸發80中斷
4.這會導致80中斷隊列崩潰
5.aio的缺陷,但是仍然好用,可以用在磁碟文件讀寫,即不需要大量IO使用,幾十個等
5.相關聯的,相對比的技術
6.參考資料
看一遍就理解:IO模型詳解 - 掘金 (juejin.cn)