說到這裏,就得說說同步I/O和異步I/O的區別了。在有些時候,同步和異步、阻塞和非阻塞很容易被混用,其實它們徹底不是一回事,並且它們修飾的對象也不一樣。阻塞和非阻塞是指當進程訪問的數據若是還沒有就緒,進程是否須要等待,簡單說這至關於函數內部的實現區別,即未就緒時是直接返回仍是等待就緒;而同步和異步是指訪問數據的機制,同步通常指主動請求並等待I/O操做完畢的方式,當數據就緒後在讀寫的時候必須阻塞,異步則指主動請求數據後即可以繼續處理其餘任務,隨後等待I/O操做完畢的通知,這可使進程在數據讀寫時也不發生阻塞。
POSIX1003.1標準爲異步方式訪問文件定義了一套庫函數,這裏的異步I/O(AIO)實際上就是指當用戶態進程調用庫函數訪問文件時,進行必要的快速註冊,好比進入讀寫操做隊列,而後函數立刻返回,這時候真正的I/O傳輸尚未開始呢。
能夠看出,這種機制是真正意義上的異步I/O,並且是非阻塞的,它可使進程在發起I/O操做後繼續運行,讓CPU處理和I/O操做達到更好的重疊。
POSIX的標準庫中定義了AIO的一系列接口,它幾乎屏蔽了一切網絡通訊的細節,因此對使用者而言很是簡單。AIO沒有提供非阻塞的open()方法,因此進程仍然使用open()系統調用來打開文件,而後填充一些描述I/O請求的數據結構,接下來調用aio_read()或aio_write()來發起異步I/O操做,一旦請求進入操做隊列後,函數便返回,進程能夠在此後經過aio_error()來檢查正在運行的I/O操做的狀態。
然而對於AIO的實現,不一樣的平臺有不一樣的方法,它甚至能夠徹底由庫函數來實現而不須要內核的支持,好比經過多線程來模擬非阻塞的aio_read()調用。可是這樣一來,它的性能便大打折扣,變得毫無心義,因此實際上不少平臺都沒有實現它。
在Linux 2.6.16中,AIO的實現能夠在/usr/include/libaio.h中看到,它採用了一套沒有遵循POSIX AIO標準的接口,而且實現方式正是基於LinuxThreads內核級線程庫,截至目前,這個功能還在實現中,目前的Linux AIO只能用於經過O_DIRECT標誌打開的文件。網絡