本文帶你鳥瞰I/O模型全貌,希望可以讓你對I/O模型有一個直觀的認識
什么是I/O?I/O的過程?同步阻塞 I/O同步非阻塞 I/OI/O多路復用異步I/O
什么是I/O?
I/O就是計算機內存和外部設備之間拷貝數據的過程。
那么I/O模型主要解決的問題是什么呢?程序通過CPU,請求外部設備上的數據。而數據拷貝到內存里需要一定的時間,在這個時間里,程序是主動讓出CPU時間?還是讓CPU不斷的去查數據是否是到了?
I/O模型就是用來解決這個決策問題。
I/O的過程?
首先我們要明白。I/O通訊涉及到兩個非常重要的對象。
1.程序執行時的用戶線程
2.操作系統內核
操作系統將進程的地址空間分為用戶空間和內核空間,用戶線程是沒有辦法從內核空間直接獲取數據,需要將數據從內核空間拷貝到用戶空間,再獲取用戶空間的數據。
所以任何I/O模型,網路數據的讀取都可以分為2部分。
1.用戶線程等待內核將網卡中的數據,拷貝到內核空間
2.內核將數據從內核空間拷貝到用戶空間。
各個I/O模型的區別就是實現這兩個步驟的方法不同
同步阻塞 I/O
用戶線程發起read請求后就阻塞了,讓出CPU,內核會等待網卡數據的到來,然后吧數據拷貝到內核空間,從內核空間拷貝到用戶空間,再喚醒用戶線程。

同步非阻塞 I/O
用戶線程不斷發起read請求,數據沒到內核空間時,每次都返回失敗,直到數據到了內核空間,此時再調用read會阻塞,等待內核將內核空間的數據拷貝到用戶空間,再喚醒用戶線程。

I/O多路復用
這里把用戶線程的讀取操作分為了2步,線程先發送select調用,問內核是否將數據准備好了,等數據准備好了,用戶線程再發起read調用,在等待數據從內核空間拷貝到用戶空間這段時間里,線程仍是阻塞的,一次select請求可以向內核查詢多個數據通道(channel)的狀態,所以才叫多路復用

異步I/O
用戶發起的read調用,會注冊一個回調函數,read立即返回,等到內核將數據准備好后,調用回調函數完成處理,整個過程中,用戶線程一直沒有被阻塞

最后,期待您的訂閱和點贊,專欄每周都會更新,希望可以和您一起進步,同時也期待您的批評與指正!
