我对IO事件驱动模型(Reactor模式)的理解

Reactor事件处理方式图:
图一

图二

Reactor模块图:

Handle:即操作系统中的句柄,是对资源在操作系统层面上的一种抽象,它可以是打开的文件、一个连接(Socket)、Timer等。由于Reactor模式一般使用在网络编程中,因而这里一般指Socket Handle,即一个网络连接(Connection,在Java NIO中的Channel)。这个Channel注册到Synchronous Event Demultiplexer中,以监听Handle中发生的事件,对ServerSocketChannnel可以是CONNECT事件,对SocketChannel可以是READ、WRITE、CLOSE事件等。
Synchronous Event Demultiplexer:阻塞等待一系列的Handle中的事件到来,如果阻塞等待返回,即表示在返回的Handle中可以不阻塞的执行返回的事件类型。这个模块一般使用操作系统的select来实现。在Java NIO中用Selector来封装,当Selector.select()返回时,可以调用Selector的selectedKeys()方法获取Set,一个SelectionKey表达一个有事件发生的Channel以及该Channel上的事件类型。上图的“Synchronous Event Demultiplexer ---notifies--> Handle”的流程如果是对的,那内部实现应该是select()方法在事件到来后会先设置Handle的状态,然后返回。不了解内部实现机制,因而保留原图。
Initiation Dispatcher:用于管理Event Handler,即EventHandler的容器,用以注册、移除EventHandler等;另外,它还作为Reactor模式的入口调用Synchronous Event Demultiplexer的select方法以阻塞等待事件返回,当阻塞等待返回时,根据事件发生的Handle将其分发给对应的Event Handler处理,即回调EventHandler中的handle_event()方法。
Event Handler:定义事件处理方法:handle_event(),以供InitiationDispatcher回调使用。
Concrete Event Handler:事件EventHandler接口,实现特定事件处理逻辑。

个人理解:
reactor就是一种处理事件的设计思想。
简单描述一下:
Handle就是事件,事件可以理解为句柄事件,或者叫文件描述符事件;
Initiation Dispatcher其实就是注册事件的模块;
Synchronous Event Demultiplexer就是注册好事件后,阻塞监听等待事件发生,某个事件发生后唤醒对应事件;
Event Handler就是当相应的事件发生之后,调用相应事件的处理方法;
Concrete Event Handler就是被调用的具体的事件处理方法。
假设现在用epoll实现一个处理网络事件的reactor模型。
Handle就是网络套接字的连接请求或者读写请求事件。Initiation Dispatcher的功能就是epoll_ctl完成的功能。Synchronous Event Demultiplexer阻塞监听过程就是epoll_wait的过程。Event Handler就是用来调用回调函数的,根据Handle是连接请求事件还是读写请求事件,Event Handler调用对应的回调函数进行处理。Concrete Event Handler就是作为回调函数注册在Event Handler上的,也就是回调函数,负责具体的业务。

其实Reactor的内容很简单,不知道为什么被描述的那么复杂?或者是我理解的有问题?茫然。

参考文章:http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html

posted @ 2021-10-22 16:56  一只小菜菜鸟  阅读(124)  评论(0)    收藏  举报