非同步IO的應用

2021-09-19 11:02:44 字數 1238 閱讀 3072

迴圈:早期系統使用簡單的迴圈選擇解決方案,即迴圈遍歷開啟的網路連線的列表,判斷是否有要讀取的資料。這種方法既緩慢(尤其是隨著連線數量增加越來越慢),又低效(因為在處理當前連線時其他連線可能正在傳送請求並等待響應)。在系統迴圈遍歷每個連線時,其他連線不得不等待。如果有 100 個連線,其中只有乙個有資料,那麼仍然必須處理其他 99 個連線,才能輪到真正需要處理的連線。

socket io復用:這是對迴圈方法的改進,它用乙個結構儲存要監視的每個連線的陣列,當在socket發現資料時會select/epoll呼叫會返回到使用者空間,然後可以繼續後續處理。

非同步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。這種實現有不少缺點,畢竟有不少執行緒開銷,還在改進中。

what is the status of posix asynchronous i/o (aio)

使用 libevent 和 libev 提高網路應用效能

aio - posix asynchronous i/o overview

difference between posix aio and libaio on linux

同步IO和非同步IO

同步io和非同步io 簡單的說 同步在程式設計裡,一般是指某個io操作執行完後,才可以執行後面的操作。非同步則是,將某個操作給系統,主線程去忙別的事情,等核心完成操作後通知主線程非同步操作已經完成。i windows同步i o與非同步i o 執行後的效果如下 winxp sp2 vc6.0 4 心得...

同步IO和非同步IO

同步io和非同步io 有兩種型別的檔案io同步 同步檔案io和非同步檔案io。非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而 非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請...

同步IO與非同步IO

非同步檔案io也就是重疊io。在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行。而非同步檔案io方式中,執行緒傳送乙個io請求到核心,然後繼續處理其他的事情,核心完成io請求後,將會通知執行緒io操作完成了。同步io在同一時刻只允許乙個io操作,也就是...