ACE网络库及IOCP通讯模式在电力系统机房监控中的应用
摘 要:近年来电力系统的机房动力环境监控系统的应用范围不断扩展,系统规模迅速扩大,接入站点大量增加,对监控主站的软件硬件提出了更高的要求。介绍在监控主站升级改造中,运用的新一代网络通讯解决方案与策略,探讨ace网络库及iocp通讯模式在通讯软件中的应用。
关键词:ace网络库 iocp模式 动环监控系统
中图分类号:tm76 文献标识码:a 文章编号:1007-3973(2013)006-081-02
在电力系统大运行体系实施中,建设变电站及通信机房监控系统,在传统“四遥”的基础上,安装包含交直流电源子系统、遥视图像子系统、安防周界子系统、环境子系统、照明子系统等综合辅助监控系统,全面提升对变电站机房的“感知”, 减轻运行维护人员负担,提高电网运行可靠性成为一种必须。
在机房环境系统建设的初期,接入对象主要是电力局大楼的机房、500kv220kv高电压等级变电站机房。接入的站点数量较少,一般在10个以下,通讯对象也只有几十个。近几年,随着电
力系统自动化程度不断提高,大量110kv及以下的变电站,都实现了无人值班,在变电站机房的自动化设备大量增加的同时,操作维护人员大量减少。另外,大量的社区或乡镇供电所实现网络接入,联网收费。大量的110kv及以下的变电站、社区或乡镇供电所都需要接入集中的机房监控系统,接入的站点数量和通讯对象几何倍数增加,很多地区供电局的机房监控系统接入站点需求量达到200个以上,通讯对象超过1000个。
通讯对象的几何倍数增加对动环监控系统的通讯服务器提出了极高的要求。是对现有服务器系统进行软件升级,还是投入巨资升级硬件、增加服务器数量?成为各电力局安排建设资金面临的重要问题。
机房监控系统的通信服务器的主要工作就是进行网络通讯。目前常用的网络通讯编程模型有以下几种:
(1)blocking i/o阻塞模式:与通讯对象网络连接时,在连接过程中一直等待,效率极低。只要有多个通讯对象就不能有效的工作了。
(2)nonblocking i/o非阻塞模式:与通讯对象网络连接时,在启动连接后,就可以进行其它
工作,效率较高。但每个网络连接工作中仍需一到两个线程,因此连接数达到几十上百后,大量线程经常切换,效率大幅下降。
(3)select模式(i/o multiplexing):一个线程可以管理64个网络连接。此模式在达到1000个以上的网络连接后,也会由于线程太多,效率大幅下降。
(4)signal driven i/o (sigio):只有unix系统支持。我们暂不考虑。
(5)asynchronous i/o模式(iocp模式是其中一种):一个线程可以管理成千上万个网络连接。在多连接,大数据量下,可获得理想的cpu响应。此模式适应于网络服务器这类需要处理大量连接的应用。
图1是以上五种模型的比较。
图1 五种模型的比较
从图1可以看出,越往后,阻塞越少,理论上效率也是最优。
从机房环境系统的长远发展看,我们选取asynchronous i/o(reactor框架介绍iocp)模式进行网络通讯编程。
为提高系统建设进度,少走弯路,我们采取借鉴前人成功经验的方式,下载国内外程序员的开源代码库加以修改。
ace自适配通信环境(adaptive communication environment)是一种面向对象(oo)的工具包,它实现了通信软件的大量基本的设计模式。ace的目标用户是在unix和win32平台上开发 高性能通信服务和应用的开发者。ace简化了使用进程间通信、事件多路分离、显式动态链接和并发的oo网络应用和服务的开发。
ace是目前最具代表的开源网络通讯类软件库,授权是免费的,可以自由使用,它正在被用于大量商业项目中(包括国际知名的大公司:诺基亚、摩托罗拉等),以及许多学院和工业研究项目。ace已被移植到多种操作系统平台上,包括win32和大多数的unix/posix实现。此外,同时有c++和java版本的ace可用。
ace库版本很多,更新升级比较快。我们根据机房环境监控系统的需要,选用的是基于vc2005的windows平台版本,版本号为5.8.2,这个版本的库支持vc2005(vc8)、wince(vc2005)、vc2008(vc9),适用范围比较宽。
ace 中的proactor框架可以实现iocp功能。proactor很多文档翻译为前摄器。
proactor使用了异步的i/o工厂类收发消息,read/write方法都是异步进行的,调用完成后立即返回给proactor主框架,然后进行其它事件的处理。后台的程序负责收发消息,真正收到消息或者发送消息完成时才通知proactor的事件处理器去进行处理。这种异步i/o机制使得proactor的主线程更专注于我们业务逻辑的处理,而不会将时间浪费在对网络数据i/o的处理上。
我们应用ace库,通过ace_proactor实现iocp模式的实现方式如下:
1 创建服务处理器
proactor框架中服务处理器均派生自ace_service_handler,它和reactor框架的事件处理器非常类似。当发生io操作完成事件时,会触发相应的事件完成会调函数。
2 实现服务处理器io操作
proactor框架中所有的io操作都由相应的异步操作类来完成,这些异步操作类都继承自ace_asynch_operation。常用的有以下几种:
ace_asynch_read_stream, 提供从tcp/ip socket连接中进行异步读操作.
ace_asynch_write_stream, 提供从tcp/ip socket连接中进行异步写操作.
使用这些操作类的一般方式如下:
初始化
将相关的操作注册到服务处理器中,一般可通过调用其open方法实现。
发出io操作
发出异步io操作请求,该操作不会阻塞,具体的io操作过程由操作系统异步完成。
io操作完成回调处理
异步io操作完成后,os会触发服务处理器中的相应回调函数,可通过该函数的ace_asynch_result参数获取相应的返回值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论