探索高并发之道:IOCPServer,Windows下高性能网络服务的利器

探索高并发之道:IOCPServer,Windows下高性能网络服务的利器

IOCPServer IOCPServer 项目地址: https://gitcode.com/gh_mirrors/io/IOCPServer


在追求高效率、低延迟的网络服务领域,完成端口(IOCP, I/O Completion Ports)无疑是一个璀璨的明星。今天,我们为您带来了一款精心打造的开源项目——IOCPServer,专为Windows平台设计,旨在简化IOCP的复杂性,让开发者能够更加高效地构建高性能的TCP服务。

项目介绍

IOCPServer是一个强大而直观的基于完成端口的网络服务框架。它不仅仅是一个简单的实现,更是一扇窗,向开发者展示了如何充分利用Windows下的IOCP机制,实现高并发、低延迟的网络通信。伴随详尽的配套文章,让学习和应用IOCP不再是一项艰巨的任务。自带的缓存池和心跳包功能,使得长期连接管理变得轻而易举。

技术分析

核心类IOCP

该框架的核心在于IOCP类,它深挖WinSock底层,巧妙封装了复杂的IOCP逻辑。通过IOContext类处理重叠操作参数,实现了从创建完成端口到接收、接受请求的全流程控制。每一环节都经过优化,确保在多线程环境下依然稳定高效。

异步处理机制

利用IOCP的异步特性,IOCPServer能够在多个客户端连接的同时高效处理数据收发。工作者线程响应内核通知,处理已完成的操作,最大限度减少CPU上下文切换,提升整体性能。

应用场景

  • 大型网络游戏服务器:需要处理成千上万的并发连接,保障游戏运行的流畅度。
  • 实时通讯系统:如即时消息平台,要求低延迟的数据传输。
  • 金融交易系统:在毫秒级响应速度至关重要的场景中大放异彩。
  • 大规模文件共享服务:高速且稳定的文件传输能力。

项目特点

  1. 简易集成:通过派生子类并重载回调函数,即可快速接入现有项目,大大降低开发成本。
  2. 高性能:利用IOCP的异步非阻塞特性,轻松处理大量并发连接,优化资源利用率。
  3. 稳定性强:内置心跳检测机制,有效维护长连接的健康状态,提高系统的可靠性。
  4. 可扩展性:结构清晰,易于扩展,适应未来需求的变化。
  5. 文档齐全:附带详细的文章指导,即使是IOCP新手也能迅速上手。

IOCPServer不仅是一款工具,它是对IOCP技术的一次深入探索与实践。对于渴望在Windows平台上搭建高性能网络服务的开发者来说,这无疑是一座宝贵的宝藏。立即加入IOCPServer的行列,体验高性能网络开发的新境界。无论是初探IOCP的开发者,还是寻求优化现有服务的专家,IOCPServer都是你不容错过的选择!

IOCPServer IOCPServer 项目地址: https://gitcode.com/gh_mirrors/io/IOCPServer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

