Reactor & Proactor

总结常见的两种网络模型设计模式Reactor和Proactor。

网络模型

在网络模型设计中,有两个的高性能模型:ReactorProactor

这里会涉及到同步/异步阻塞/非阻塞两个知识点。

同步/异步:应用程序和系统内核之间交互(通信)方式,主动监听还是被动通知。

select/poll/epoll都需要用户程序不断轮询检查IO操作是否就绪,所以它们都属于同步IO

Boost.Asio通过对epoll的二次封装实现了异步IO,WIN下的IOCP同样也属于异步IO

阻塞/非阻塞:用户进程执行IO操作后如何等待调用结果。

进程挂起等待属于阻塞,进程直接返回等待下次重试属于非阻塞

Reactor

Reactor属于同步非阻塞模型。

同步:同步监听,需要用户端主动监听IO就绪状态。

非阻塞:用户进程执行IO操作后不会导致用户进程的挂起,会通过重试的方式来尝试获取执行结果。

Reactor模型中,主要分为AcceptorReactorHandler三个主要组件。

  • Acceptor:获取客户端链接,绑定客户端注册事件。
  • Reactor:监控触发的事件,并分发给对应的事件处理器。
  • Handler:处理对应的事件请求,例如,读写处理器、加解密处理器、命令执行处理器等。

Reactor组件是模型中的关键组件(也是和Proactor的不同之处),包括以下两部分:

  • 通过不断轮询select/epoll来监听准备就绪的事件;
  • 通过Dispatch来分发事件到对应的时间处理器。

Reactor中的读和写是由应用程序来决定何时操作的。

Reactor模型的实现方式:单Reactor单处理器单Reactor多处理器多Reactor多处理器

单Reactor单处理器

单Reactor单处理器也就是简单的单线程模型。

单Reactor多处理器

单Reactor多处理器是通过处理器多线程化来实现并发能力,但是需要考虑多处理器的并发情况下资源竞争的问题。

多Reactor多处理器

多Reactor多处理器是在单Reactor多处理器的基础之上,分离了Acceptor的能力,并且增加多个子Reactor来实现分而治之的方法。

Proactor

Reactor属于异步非阻塞模型。

异步:异步回调,系统自动回调用户程序通知IO就绪状态。

非阻塞:同Reactor

Proactor模型中,主要分为ProactorProactor InitiatorHandlerAsynchronous Operation Processor四个主要组件。

  • Asynchronous Operation Processor:异步操作处理器,操作系统提供;
  • Proactor Initiator:事件注册器,用于注册事件以及对应的事件处理器;
  • Proactor:用于监听触发的事件,并分发给不同的事件处理器处理;
  • Handler:同Reactor

Proactor中,数据的读写都是由系统内核来实现的,应用程序只是从缓存区上进行读写。

Proactor模型的关键在于系统提供的Asynchronous Operation Processor异步操作处理器。

由于基于缓存区的交互方式,Proactor中的读和写是操作系统来决定何时操作的。

总结

ReactorProactor均为非阻塞I/O模型。

Reactor是同步的(主动查询),Proactor是异步的(被动通知)。

Proactor接收到的是IO操作已完成事件(缓存区),Reactor接收到的是IO操作就绪事件。

参考

彻底搞懂Java的网络IO
Linux 的 IO 通信 以及 Reactor 线程模型浅析