循環:早期系統使用簡單的循環選擇解決方案,即循環遍歷打開的網絡鏈接的列表,判斷是否有要讀取的數據。這種方法既緩慢(尤爲是隨着鏈接數量增長愈來愈慢),又低效(由於在處理當前鏈接時其餘鏈接可能正在發送請求並等待響應)。在系統循環遍歷每一個鏈接時,其餘鏈接不得不等待。若是有 100 個鏈接,其中只有一個有數據,那麼仍然必須處理其餘 99 個鏈接,才能輪到真正須要處理的鏈接。html
socket IO複用:這是對循環方法的改進,它用一個結構保存要監視的每一個鏈接的數組,當在socket發現數據時會select/epoll調用會返回到用戶空間,而後能夠繼續後續處理。linux
異步socket IO:利用現代內核中的多線程支持監聽和處理鏈接,爲每一個鏈接啓動一個新線程。這把責任直接交給操做系統,可是會在 RAM 和 CPU 方面增長至關大的開銷,由於每一個線程都須要本身的執行空間。另外,若是每一個線程都忙於處理網絡鏈接,線程之間的上下文切換會很頻繁。這裏的異步實際上是不是真正的異步,模擬異步IO,將IO的操做交給專門的thread來處理而異。編程
實踐中socket IO複用已經很好地解決了高併發的問題,那麼異步IO到底應用在哪裏呢?一番google後發現目前你們仍是公認使用IO複用解決網絡編程的高併發,異步IO能夠用於沒有緩存的disk IO。詳細看一下這個帖子What is the status of POSIX asynchronous I/O (AIO)
帶cache的disk IO性能不是大問題了,kernel經過cache能夠高效的解決disk 讀寫問題。剩下direct IO能夠經過異步IO解決。linux上異步IO常見有兩種實現,一種是kernel native AIO,另外是用戶空間的POSIX AIO。
kernel native AIO: Kernel的原生態異步IO實現,詳細能夠參閱aio - POSIX asynchronous I/O overview
glibc AIO(POSIX AIO): linux用戶空間異步IO的實現,其實它不是真正的異步IO,是經過啓動必定數量的blocking IO線程來模擬異步IO。這種實現有很多缺點,畢竟有很多線程開銷,還在改進中。數組
linux異步IO編程實例分析,這篇文章給了一個很好的異步IO的例子,可作參考。緩存
What is the status of POSIX asynchronous I/O (AIO)
Boost application performance using asynchronous I/O
linux異步IO編程實例分析
使用 libevent 和 libev 提升網絡應用性能
aio - POSIX asynchronous I/O overview
Difference between POSIX AIO and libaio on Linux網絡