说明 一、受限制库Dll和lib说明: 库文件G-TcpServer.lib、G-TcpServer.Dll是受限制的试用版本和Demo配套。 1、最大连接不能超过50 2、发送字节数不能超过50 3、不能设置0读投递、无超时机制 4、其他功能限制 二、版本解读说明 1、版本名带T的表示是受限制的试用版 2、版本名带bata表示非正式版 3、版本名带WChar表示支持WideChar 4、版本号以时间格式累加计数(60进1)和显示 三、文件“G-TcpServer无限制体验版.exe”是无限制的体验版。 四、文件夹 1、Demos文件夹是VC Lib、Dll库及Delphi2010的例程源码,供开发学习 2、G-Sockets文件夹是Lib和Dll库的Delphi和VC的头文件 3、Release\G-Sockets\Dll文件夹是动态库的输出文件夹 4、Release\G-Sockets\Lib文件夹是静态库的输出文件夹 1、模块包含处理线程、工作线程和看守线程。 工作线程负责IO投递工作,并响应投递返回,再把接收的数据投递给处理线程,处理线程调用回调函数给应用层,以此可以在通讯层和应用层之间现实0拷贝数据的功能。模块只有一个看守线程,负责:a、响应Accept事件并投递接受队列;b、效验接受超时(即只连接不发数据)断开连接,防止空连接;c、效验空闲超时(即心跳超时)断开连接。 按工作量来分,最繁重的是处理线程,其次是工作线程,最闲的是看守线程。可通过OnThread事件回调函数设置线程权限。在此线程模式下,应用层可以在回调函数里处理数据而不必再建立另外的数据处理线程池。 2、线程平衡 为使连接能平衡使用处理线程,每个连接同时只有一个处理线程处理工作线程投递过来的IO返回事件并调用回调函数通知应用层。 3、收发平衡 为使连接能平衡使用IO设备,每个连接同时只能投递一个读请求,并通过线程平衡机制保证接收的数据是按顺序的被处理线程处理及通过回调函数传递给应用层;同时也只能投递一个写请求,其余写请求都按顺序放在写队列里面。读写同步都使用临界段。 4、0拷贝技术 接收数据0拷贝看1项;提供GTcpSvr_AllocGBuf()、GTcpSvr_FreeGBuf()和GTcpSvr_PostSendGBuf()三个函数实现发送数据的0拷贝。 5、0读投递 为避免内核锁定分页内存过多,可通过设置来采用0读投递来降低吞吐性能从而实现大连接量。 6、HndData回收 HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦断线立即回收,其他未决投递继续返回时只处理IoData,不对HndData做任何写操作。同时为避免HndData刚收回来但其未决投递还没有完全返回之前就立即被利用的可能性,HndData池采用了FIFO双锁并发链表,该链表通过ExNumber值来实现在最大连接情况下HndData池还有ExNumber个数量使链表不为NULL,通过设置ExNumber数量可实现控制链表末端的HndData出列时间,在这个时间内可以保证断开刚回收的HndData的未决投递能够完全返回。 HndData池,初始时如下: HD1 + HD2 + HD... + HDMaxConnection + HDEx1 + HDEx2 + HDEx... + HDExNumber | | Head------------------------------------------------------------------Tail 达到最大连接时如下: HDEx1 + HDEx2 + HDEx... + HDExNumber | | Head---------------------------Tail 断开回收一个HndData(HD)后如下: HDEx1 + HDEx2 + HDEx... + HDExNumber + HD | | Head-------(需要T时间HD才能出列)------Tail 注:T可以通过控制ExNumber值来实现,假定每秒最大可以处理C个连接和断开,需要延时T秒所有未决投递才会完全回收,那么:ExNumber = T * (MaxConnection / C)。实际上每个连接未决投递非常少(因为读写是单投递的),并且工作线程并不处理数据工作量不大,因此T很短,模块默认是3秒。对于服务器而已,一秒能接受的连接量是可知预计的,模块默认是1万,假定MaxConnection=C所以ExNumber是3万。但实际应用中,正常情况下连接率远少于1万/S,尤其是长连接的服务器,即使是短连接的服务器也不会发生这样的连接率。可能的情况是DOS,如果是影响也不大,因为还有MaxConnection控制,超过这个数的连接就立即被CloseSocket了。和频率高的数据收发相比,断线、连接的频率远少于它,在频率低的地方上多做多点工作总比在频率高的地方多做一点工作的好。 7、可伸缩性 IoData数量可根据初始需要设置,资源不足时模块自动向系统申请内存。为保证HndData的安全性,HndData池还设置了延时出列,刚回收的HndData入列时间必须超过3(或更长)秒钟,如果未达到3秒的,模块自动向系统申请内存。 8、内存管理 IoData和HndData均采用VirtualAlloc和VirtualFree来向系统操作内存。IoData池采用原子函数InterlockedCompareExchange来操作进出栈。HndData采用单向FIFO双锁并发链表来管理出入列操作。其他小内存需求的均采用静态数组或new操作。 五、内存需求 每个IoData等于一个分页内存大小,信息头大小为36Byte,有效使用内存是4060Byte,因此对GTcpSvr_AllocGBuf获得的内存写入时不应该超过4060(调用GTcpSvr_GetGbufSize获得),所有IoData占用系统内存是:IoDataCount * PageSize(4096)。每个HndData大小是128Byte,加上每个Socket分配时耗内存约是:540Bytes(此为估计值,应以MS技术文档为准),所有HndData耗系统内存是:HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE(128 + 540)。其他变量和数组可能耗得内存在10M之下。 综上,整个模块需求内存量是:UseMemSize = IoDataCount * PageSize + HndDataCount * MAX_HNDDATA_AND_SOCKET_SIZE + 10M。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方拓行Sandra

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值