windows下并发I/O服务器模型对比(二):5种并发I/O服务器模型 之二

windows下并发I/O服务器模型对比(二)

         在实际开发过程中,服务器程序需要和多个客户端程序进行通信。为了提高服务器程序的并发处理能力,通常为每个客户端启动一个线程,用于处理与客户端的数据通信。网络通信属于I/O操作。接收属于输入,发送属于输出。与CPU运算相比,网络通信的效率很低,主要体现在如下几点。

         ·服务器等待客户端的链接请求。

         ·客户端等待服务器的回应。

         ·等待数据到达socket接收缓冲区。

         ·等待socket发送缓冲区有足够的空间存放待发送数据。

         为了使服务器程序能够更快地响应客户端提出的请求,windows平台提供了5种socket编程模型,即select模型,WSAAsyncSelect模型,WSAEventSelect模型,重叠I/O模型,和完成端口模型。

1、  select模型

select模型又称为选择模型,它可以使windows socket应用程序同时对多个socket进行管理,调用select()函数可以获取指定socket的状态,然后调用windows socket API实现数据发送和接收等操作。

select()函数中使用集合来表示进行管理的多个socket。默认情况下,socket集合中包含64个元素,最多可以管理的socket数量为1024。尽管select模型可以同时管理多个连接,但对集合的管理比较繁琐。而且每次在使用socket发送和接收数据之前,都需要调用select()函数判断socket的状态,这会导致CPU额外的负担,从而影响应用程序的工作效率。

(疑问:select 可以检查的描述符最大为FD_SETSIZE,而不是最多FD_SETSIZE个描述符。Windows和linux有不同。)

2、  WSAAsyncSelect模型

WSAAsyncSelect模型又称为异步选择模型,它为每个socket绑定一个消息。当socket上出现事先设置的事件时,操作系统会给应用程序发送这个消息,从而使应用程序可以对该事件做相应的处理。

WSAAsyncSelect模型的优点是在系统开销不大的情况下可以同时处理许多个客户端连接。它的缺点是,即使应用程序不需要窗口,也要至少设计一个窗口用于处理socket事件。而且,在一个窗口中处理大量的事件也可能成为性能瓶颈。

3、  WSAEventSelect模型

WSAEventSelect模型模型又称为事件select模型,它允许在多个socket上接收以事件为基础的网络事件通知。应用程序在创建socket后,调用WSAEventSelect()函数将事件对象与网络事件集合相关联。当网络事件发生时,应用程序以事件的形式接收网络事件通知。

         WSAEventSelect模型与WSAAsyncSelect模型之间的主要区别是网络事件发生时系统通知应用程序的方式不同。WSAAsyncSelect模型以消息的形式通知应用程序,而WSAEventSelect模型则以事件的形式进行通知。Select模型会主动获取指定socket的状态,而WSAEventSelect模型和WSAAsyncSelect模型则会被动选择系统通知应用程序socket的状态变化。

         WSAEventSelect模型每次只能等待64个事件,这也是WSAEventSelect模型的不足之处。

(疑问:64个从WSA_MAXIMUM_WAIT_EVENTS来的。)

4、  重叠I/O模型

重叠I/O模型又称为OverlappedI/O模型,它的基本设计原理是可以让应用程序使用重叠的数据结构一次投递多个I/O请求,当系统完成I/O操作后通知应用程序。

重叠I/O模型是真正意义上的异步I/O模型。在应用程序中调用输入/输出函数后,程序将立即返回。当I/O操作完成后,系统会通知应用程序。

系统通知应用程序的形式有两种,即事件通知和完成例程。事件通知方式即通过事件来通知应用程序I/O操作已完成,而完成例程则指定应用程序在完成I/O操作后调用一个事先定义的回调函数。

5、  完成端口模型

完成端口(Completion Port)是一种在windows服务平台上比较成熟和高效的I/O操作方法,它使用线程池处理异步I/O请求。利用完成端口模型,应用程序可以管理成百上千个socket。

可以把完成端口看成系统维护的一个队列,操作系统把重叠I/O操作完成的事件通知放到该队列中,因此称其为“完成”端口。当socket被创建后,可以将其与一个完成端口联系起来。

一个应用程序可以创建多个工作线程用于处理完成端口上的通知事件。通常应该为每个CPU创建一个线程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值