欢迎来到天天文库
浏览记录
ID:44358194
大小:891.29 KB
页数:31页
时间:2019-10-21
《完成端口的相关概念》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、完成端口的相关概念在开始编码Z前,我们先來讨论一下和完成端口相关的一•些概念,如果你没有耐心看完这段大段的文字的话,也可以跳过这一节直接去看下下一节的具体实现部分,但是这一节屮涉及到的基本概念你还是有必要了解一下的,而且你也更能知道为什么有那么多的网络编程模式不用,非得要用这么乂复杂乂难以理解的完成端口呢??也会坚定你继续学习下去的信心丫3.1异步通信机制及其几种实现方式的比较我们从前面的文字小了解到,高性能服务器程序使用异步通信机制是必须的。而对于异步的概念,为了方便后面文字的理解,这里述是再次简单的描
2、述一下:异步通信就是在咱们与外部的I/O设备进行打交道的时候,我们都知道外部设备的I/O和CPU比起来简直是龟速,比如便盘读写、网络通信等等,我们没冇必要在咱们自己的线程里面等待着I/O操作完成再执行后续的代码,而是将这个请求交给设备的驱动程序自己去处理,我们的线程可以继续做其他更重要的事情,大体的流程如下图所示:我町以从图屮看到一个很明显的并行操作的过程,而“同步”的通信方式是在进行网络操作的时候,主线程就挂起了,主线程要等待网络操作完成之示,才能继续执行后续的代码,就是说要末执行主线程,耍末执行网络操
3、作,是没法这样并行的;“异步”方式无疑比“阻塞模式+多线程”的方式效率要高的多,这也是前者为什么叫“异步”,后者为什么叫“同步”的原因了,因为不需要等待网络操作完成再执行别的操作。而在Windows中实现异步的机制同样有好几种,而这其屮的区别,关键就在于图1屮的最示一步“通知应用程序处理网络数据”上了,因为实现操作系统调用设备驱动程序去接收数据的操作都是一样的,关键就是在于如何去通知应川程序來拿数据。它们之间的具体区别我这里多讲几点,文字有点多,如果没兴趣深入研究的朋友可以跳过下一面的这一段,不影响的:)
4、(1)设备内核对象,使丿IJ设备内核对象來协调数据的发送请求和接收数据协调,也就是说通过设置设备內核对彖的状态,在设备接收数据完成后,马上触发这个内核对彖,然后让接收数据的线程收到通知,但是这种方式太原始了,接收数据的线程为了能够知道内核对彖是否被触发了,还是得不停的挂起等待,这简直是根本就没有用嘛,太低级了,有木有?所以在这里就略过不捉了,各位读者要是没明口是怎么回事也不用深究了,总之没有什么用。(2)事件内核对象,利用事件内核对象來实现I/O操作完成的通知,其实这种方式其实就是我以前写文章的时候提到的
5、《基于事件通知的重叠I/O模型》,链接在这里,这种机制就先进得多,可以同时等待多个I/O操作的完成,实现真正的异步,但是缺点也是很明显的,既然用WaitForMultipleObjects()来等待Event的话,就会受到64个Event等待上限的限制,但是这可不是说我们只能处理來自于64个客户端的Socket,而是这是属于在一个设备内核对彖上等待的64个事件内核对彖,也就是说,我们在一个线程内,可以同时监控64个重叠I/O操作的完成状态,当然我们同样可以使用多个线程的方式來满足无限多个重叠I/O的需求,
6、比如如果想耍支持3万个连接,就得W500多个线程…用起来太麻烦让人感觉不爽;(3)使用APC(AsynchronousProcedureCall,异步过程调用)来完成,这个也就是我以前在文章里捉到的《基于完成例程的重叠I/O模型》,链接在这里,这种方式的好处就是在于摆脱了基于事件通知方式的64个事件上限的限制,但是缺点也是有的,就是发出请求的线程必须得要自己去处理接收请求,哪怕是这个线程发出了很多发送或者接收数据的请求,但是其他的线程都闲着…,这个线程也述是得口己来处理口己发出去的这些请求,没有人来帮忙…
7、这就有一个负载均衡问题,显然性能没有达到最优化。(4)完成端口,不川说大家也知道了,最后的压轴戏就是使用完成端口,对比上面儿种机制,完成端口的做法是这样的:事先开好几个线程,你有几个CPU我就开几个,首先是避免了线程的上下文切换,因为线程想要执行的时候,总有CPU资源可用,然后让这儿个线程等着,等到有用户请求来到的时候,就把这些请求都加入到一个公共消息队列中去,然后这儿个开好的线程就排队逐一去从消息队列屮取出消息并加以处理,这种方式就很优雅的实现了开步通信和负载均衡的问题,【大I为它提供了一种机制来使用几
8、个线程“公平的”处理来白于多个客户端的输入/输出,并且线程如果没事干的时候也会被系统挂起,不会占川CPU周期,挺完美的一个解决方案,不是吗?哦,对了,这个关键的作为交换的消息队列,就是芫成端口O比鮫完毕Z后,熟悉网络编程的朋友町能会问到,为什么没有提到WSAAsyncSelect或者是WSAEventSelect这两个界步模型呢,对于这两个模型,我不知道具内部是如何实现的,但是这其中一定没有用到Overlapped机制,就不能
此文档下载收益归作者所有