winsock I/O模型的分析

幾種winsock I/O模型的分析

   套接字是通訊的基礎,是支持網絡協議數據通訊的基本接口。Winsocket 提供了一些有趣的I/O模型,有助於應用程序經過一種「異步」方式,一次對一個或者多個套接字上進行的通訊加以管理。這些模型包括select(選擇)、WSAAsynSelect(異步選擇)、WSAEventSelect(事件選擇)、Overlapped I/O(重疊 I/O)以及Completion port(完成端口)。windows

① select 模型:網絡

       select模型是WinSock中應用最普遍的模型之一,核心就是select函數,它可用於判斷套接字上是否存在數據,或者可否向一個套接字寫入數據。這個函數能夠有效地防止應用程序在套接字處於阻塞模式中時,send或recv進入阻塞狀態;同時也能夠防止產生大量的WSAEWOULDBLOCK錯誤select的優點是可以從單個線程的多個套接字上進行多重鏈接及I/O。這就避免了伴隨阻塞套接字和多重鏈接的線程劇增。數據結構

② WSAAsyncSelect 模型:app

       由於它是以消息爲基礎的,關鍵就是WSAAsyncSelect函數,將socket消息發送到hWnd窗口上,而後在那裏處理相應的FD_READ、FD_WRITE等等消息。優勢:WSAAsyncSelect和WSAEventSelect模型提供了讀寫數據能力的異步通知,但他們不提供異步數據傳送,而重疊及完成端口提供異步數據的傳送。並且它能夠在系統開銷不大的狀況下同時處理不少鏈接,而select模型還須要創建fd_set結構。 缺點:必需要使用一個窗口接收消息,若是處理成千上萬的套接字就力不從心了。異步

③ WSAEventSelect 模型:socket

       這個也是以事件爲基礎的網絡事件通知,可是與WSAAsyncSelect不一樣的是,它主要是由事件對象句柄完成的,而不是經過窗口。優勢:不須要窗口。缺點:每次只能等待64個事件,因此處理多個套接字時有必要組織一個線程池;因此伸縮性就不如後面的完成端口了。函數

④ 重疊模型:性能

       這個模型可使程序能達到更佳的系統性能。基本設計原理就是讓應用程序使用重疊的數據結構,一次投遞一個或多個I/O請求。針對這些提交的請求,在他們完成以後,應用程序可爲他們提供服務。它又分爲兩種實現方法:在事件中使用,還有就是完成例程。spa

⑤ 完成端口:線程

       完成端口提供了最好的伸縮性,每每可使系統達到最好的性能,是處理成千上萬的套接字的首選。從本質上說,完成端口模型要求建立一個windows完成端口對象,該對象經過指定數量的線程,對重疊I/O請求進行管理,以便爲已經完成的重疊I/O請求提供服務。

相關文章
相關標籤/搜索