1 Reactor的组成
![](https://img.haomeiwen.com/i207235/7a4d34f58c7c60d0.png)
由图可以看到,Reactor的几个关键组成部分:
- Dispacther:事件分发器,负责handle的注册注销,事件的处理
- Handle:文件句柄,内核监控的对象
- IO Multiplexer:IO复用器,实现同时处理多个IO流的关键。常见的复用器有select,epoll,kqueue,poll等等。
- Event Handler:事件处理句柄集合,每个文件句柄都对应一个句柄。
2 时序图
3 Reactor多线程模型
Reactor模型最常使用的场景就是网络服务器。
网络服务器的基本处理模型如下:建立连接->读取请求->解析请求->处理服务->编码结果->返回结果。
基于网络服务器的基本模型,Reactor衍生出了几种多线程模型。
3.1 单线程模型
特点:将网络服务器的所有步骤都在Reactor的主线程内处理。
优点:模型简单,编码容易。
缺点:性能不够高,如果主线程先在处理请求阶段,容易导致后续的请求无法继续响应。
适用场景:EventHandler业务逻辑简单,执行时间短,不需要访问数据库,不需要访问磁盘、不需要访问外部网元、不需要阻塞等待其它资源。
3.2 ThreadPool模型
特点:将服务器处理模型分为两个阶段:IO操作阶段和非IO操作阶段。IO操作阶段交给Dispatcher来做,非IO操作阶段采用线程池来处理
优点:单个句柄请求处理阻塞也不会影响其它句柄。
缺点:编程模型更加复杂,多线程切换增加开销。
适用场景:EventHandler处理时间不定,需要阻塞等待或者耗时很长。
3.3 主从Reactor模型
特点:将连接请求句柄和数据传输句柄分开处理,使用单独的Reactor来处理连接请求句柄,提高数据传送句柄的处理能力。
适用场景:高并发
网友评论