关键词:IOCP TcpServer TcpClient 完成端口 服务器 达到6万连接 突破连接限制 压力测试工具 堵塞锁 非堵塞锁 无锁 Lock Free 并发队列 并发可扩充环形队列
首先感谢在行动和精神上给予本人支持的各位同行,在过去的日子,使得本人的IOCP研究进入了崭新的领域。本文及附件希望能给予更多人的帮助,限于商用等原因,除了原来的0.85版开源之外,更高版本不便开源,仅简单描述一些技术要点,请谅解。但附件的压力工具源码,仍然能给予很多帮助,比如封包、解包、处理粘包等,同是压力工具还能帮助开发者测试服务器的性能,而且此帮助并不仅仅是一般的帮助。(其他的IOCP方法网上都有介绍,这里不多说。)
一、TcpServer
1、结构及流程
A、看守线程负责响应接受投递不足时的事件并投递接受请求,同是处理空连接和心跳超时
B、工作线程负责处理读写完成及读写错误的处理,并投递给处理线程
C、由于在工作处理数据及进行文件和数据库读写等操作可能会造成通信“卡”的现象,因此增加了处理线程,通过完成队列和线程池,接受工作线程投递过来的事件,处理线程通过回调函数将IO操作结果传递给应用层,应用层完全可以在回调函数里处理数据,从而实现了0拷贝功能,并保证数据的有序处理。
2、运行信息
为能更好的测试模块,开发者可参考截图的信息内容,对自己的模块进行测试开发工作,以帮助观察运行情况判断问题所在。
二、不可忽视的关闭工作
很多人在关闭通讯模块的时候,关闭所有连接和线程然后把记录的所有的内存都一一释放就结束了关闭工作。这样尽管没有内存泄露,但却可能隐蔽了其他问题。
正确的做法是:
1、关闭监听
2、关闭所有在线连接
3、等待关键计数器(内存池、连接池等使用计数器)归零 (这一步非常重要,这步过不了关肯定有问题)
4、关闭所有线程
5、逐一释放内存资源
6、变量复位
三、后IOCP时代
个人认为,微软的IOCP模型并不是Windows socket的终极,IOCP部分功能和效率仍然有待改进,以及Windows socket接口仍然不是高效率的体现,对开发有高要求的人,尤其是研究过Win2000源码的人,更深有体会。大家都知道,凡是满足功能强大的软件,效率在一定程度上会打折扣,针对高效率模型提供专有的Socket API才是关键,而不是一个API通用任何模型。微软到底是改进现有功能呢,还是提供更有效率的模型,这个只有微软才知道了。
四、IOCP的更高境界
入题前先给线程同步的锁分类:1、堵塞锁:系统提供的内核态的同步机制(内核态切换的效率众所周知),2.、非堵塞锁:诸如LockFree等使用原子操作指令完成的同步机制,3、无锁:堵塞锁、非堵塞锁之外的同步机制,确实的说是没有锁的机制。网络及书本上介绍的IOCP,常用做法都是使用堵塞锁的方式,打破传统思维才能获得创新。在过去的日子中,本人已经实现了非堵塞锁并发同步的IOCP模块。并根据IOCP Tcp Server的特殊情况,能在多线程下某些竞争的地方不使用锁亦能实现并发式同步的功能。这个模块实现,需要对IOCP Tcp Server的数据结构(主要是队列)进行深入分析,根据实时性、使用频率等归纳总结,判断出:哪些需要立即处理的,哪些可以暂缓处理而又不影响效率的,哪些需要锁的,哪些不需要锁的,哪些需要堵塞锁的,哪些不需要堵塞锁的,需要堵塞锁的能不能换个角度可以使用非堵塞锁来解决等。
五、附件
1、突破连接限制的注册表设置方法及工具
比较全面的介绍突破连接限制。
2、功能相当强大的压力测试工具的源码、G-TcpClient.Lib(限制版)
有助于开发者学习和制作测试压力测试工具,另有封包、解包、处理粘包等。G-TcpClient.Lib是限制版,主要是和压力工具配套方便学习压力工具源码。
3、堵塞锁模式的服务器Exe、堵塞锁模式的压力测试工具exe
有助于测试自己的服务器和客户端。压力测试工具单机可以达到6万连接,附有说明书。
附件下载链接:
http://download.csdn.net/source/2566607