Reactor模式和Proactor模式

Reactor模式,也叫做Dispatcher模式

使用IO多路复用解决系统资源浪费的问题,Reactor会监听事件,根据事件类型来调用相应的代码进行处理。核心组成部分包括Reactor和处理资源池(可以使进程池或者线程池),Reactor负责监听和分配事件,处理资源池负责处理事件。

可以在Reactor和资源池的数量上进行变化,也就是说,会有以下三种方案

1. 单Reactor单进程/线程

单Reactor单线程

Reactor通过select监控连接事件,收到事件后通过dispatch进行分发,如果是连接建立的事件,则交给Acceptor处理,否则会调用Handler进行处理。

优点:没有进程间通信,进程竞争,都在一个进程内完成。缺点:只有一个进程,无法发挥多核CPU优势,handler在处理业务时,整个进程无法处理其他连接的事件,性能瓶颈严重。

Redis采用这种方法,因为每个操作都非常快结束

2. 单Reactor多进程/线程


单Reactor多线程

Reactor监听连接建立事件,handler只负责读写操作,业务处理交给子线程processor完成,process完成后将结果交给handler,handler写入结果。

优点:能发挥多核CPU的处理能力。缺点:多线程数据共享和访问比较复杂,Reactor监听所有事件,并且只在主线程中运行,瞬间高并发时会成为性能瓶颈

3. 多Reactor多进程/线程


多Reactor多进程/线程

主Reactor只处理连接事件的建立,然后把连接交给子进程Reactor进行监听,子进程创建handler进行完整业务处理。

优点:主Reactor和子Reactor职责明确,交互简单,子进程之间不需要共享同步之类的处理。

Nginx采用的就是多Reactor多进程,Memcache和Netty用的是多Reactor多线程


Proactor

Reactor是非阻塞同步网络模型,因为真正的read和send操作都需要用户进程同步操作。这里的同步指的是用户进程在执行read和send之类IO操作的时候是同步的,如果把IO操作改为异步的就能够进一步提升性能,这就是异步网络模型Proactor。


Proactor模型

1. Proactor Initiator创建Proactor和Handler,并将Proactor和Handler都通过Asynchronous Operation Processor注册到内核。

2. Asynchronous Operation Processor 负责处理注册请求,完成IO操作

3. Asynchronous Operation Process 完成IO操作后通知Proactor

4. Proactor根据不同的事件类型回调不同的handler进行业务处理

5. Handler完成业务处理,Handler也可以主责新的Handler到内核进程

理论上Proactor比Reactor效率要高一些,异步I/O能够充分利用DMA(直接存储器访问)特性,让I/O操作与计算重叠,但要实现真正的异步I/O,操作系统需要做大量的工作。目前Windows下通过IOCP实现了真正的异步I/O,而在Linux系统下的AIO并不完善,因此在Linux下实现高并发网络编程时都是以Reactor模式为主。所以即使Boost.Asio号称实现了Proactor模型,其实它在Windows下采用IOCP,而在Linux下是用Reactor模式(采用epoll)模拟出来的异步模型。

你可能感兴趣的:(Reactor模式和Proactor模式)