1. 程式人生 > >圖解I/O模型

圖解I/O模型

  本文帶你鳥瞰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立即返回,等到核心將資料準備好後,呼叫回撥函式完成處理,整個過程中,使用者執行緒一直沒有被阻塞

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