首先,我们先了解一下什么是 Reactor 模式和 Proactor 模式。
什么是 Reactor 模式和 Proactor 模式?
Reactor 模式
Reactor 模式是指主线程负责监听和分发事件,工作线程负责 I/O 以及业务处理。
Proactor 模式
Proactor 模式是指主线程负责监听、分发事件以及 I/O 操作,工作线程只负责业务处理。
为什么会分为这两种事件处理模式?
我们都知道 Proactor 和 Reactor 都是 I/O 复用的两种解决方案,他们的最主要的区别在于 Reactor 是同步 I/O,Proactor 是异步 I/O。
那什么是同步 I/O,什么是异步 I/O?
同步 I/O是指用户进程发起一个 I/O 操作后,需要等待数据从内核态拷贝到用户程序的缓冲区,这个过程中用户程序始终在同步的等待着 I/O 的完成。
而异步 I/O是指用户进程发起一个 I/O 操作后,无需等待内核完成数据拷贝,待 I/O 完成时,内核会通知用户程序 I/O 完成。
为什么 Proactor 比 Reactor 模式更优?
我们先来理一下 Reactor 模式和 Proactor 模式。
Reactor 模式是同步 I/O 模型,所以用户进程在进行 I/O 操作时需要等待 I/O 操作完成,只有当前事件 I/O 操作完成后才能进行处理其他事件。
Proactor 模式是异步 I/O 模型,所以用户进程无需等待内核 I/O 操作,省出来的时间可以处理其他事件。待内核 I/O 完成后内核通知用户进程再对当前事件进行后续处理。由于 Proactor 模式相比 Reactor 模式节省了 I/O 等待时间,所以 Proactor 模式会比 Reactor 更优。
如何优化?
对 Reactor 模式来说,性能瓶颈在于 I/O 操作占用进程资源,故可使用线程池来解决相应问题。而使用线程池之后由于只有主进程进行事件的监听转发,在面对高并发的场景时也容易遇到性能瓶颈。这时可以使用多进程来对事件进行监听转发,也就是多 Reactor、多线程模型。
对 Proactor 模式来说,性能瓶颈就不再是 I/O 时间,而是业务逻辑操作,所以此时可以使用线程池处理多个事件的业务逻辑。
相关:
[1] 如何深刻理解 Reactor 和 Proactor?
[2] Proactor 与 Reactor
[3] 最新版 Web 服务器项目详解 - 02 半同步半反应堆线程池(上)