五種I O模型的比較

2022-07-18 02:21:12 字數 665 閱讀 3983

我會從以下幾個方面來進行比較

*有無每執行緒64連線數限制

如果在選擇模型中沒有重新定義fd_setsize巨集,則每個fd_set預設可以裝下64個socket。同樣的,受maximum_wait_objects巨集的影響,

事件選擇、用事件通知實現的重疊i/o都有每執行緒最大64連線數限制。如果連線數成千上萬,則必須對客戶端套接字進行分組,這樣,勢必增

加程式的複雜度。

相反,非同步選擇、用完成例程實現的重疊i/o和完成埠不受此限制。

*執行緒數

除了非同步選擇以外,其他模型至少需要2個執行緒。乙個主線程和乙個輔助線程。同樣的,如果連線數大於64,則選擇模型、事件選擇和用

事件通知實現的重疊i/o的執行緒數還要增加。

*實現的複雜度

我的個人看法是,在實現難度上,非同步選擇《選擇《用完成例程實現的重疊i/o《事件選擇《完成埠《用事件通知實現的重疊i/o

*效能由於選擇模型中每次都要重設讀集,在select函式返回後還要針對所有套接字進行逐一測試,我的感覺是效率比較差;完成埠和用完

成例程實現的重疊i/o基本上不涉及全域性資料,效率應該是最高的,而且在多處理器情形下完成埠還要高一些;事件選擇和用事件通知實現

的重疊i/o在實現機制上都是採用wsawaitformultipleevents,感覺效率差不多;至於非同步選擇,不好比較。

五種IO模型

再講io模型之前,給大家舉乙個釣魚的例子。張三去釣魚,他釣魚的時候一動不動,一直看著魚竿,看有沒有動,無論是誰叫他,他都不動,只有等魚梢動了 魚上鉤了 他才會動 李四去釣魚,他沒有像張三那樣瓷楞著,只是時不時的輪詢檢查魚竿有沒有動。一直在動。王五也來釣魚,他就比較聰明了,在魚竿上掛個鈴鐺,只要鈴鐺響...

五種IO模型

阻塞io 在核心將資料準備好之前,系統呼叫會一直等待,所有的套接字都是預設阻塞方式 非阻塞io 如果核心還沒有將資料準備好,系統呼叫會直接返回,並返回錯誤碼 非阻塞io往往需要以迴圈的方式反覆讀寫檔案描述符,這個過程稱為輪詢,對cpu的浪費較大,一般只在特定的場景下使用 訊號驅動io 核心將資料準備...

五種IO模型

1.五種io分為阻塞i o 非阻塞i o 訊號驅動io 多路復用i o select 和 poll 非同步i o 前四個被稱為同步io。1.1乙個輸入操作一般有兩個不同的階段 2.1阻塞io 程序呼叫recvfrom,從使用者態轉到核心態,直到資料準備好且拷貝到應用程式緩衝區或者出錯 最常見的錯誤是...