Reactor模式:
Reactor包含如下角色:
• Handle 句柄;用来标识socket连接或是打开文件;
• Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)
• Event Handler:事件处理接口
• Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;
• Reactor:反应器,定义一个接口,实现以下功能:
1)供应用程序注册和删除关注的事件句柄;
2)运行事件循环;
3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;
Proactor模式:
Proactor主动器模式包含如下角色
• Handle 句柄;用来标识socket连接或是打开文件;
• Asynchronous Operation Processor:异步操作处理器;负责执行异步操作,一般由操作系统内核实现;
• Asynchronous Operation:异步操作
• Completion Event Queue:完成事件队列;异步操作完成的结果放到队列中等待后续使用
• Proactor:主动器;为应用程序进程提供事件循环;从完成事件队列中取出异步操作的结果,分发调用相应的后续处理逻辑;
• Completion Handler:完成事件接口;一般是由回调函数组成的接口;
• Concrete Completion Handler:完成事件处理逻辑;实现接口定义特定的应用处理逻辑;
优点
Reactor实现相对简单,对于耗时短的处理场景处理高效;
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,
Proactor性能更高,能够处理耗时长的并发场景;
缺点
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;
Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现;
适用场景
Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序; Proactor:异步接收和同时处理多个服务请求的事件驱动程序;
Disadvantages
— Program complexity.
It is more difficult to develop applications using asynchronous mechanisms due to the separation in time and space between operation initiation and completion. Applications may also be harder to debug due to the inverted flow of control.
— Memory usage.
Buffer space must be committed for the duration of a read or write operation, which may continue indefinitely, and a separate buffer is required for each concurrent operation. The Reactor pattern, on the other hand, does not require buffer space until a socket is ready for reading or writing