IOCP模型(I/O完成端口)是Windows平台上性能最好的一种的I/O模型。IOCP模型就是不断投递重叠I/O操作,将耗时的操作交给系统后台进行,应用程序便获得了解放,可以自由去做其他事情,当操作完成后,系统会通知等待操作结果的线程进行进一步的处理。IOCP模型将最为耗时的IO操作交给了系统底层,大大提高了应用程序的CPU利用率。相对于其他网络通信模型来说,IOCP具有系统资源占用少、不受SOCKET连接数限制、数据吞吐率高等优势。
一个网络设备管理系统,一方面要在底层实现对网络设备的管理和监控,另一方面要在应用层让用户能够直观地看到网络设备的运行状态和对网络设备进行控制和设置。在这个网络飞速发展的时代,网络设备管理系统的主流架构也一般是采用C/S或者B/S架构,而无论选择哪种架构,都必须有个S端,也就是服务端,而IOCP模型则可以作为服务端的底层网络通信模型。

为了使用的方便以及代码的重用,在网络设备管理系统中可以将IOCP封装成一个服务器类IocpServer,提供连接、监听、发送、接收等基本网络通信功能。同时以该类为父类派生出一个ManagerServer子类,用于实现服务端系统的管理功能。在设备管理系统中,网络设备的管理与客户的管理都在ManagerServer子类中进行,同时因为网络设备与客户端都可以使用IP和端口来进行唯一识别,因此每句柄数据和每I/O数据使用上文定义的数据结构就可以满足需要。
IOCP模型实现的一个难点在于资源的释放,因为套接字可以同时进行发送和接收操作,也就是系统后台在同一个套接字上可能同时存在两个重叠操作,而应用程序无法预知这些重叠操作什么时候能够完成,因此资源释放的时间点往往难以把握。针对这个问题,作者使用资源池加引用计数来解决。首先看资源池,为每句柄数据和每I/O数据各创建一个资源池,并且预分配一定数量的资源,当应用程序请求每句柄数据或者每I/O数据的时候,就从对应的资源池中获取一个空闲的资源,同时该资源状态变为非空闲,如果资源池中已经没有任何空闲的资源,则重新分配预定义数量的资源来供给;当应用程序释放每句柄数据或者每I/O数据的时候,并不真正地释放其所占用的内存和系统资源,而是将它放回对应的资源池中并重新标记为空闲状态,以便下一次重新分配使用。资源池的使用使得对每句柄数据和每I/O数据的管理和跟踪更加便利,同时因为使用了预分配内存的方式,大大减少了内存分配和释放所带来的运行开销。资源池起到了管理的作用,但是真正的难题---资源释放的时机还是没能解决,这就需要用到引用计数机制。对于任何一个每句柄数据和每I/O数据,都有一个引用计数值,默认为0,在该资源被分配和每一次使用之前,该引用计数值都必须加1,当应用程序请求释放资源的时候,不是立即进行释放动作,而是首先将引用计数值减1,然后判断该值是否为0,如果不为0,说明该资源仍然在程序的其他地方被使用,不能进行回收释放,如果为0,则说明该资源已不再被使用,可以安全地回收释放。这就解决了资源释放时机的问题,只需要在应用程序认为应该释放的所有地方都进行释放请求,剩下的问题引用计数将帮我们全部解决。
因为在设备管理系统中设备与客户都在ManagerServer中进行管理,所以需要2个列表来进行保存,在这里使用的是STL中的map数据结构,其内部是以红黑树来实现的,其根据关键字搜索的时间复杂度为O(lgN),当设备或者客户数量比较大的时候,得到的效率提升是相当显着的。设备管理系统中的关键字就是设备与客户的IP地址,当接收到一个完成通知时,首先根据发出完成通知的对象的IP地址,分别在2个列表中进行搜索,以确定是设备还是客户的操作,进而进行相应的处理。
了解更多相关信息,请点击设备管理系统,或拨打 进行咨询。
