FileShare —— 基于 Windows IOCP 无状态高并发Socket I/O 模型

        为尊重原作者,首先附上对我进步非常有用的链接 http://blog.csdn.net/piggyxp/article/details/6922277

         这一次的小灵感,是因为要进行网络应用课程设计。所以才做了这么个东西。原始的学习资料来源于1034的项目经验。当时不应该说是迫不得已,只是把自己的业务想复杂了,就直接上了windows中的IOCP模型。在知道大概原理以后,就对这个模型膜拜地不行。线程池、队列请求模型,都整合到区区几个API函数里去了。为了方便理解,我把它比喻成餐馆服务员的模式。

         步骤就是这样:

1、客户端请求 连接服务器 => 客人来到餐馆

2.1.1、(传统模型) accept 或者 WSAAccept 后 开辟一个线程进行服务  => 餐馆 分配一个服务员

              这里有一点要注意,CPU没有那么多的物理核心数 =>  餐馆没有那么多服务员

              那么,如何做到服务那么多客人呢,解决方案就是在一个短小的时间内,CPU切换线程上下文 => 一个服务员服务多名顾客

2.1.2、这时候,当服务请求很多的时候 => 客人非常多

               CPU就得在这么多线程中进行上下文切换 => 服务员不断地从这跑到那,从那跑到这,目的是为了让所有客人得到服务。

2.1.3、这样直接导致的结果,是CPU因为切换线程上下文而耗费大量的资源(时间和内存),反而导致实际工作效率非常低下。

                =>  服务员跑来跑去,自己都累死了,哪里有力气服务客人?

解决方案即是一个几乎完美的IOCP模型了。

2.2.1  首先,开辟一定数量的线程,并投递出足够数量的AcceptEx请求 =>   服务员排好队,等待客人光临,其他人各做各事。

2.2.2  客户端请求连接,(可选:并发送第一次数据) => 客人来到,顺便也可以点一份菜。

2.2.3 当足够多的客户端连接时,只要投递了请求,就进入等待队列等到线程池中的线程为它服务。

            => 客户多的时候,进入休息区休息,服务员先做好手头的事情,做好了再来迎接休息区的客人。

这样的结果就是,一方面我们不用怕开过多的线程造成系统运行缓慢或者崩溃,另一方面,我们可以非常好地利用windows异步I/O,将需要耗费大量时间的I/O步骤投递到完成端口上进行。

         至于细节部分,还是看上面链接博主给出的吧。他的代码我也很喜欢,OO思想很全面,在这膜拜下。完成端口说是windows中最复杂的内核对象,其实想明白了也是那么一回事,所以没什么好怕的。阿温继续加油~!

你可能感兴趣的:(C/C++)