非同步IO網路伺服器設計 一 IO模型

2021-05-31 23:29:41 字數 860 閱讀 4517

說到非同步io網路伺服器,全國人民都知道:「windows下用iocp,linux下用epoll」。無數的高手寫過文章來講iocp和epoll相關的文章。本人分別使用epoll和iocp開發過網路庫,也使用過boost.asio,試歸納如下:

epoll:

1.通過epoll_ctl向非同步io註冊註冊(亦可修改、刪除)事件與相應的事件處理方法。

2.在io執行緒中通過epoll_wait等待非同步io事件就緒,根據就緒的io事件型別進行相應的accept、recv、send操作。

3.處理完畢後,重新註冊事件並開始新一輪等待。

iocp:

1.在io執行緒中通過gqcs(getqueuedcompletionstatus)等待在完成佇列上。

2.無需關心io是否就緒,直接通過wsaaccept、wsasend、wsarecv等向非同步io投遞接受連線、讀、寫等操作。

3.在gqcs得到非同步操作的完成情況並處理完畢之後,重新開始下一輪等待。

以上兩種方式也代表了reactor模式和proactor模式。

boost.asio在linux下巧妙的用epoll模擬了proactor,把對非同步io的操作封裝成io_service類,通過io_service方便的進行非同步io建立、等待,通過模板函式進行投遞/處理事件等操作。並且可以方便的與執行緒繫結。讀過asio之後我立刻採用了類似的方式改寫了自己以前的**,減低了非同步io與io執行緒之間的耦合。不過io_service的iocp版本實現中,gqcs指定了超時時間gqcs_timeout為500毫秒。個人認為這樣會帶來乙個問題:若同時有n個執行緒等待在同乙個非同步io上,那麼每隔gqcs_timeout單位時間,每乙個執行緒將會因為gqcs超時而被喚醒,產生額外的執行緒切換。這樣會失去iocp自動減少執行緒切換帶來的高效。

網路伺服器設計

資訊家電網路伺服器設計 2016 年 6 月 目 錄 第三章 嵌入式平台開發環境 3.2 軟體開發環境 3.2.1 交叉編譯開發環境的建立 第二步 安裝交叉工具鏈 2.解壓arm linux gcc 3.4.1.tar.bz2 tar jxvf arm linux gcc 3.4.1.tar.bz2...

關於網路伺服器

假如我有數千萬甚至是上億的使用者資料,我想把使用者自增id和使用者名稱username放到快取裡。我的需求是,當要查詢使用者的資訊時,我想先從快取裡根據使用者名稱username獲取到使用者的id,然後再通過id在資料庫裡查詢使用者的資訊。我想當乙個使用者表達到上億的數量級別時,用自增id來查詢肯定...

網路伺服器宕機

1.伺服器程序終止 當伺服器程序終止時,伺服器傳送fin給客戶端,客戶端回以ack,客戶端進入close wait狀態,但還沒有結束連線。此時客戶端阻塞於fgets,客戶端繼續傳送buffer,伺服器傳送rst,客戶端readline返回0。而如果客戶端不理睬readline返回的rst,繼續wri...