Windows 套接字I/O 模型

windows提供了一些I/O 模型幫助應用程序以同步或者異步方式在一個或者多個套接字上管理I/O。大體上,這樣的I/O 模型共有6 種。

  • 阻塞(blocking)模型
  • 選擇(select)模型
  • WSAAsyncSelect模型
  • WSAEventSelect 模型
  • 重疊(overlapped)模型
  • 完成端口(completion port)模型

1.阻塞(blocking)模型

在阻塞模式下,執行I/O 的Winsock 調用(如send 和recv)一直到操作完成才返回。在非阻塞模式下,Winsock 函數會立即返回。阻塞套接字的好處是使用簡單,但是當需要處理多個套接字連接時,就必須創建多個線程,即典型的一個連接使用一個線程的問題,這給編程帶來了許多不便。所以實際開發中使用最多的還是下面要講述的非阻塞模式。


2.選擇(select)模型

當 select 返回時,它通過移除沒有未決I/O 操作的套接字句柄修改每個fd_set 集合,使用select的好處是程序能夠在單個線程內同時處理多個套接字連接,這避免了阻塞模式下的線程膨脹問題。但是,添加到fd_set 結構的套接字數量是有限制的,默認情況下,最大值是FD_SETSIZE,它在winsock2.h 文件中定義爲64。爲了增加套接字數量,應用程序可以將FD_SETSIZE定義爲更大的值(這個定義必須在包含winsock2.h 之前出現)。不過,自定義的值也不能超過Winsock 下層提供者的限制(通常是1024)。另外,FD_SETSIZE值太大的話,服務器性能就會受到影響。例如有1000 個套接字,那麼在調用select之前就不得不設置這1000 個套接字,select 返回之後,又必須檢查這1000 個套接字。

缺點:1. I/O線程需要不斷的輪詢套接字集合狀態,浪費了大量CPU資源。

           2. 不適合管理大量客戶端連接。

           3. 性能比較低下,要進行大量查找和拷貝。


3.WSAAsyncSelect 模型

WSAAsyncSelect 模型允許應用程序以Windows 消息的形式接收網絡事件通知。這個模型是爲了適應Windows 的消息驅動環境而設置的,現在許多對性能要求不高的網絡應用程序都採用WSAAsyncSelect 模型。

 缺點:1. 網絡事件以消息的形式進行通知,性能相對比較低下。

補充A.

操作系統TCP/IP協議棧接收到網絡上的事件後,將網絡事件轉換爲消息投遞到操作系統消息隊列裏,                      在適當的時候再由操作系統從系統消息隊列中取出消息,投遞到應用程序的消息隊列,應用程序接着進行                    消息路由,分發到各窗口過程中。

   B

消息的處理需要依附窗口,如果網絡I/O共用UI主線程,當主線程阻塞或者進行耗時操作時,網絡消     息得不到響應。當然可以創建一條UI工作線程單獨處理網絡消息,但是這樣處理會帶來新的問題,也偏離了這個模型的設計初衷。

2. 不適合管理大量客戶端連接


4.

WSAAsyncSelect 模型


核心 API WSAEventSelect 、WSAWaitForMultipleEvents、WSAEnumNetworkEvents 函數

WSAWaitForMultipleEvents 最多支持WSA_MAXIMUM_WAIT_EVENTS個對象,

WSA_MAXIMUM_WAIT_EVENTS 被定義爲64。因此,這個I/O 模型在一個線程中同一時

間最多能支持64 個套接字,如果需要使用這個模型管理更多套接字,就需要創建額外的工作線程了。

缺點:不適合管理大量客戶端連接。採用線程池可以解決大量客戶端連接管理的問題,但是同時帶來線程上下文切換的開銷和同步的開銷,一般如果連接數不是太多(<250)建議採用該模型。


5.重疊(overlapped)模型

與介紹過的其他模型相比,重疊I/O 模型提供了更好的系統性能。這個模型的基本設計

思想是允許應用程序使用重疊數據結構一次投遞一個或者多個異步I/O 請求(即所謂的重疊

I/O)。提交的I/O 請求完成之後,與之關聯的重疊數據結構中的事件對象受信,應用程序便可使用WSAGetOverlappedResult 函數獲取重疊操作結果。

缺點:和WSAEventSelect模型相似,且相對較複雜。


6.完成端口(completion port)模型

當應用程序必須一次管理多個套接字時,完成端口模型提供了最好的系統性能。這個模

型也提供了最好的伸縮性,它非常適合用來處理上百、上千個套接字。IOCP 技術廣泛應用於各種類型的高性能服務器,如Apache 等。核心 API CreateIoCompletionPort、GetQueuedCompletionStatus 等。

缺點:1. 程序實現相對較複雜。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章