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

来源:互联网 发布:美工设计经理岗位职责 编辑:程序博客网 时间:2024/04/30 00:45

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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电动三轮车在泗阳被交警扣了怎么办 环评证实际的设备少报了怎么办 别人盗用了自己的社保卡怎么办 如果有人盗用社保卡信息住院怎么办 丈夫出轨生下孩子妻子该怎么怎么办 l老公偷着儿子消失了怎么办 老婆出轨怀孕现在流了他跑了怎么办 交通银行贷款资金户里面的钱怎么办 新车2个月出现好多小毛病怎么办 地上终末之日尸潮破坏房子怎么办 初一数学期未考试考了77分怎么办 生育服务单再婚婚史情况怎么办 我孩子的数学一直很差怎么办呀! 扶桑花的叶子出斑点发黄怎么办 高二的学生成绩下降特别大怎么办 六个月大的宝宝咳嗽伴有气喘怎么办 昨天奶用力吸今天好疼怎么办 律师把医院的医药费单子丢了怎么办 母亲是个不明事理的人怎么办 华西医院的就诊卡掉了怎么办 整形医院把我脸上疤痕被大了怎么办 牙齿缝里的东西很臭怎么办 五岁宝宝牙齿有空洞斑点怎么办 给别人担保贷款被起诉了怎么办 不小心在微信里登录江西移动怎么办 住院出院后医保卡在医院怎么办 医院门诊做完检查医生下班了怎么办 退税的发票勾选为抵扣的发票怎么办 买完邮轮票后护照换了怎么办? 朝阳医院挂号过了取号时间怎么办 苹果4的id密码忘了怎么办 ipad己停用5分钟后再试怎么办 手机上大智慧日线失真怎么办 安卓手机突然地图信号弱怎么办 魔兽争霸对战模式没有金币要怎么办 常州号码被标记了商铺的名字怎么办 车提档了不接收怎么办公司能收回吗 稳岗补贴如果联系方式填错了怎么办 湖北驾照扣了50多分怎么办 南京驾照违章了50多分怎么办 有一个月没有去国税保税怎么办?