一個IO操作其實分成了兩個步驟:發起IO請求和實際的IO操作。阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞IO,如果不阻塞,那麼就是非阻塞IO。 同步IO和非同步IO的區別就在於第二個步驟是否阻塞:如果實際的IO讀寫阻塞請求程序,那麼就是同步IO,因此阻塞IO、非阻塞IO、IO複用、訊號驅動IO都是同步IO;如果不阻塞,而是作業系統幫你做完IO操作再將結果返回給你,那麼就是非同步IO。同步阻塞I/O: 當程序呼叫某些設計I/O操作的系統呼叫或庫函式時,比如accept()、send()、recv()等,程序便暫停下來,等待I/O操作完成後再繼續執行。同步非阻塞I/O:(輪詢)不會等待資料就緒,而是結合反覆輪詢來嘗試資料是否就緒。與同步阻塞I/O相比,同步非阻塞I/O好處是在一個程序中可以同時處理多個I/O操作,而不是阻塞在一個I/O操作上多路I/O就緒通知:(I/O複用)允許程序透過一種方法來同時監聽所有檔案描述符,並可以快速獲得所有就緒的檔案描述符,然後只針對這些檔案描述符進行資料訪問。我們常用的select、poll、epoll等函式使用了I/O複用模型。與同步非阻塞I/O相比,I/O複用模型的優勢在於可以同時等待多個(而不只是一個)套接字描述符就緒訊號驅動式I/O: 需要開啟套接字的訊號驅動I/O功能,並透過sigaction系統呼叫安裝一個訊號處理函式。sigaction函式立即返回,我們的程序繼續工作,即程序沒有被阻塞。當資料報準備好時,核心會為該程序產生一個SIGIO訊號,這樣我們可以在訊號處理函式中呼叫recvfrom讀取資料報,也可以在主迴圈中讀取資料報。無論如何處理SIGIO訊號,這種模型的優勢在於等待資料報到達期間不被阻塞。非同步I/O(AIO): 啟動某個操作,並讓核心在整個操作(包括等待資料和將資料從核心複製到使用者空間)完成後通知應用程序。與訊號驅動式I/O的區別在於:訊號驅動式I/O在資料報準備好時就通知應用程序,應用程序還需要將資料報從核心複製到使用者程序緩衝區;而非同步I/O模型則是整個操作完成才通知應用程序,應用程序在整個操作期間都不會被阻塞。
更多討論見:
怎樣理解阻塞非阻塞與同步非同步的區別?
一個IO操作其實分成了兩個步驟:發起IO請求和實際的IO操作。阻塞IO和非阻塞IO的區別在於第一步,發起IO請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞IO,如果不阻塞,那麼就是非阻塞IO。 同步IO和非同步IO的區別就在於第二個步驟是否阻塞:如果實際的IO讀寫阻塞請求程序,那麼就是同步IO,因此阻塞IO、非阻塞IO、IO複用、訊號驅動IO都是同步IO;如果不阻塞,而是作業系統幫你做完IO操作再將結果返回給你,那麼就是非同步IO。同步阻塞I/O: 當程序呼叫某些設計I/O操作的系統呼叫或庫函式時,比如accept()、send()、recv()等,程序便暫停下來,等待I/O操作完成後再繼續執行。同步非阻塞I/O:(輪詢)不會等待資料就緒,而是結合反覆輪詢來嘗試資料是否就緒。與同步阻塞I/O相比,同步非阻塞I/O好處是在一個程序中可以同時處理多個I/O操作,而不是阻塞在一個I/O操作上多路I/O就緒通知:(I/O複用)允許程序透過一種方法來同時監聽所有檔案描述符,並可以快速獲得所有就緒的檔案描述符,然後只針對這些檔案描述符進行資料訪問。我們常用的select、poll、epoll等函式使用了I/O複用模型。與同步非阻塞I/O相比,I/O複用模型的優勢在於可以同時等待多個(而不只是一個)套接字描述符就緒訊號驅動式I/O: 需要開啟套接字的訊號驅動I/O功能,並透過sigaction系統呼叫安裝一個訊號處理函式。sigaction函式立即返回,我們的程序繼續工作,即程序沒有被阻塞。當資料報準備好時,核心會為該程序產生一個SIGIO訊號,這樣我們可以在訊號處理函式中呼叫recvfrom讀取資料報,也可以在主迴圈中讀取資料報。無論如何處理SIGIO訊號,這種模型的優勢在於等待資料報到達期間不被阻塞。非同步I/O(AIO): 啟動某個操作,並讓核心在整個操作(包括等待資料和將資料從核心複製到使用者空間)完成後通知應用程序。與訊號驅動式I/O的區別在於:訊號驅動式I/O在資料報準備好時就通知應用程序,應用程序還需要將資料報從核心複製到使用者程序緩衝區;而非同步I/O模型則是整個操作完成才通知應用程序,應用程序在整個操作期間都不會被阻塞。
更多討論見:
怎樣理解阻塞非阻塞與同步非同步的區別?