Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
目錄
- IO模型
- 阻塞與非阻塞
- 同步與異步
- 阻塞IO
- 非阻塞IO
- 信號驅動IO
- 多路復用IO
- 異步IO
IO模型
根據各自的特性不同,IO模型被分為阻塞IO、非阻塞IO、信號驅動IO、異步IO、多路復用IO五類。
最主要的兩個區別就是阻塞與非阻塞,同步與異步。
阻塞與非阻塞
阻塞與非阻塞最主要的區別就是程序在等待調用結果時的狀態。
阻塞:為了完成一個功能發起調用,如果不具備完成功能的條件,則調用會一直等待
非阻塞:為了完成一個功能發起調用,如果不具備完成功能的條件,則立即報錯返回
同步與異步
同步與異步最主要的區別就是功能完成的流程是否是順序化的,且完成的是自身還是系統。
同步:功能完成的流程是順序化的,并且功能由自身完成。
異步:功能完成的流程是不確定的,并且功能由系統完成。
阻塞IO
發起IO調用,如果不具備IO條件,則一直等待直到條件就緒。
優點:流程以及代碼實現都非常簡單,任務順序操作。
缺點:任務處理效率較低,無法充分利用資源。
非阻塞IO
發起一個IO調用,如果不具備IO條件,則立即報錯返回,繼續執行其他命令。通過一個循環來不斷發起IO請求,直到條件就緒。
優點:與阻塞IO相比較來說,利用了等待的時間去做了其他的事情,對資源的利用更加充分。
缺點:與阻塞IO對比,IO調用需要循環發起,流程更加復雜。并且如果IO條件就緒了,也要等待上一輪循環結束后進入當前循環,才能進行處理,這就導致了IO不夠實時。
非阻塞IO可以通過fcntl函數設置描述符狀態來實現
例如:
信號驅動IO
自定義一個IO就緒的信號,當IO就緒時就發出這個信號。在沒有收到信號時,可以繼續處理其他事情,一旦收到信號,就會中斷當前操作,來優先處理IO事件。
優點:相較于非阻塞IO,因為信號到來后就直接強行中斷進行處理,更加實時。并且在沒收到信號的時候可以執行其他工作,資源利用更加充分。
缺點:因為需要自定義信號,又要有主控流程也要有信號處理流程,并且還需要考慮信號是否可靠導致的事件丟失情況,流程會更加的復雜。
多路復用IO
用于對大量的IO事件進行監控,能夠讓用戶只針對就緒了指定事件(可讀、可寫、異常) 的IO進行IO操作。只針對就緒的描述符進行操作,避免了阻塞,并且提高了效率。
在Linux下,操作系統提供了三種模型:select模型、poll模型、epoll模型。這三種模型的具體使用以及細節會放到下一篇博客中
根據不同的模型具體的優缺點也不一樣。
異步IO
IO處理的順序不確定,整個IO的過程(等待 + 數據拷貝)由操作系統來完成而并非用戶。
流程:
優點:對資源的利用最為充分, 以最高的效率進行任務的處理
缺點:資源消耗較高, 流程最為復雜
上面的五種IO模型,從前往后處理的效率逐漸增加,對資源的利用也增加充分,但是流程也越來越復雜。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 面向对象(三)异常 :异常概念、
- 下一篇: 趣谈设计模式 | 单例模式(Single