标题 | IOCP在水下安防系统监控软件中的应用 |
范文 | 陈英婕+杨静宇+孟元凯 摘 要: 在此给出完成端口在某水下安防系统监控软件中的一种应用,在简要介绍完成端口模型的基础上,叙述了利用完成端口实现安防系统监控软件底层通信模块的方法,并构建了一个完整的监控中心数据服务器构架。该方法提高了监控软件网络通信的数据吞吐率,节约了CUP资源,同时在该构架下能够轻松实现安防系统软硬件的扩展和升级。 关键字: 完成端口(IOCP); 网络通信; 水下安防系统; 监控软件 中图分类号: TN964?34 文献标识码: A 文章编号: 1004?373X(2015)04?0077?03 某水下安防系统监控中心通过网络交换机将各个传感器子系统连接到局域网中,各传感器子系统包括水下被动声纳、水面雷达、岸基式AIS等组成,通过监控中心千兆网络交换机连接到两台监控中心主机上,其中主机1完成安防状态三维显示及数据服务器的功能,主机2负责安防状态控制功能。监控中心各子系统主机通过TCP方式(即C/S模式)与主机1数据服务器连接,监控中心的主机2接收数据服务器转发各传感器子系统的数据,各子系统之间通过主机1数据服务器可自由收发数据。 1 必要性 图1是监控中心各子系统网络连接图。在Windows操作系统中通常实现网络通信程序有如下这几种模型:Select,WSAAsyncSelect,WSAEventSelect,I/O重叠模型、完成端口[1]。前面3种模型采用阻塞模式对端口进行操作,具有编程简单易用的特点,适用于数据吞吐量不大的应用。另外,在阻塞模式下,程序在处理多个客户端并发事件时需要对每一个客户开辟一个线程去处理,此时响应多个客户请求时就需要CPU不停地在每个线程之间进行上下文的切换,因为线程切换是相当浪费CPU时间的,所有阻塞通信加多线程模式是一种需要占用大量CPU时间的编程模式。 I/O重叠模型和完成端口模型都高性能的非阻塞异步通信模式[1],非阻塞的异步通信模式通常内部提供了线程池的管理,可以避免反复创建线程的开销,同时可以根据CPU的个数灵活地决定线程个数,而且可以减少线程调度的次数从而提高性能,大大降低了CPU的占用时间。非阻塞的异步通信模式通常编程难度大,一般只应用与大型服务器。该安防系统各子系统数据采集时间不相同,采集数据量大易导致网络上出现多个并发事件,需要数据服务器同时响应并处理并发事件,作为监控中心主机1(数据服务器)的网络通信程序必须采用高性能非阻塞的异步通信模式编写。另外,数据服务器主机同时需要负责安防态势的解算、三维场景计算及实时显示功能,对CPU和内存等系统资源使用要求较高。I/O重叠模型和完成端口模型都是高性能的非阻塞异步通信模式,考虑到编程难度相当且完成端口的性能更加优秀,因此在该项目中使用更高性能的完成端口(IOCP)模型编制服务器程序。 2 IOCP简介 完成端口(Completion Port)是一种基于重叠 I/O(Overlapped I/O)的高性能异步通信机制,使用设备内核对象来协调数据的发送和接收[2]。当使用完成端口进行网络通信时,应用程序只需要向操作系统提交数据发送和接收的请求,此时应用程序可以自由地做其他事情而不会被阻塞,操作系统会在网络I/O操作“完成”之后通知应用程序,应用程序在接到系统的通知时,网络操作已经完成,此时应用程序只需要处理后面的事情了。完成端口就是不断投递重叠 I/O 操作,将耗时的操作交给系统后台进行,应用程序便获得了解放。 3 IOCP的实现 作为Windows操作系统最复杂的内核对象,下面简要说明完成端口实现的步骤[1]: (1) 调用CreateIoCompletionPort( HANDLE FileHandle,HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThreads)函数创建一个完成端口,函数第4个参数保持为0,它指定在完成端口上每个CPU一次只允许执行一个工作者线程; (2) 判断系统内有几个CPU; (3) 创建工作者线程,根据步骤2得到的CPU信息,在完成端口上为已完成的I/O请求提供服务,为避免由于线程数量不足而使CPU处于空闲的局面,通常创建2倍于CPU数量的工作者线程以供使用; (4) 准备好一个监听套接字,绑定到本机IP上,在端口5000上监听传入的连接请求; (5) 使用AcceptEX函数,接受入站的连接请求; (6) 创建一个数据结构,用于保存单句柄数据,同时在结构中存入接受的套接字; (7) 调用CreateIoCompletionPort,将自AcceptEx返回的新套接字句柄同完成端口关联到一起,通过completionKey参数,将单句柄数据结构传递给CreateIoCompletionPort; (8) 开始在已接收的连接上进行I/O操作。在此,希望通过重叠I/O机制在新建的套接字上投递一个或多个异步WSARecv或WSASend请求,这些I/O请求完成后,工作者线程会为I/O请求提供服务,同时继续处理以后的I/O请求; (9) 重复步骤(5)~(8),直至服务器终止。 4 IOCP在某安防系统中的应用 数据服务器主机软件除了负责数据接收存储和转发的功能外还负责地理坐标转换、传感器数据融合、安防态势的解算、目标轨迹滤波插值、三维场景计算及实时显示功能,该软件在使用完成端口的通信模式在安防系统中的程序流程图如图2所示。 为了使用的方便以及代码的重用,在该软件中将完成端口(IOCP)封装成一个完成端口通信类 CIocpServer,提供了连接、监听、发送、接收等基本网络通信功能,同时将接收到的数据保存到特定内存中,提供给上一级模块调用。 在测试该软件完成端口通信模块时,笔者采用NetAssist网络调试助手作为客户端软件,以5 ms的发送速度向该软件发送数据,为便于观察系统资源占用情况,将服务器和客户端软件放置在一台计算机上,如图3所示有数据通信时2个软件系统资源的占用情况。 图4中,紫色部分为某安防软件SZMoniSys系统占用情况,蓝色部分为网络调试助手NetAssist系统占用情况。由图可知采用完成端口作为以太网的通信程序其CUP占用率几乎可以忽略,而网络调试助手NetAssist的CUP占用率却达到了25%。如表1所示。 从表中可以看出完成端口模式在软件中使用时,繁忙和空闲时CPU占用率基本没有变化,几乎可以忽略不计,大大节约了系统硬件资源,把宝贵的系统资源留给数据分析处理、三维场景计算和显示。 另外,在今后的安防系统中,需要增减雷达、红外监视器等传感器设备时,要求监控软件具有良好的伸缩性,在该软件中由于采用了C++标准类的形式封装了完成端口,进一步提高了IOCP模型优良的扩展性能,使得该监控软件具有通用性强,扩展便捷的特点,轻松实现传感器的增减。 5 结 语 本文设计了一种满足某安防系统中的高性能通信服务器端架构并完成服务器底层通信的开发。完成端口(IOCP)作为一个高效但复杂精巧的Windows内核I/O对象[3],能提供了最好的伸缩性和最高的数据吞吐率,将节约的大量宝贵系统资源留给软件需要完成的更主要功能,恰好满足服务器“高性能”的要求。在实际应用中,采用基于完成端口的通信服务模式表现出了优良的稳定性、显著的性能优势、优异的软件和硬件扩展性,同时在保证了系统高性能运行的基础上极大地降低了系统软硬件成本、系统复杂性以及维护开发成本。本文提供的基于完成端口的通信服务器在很大程度上优化了对系统资源的利用和用户的调用,经过实际应用测试,效率和性能比传统方式要高出许多,因此可以应用于水下安防系统三维视景软件数据服务器的使用。 参考文献 [1] JONES A, OHLUND J. Microsoft Windows 网络编程[M].2版.北京:清华大学出版社,2002. [2] 王新宇.IOCP模型在网络设备管理系统中的应用[C]//广西计算机学会25周年纪念会暨2011年学术年会论文集.桂林:广西计算机学会,2011. [3] [美]杰夫瑞,[法]克里斯托夫. Windows核心编程[M].5版.北京:清华大学出版社,2008. [4] 汪晓平,钟军.Visual C++网络通信协议分析与应用实现[M]. 北京:人民邮电出版社,2003. [5] 孙军文,安妮,王中训.基于VC++6.0的网络通信设计[J].现代电子技术,2011,34(23):52?54. [6] 周涛.基于S?函数的Simulink与VC++网络通信研究[J].现代电子技术,2013,36(13):108?111. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。