Reactor模型库之boost::asio::io_service与ACE_Reactor

来源:互联网 发布:patternlayout源码 编辑:程序博客网 时间:2024/06/05 15:30
boost::asio::io_service与ACE_Reactor均是应用了Reactor同步IO模型,下面通过类比对这两个库进行学习。

“Reactor模式是处理并发I/O比较常见的一种模式,中心思想就是,将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。

这里有三个重要的组件:

  • 多路复用器:由操作系统提供,在linux上一般是select, poll, epoll等系统调用。
  • 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。
  • 事件处理器:负责处理特定事件的处理函数。

因为这种模型经常使用,所有不少人对简单的系统调用做了一层封装,形成跨平台的事件处理库,比较典型的有:libevent,libev,boost asio、ACE_Reactor等。”(引号部分引用自网页)。


boost::asio::io_service与ACE_Reactor的区别是,后者可以对除io外的事件进行分发处理。


实例说明:使用boost::asio::io_service与boost::asio::deadline_timer实现定时任务:

首先,需要创建的主要角色有:

1、一个主线程,一个子线程(负责运行io_service),一个定时器;

然后,实现步骤如下:

1、定义定时器,定时器与io_service对象绑定,定时器与到时操作方法绑定;

2、创建子线程运行io_service。


后台运行解析:

当定时器时间到时,io_service监控到以后触发与定时器绑定的操作方法。


实例说明:使用ACE_Reactor与ACE_Process_Manage,监控启动进程,进程崩溃后自动重启。

首先,需要创建的主要角色有:
1、一个主进程,一个进程管理器ACE_Process_Manager对象,若干个子进程;
2、继承自ACE_Event_Handler的事件处理器,参数是触发该事件的子进程,主要是进行子进程崩溃后的重启;
3、事件分发器,一般直接使用ACE_Reactor的实例,监控子进程崩溃事件。

然后,实现步骤如下:
1、绑定ACE_Process_Manager对象与ACE_Reactor实例;
2、ACE_Process_Manager对象创建子进程,通过ACE_Process_Manager的register_handler方法,将事件处理器与触发此事件的具体子进程绑定。

后台实现解析:
当子进程崩溃退出时,主进程通过ACE_Reactor监听(同步等待)到以后触发事件处理器,事件处理器回调子进程,进行重启。

由此可见Reactor模型是处理多进程、多线程任务的常用模型之一,根据应用程序与操作系统之间的操作分类,属于同步处理模型。但是如果对io_service或者ACE_Reactor单独创建线程或进程执行,
则对外部主程序来说,则成为异步调用,因此也可以用来构建异步网络程序(这个异步是指客户端与服务端的交互)。(即对该对象 内部是同步的,外部是异步的。)
0 0