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. 程序实现相对较复杂。


你可能感兴趣的:(windows应用)