Songqian Li's Blog

去历史上留点故事

首先,我们先了解一下什么是 Reactor 模式和 Proactor 模式。

什么是 Reactor 模式和 Proactor 模式?

Reactor 模式

Reactor 模式是指主线程负责监听和分发事件,工作线程负责 I/O 以及业务处理。
image.png

Proactor 模式

Proactor 模式是指主线程负责监听、分发事件以及 I/O 操作,工作线程只负责业务处理。
image.png

为什么会分为这两种事件处理模式?

我们都知道 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 半同步半反应堆线程池(上)

相关文章
评论
分享
  • 右值引用

    本文整理自《modeln C++ Tutorial:C++11/14/17/20》 右值引用是 C11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C 中大 量的历史遗留问题,消除了诸如 std::vecto...

    右值引用
  • 容易忽视的C++知识

    格式化输出的执行顺序 由于 C 语言参数压栈顺序是从右往左,所以 printf 和 cout 函数在执行时是从右往左读入缓冲区,然后从左往右输出。 右值引用和左值引用 C++一共有三种基本值类型: 左值(lvalue), 纯右值...

    容易忽视的C++知识
  • 循序渐进实现C++的单例模式

    注:本文引自:https://guodong.plus/2020/0529-002048/ v1.0——基本实现 12345678910111213class Singleton { public: static S...

    循序渐进实现C++的单例模式
  • CentOS下安装Redis

    准备 CentOS Linux release 7.2 gcc 编译器 yum install gcc-c++ TCL yum install -y tcl redis 安装包 4.0.8 版本 安装 下载 redis 安装...

    CentOS下安装Redis
  • CentOS6下yum修复及python安装

    CentOS6 中自带的 yum 依赖的 python 版本是 2.6.6 版本,而 python core team 已不再提供支持,且 pip 至少要求 2.7 版本,因此系统上应该有 2.6,2.7 两个版本的 python 并...

    CentOS6下yum修复及python安装
  • 《操作系统真象还原》:第十章 输入输出系统

    上一章中我们遇到的字符混乱和 GP 异常问题,根本原因是由于临界区代码的资源竞争,这需要一些互斥的方法来保证操作的原子性。 10.1 同步机制——锁 10.1.1 排查 GP 异常,理解原子操作 多线程执行刷屏时光标值越界导致...

    《操作系统真象还原》:第十章 输入输出系统
  • 《操作系统真象还原》:第九章 线程

    线程和进程将分两部分实现,本章先讲解线程。 9.1 实现内核线程 9.1.1 执行流 在处理器数量不变的情况下,多任务操作系统采用多道程序设计的方式,使处理器在所有任务之间来回切换,这称为“伪并行”,由操作系统中的任务调度器决定当...

    《操作系统真象还原》:第九章 线程
  • GPU虚拟化

    用户层虚拟化 本地 API 拦截和 API formwarding 在用户态实现一个函数库,假设叫 libwrapper, 它要实现底层库的所有 API; 让 APP 调用这个 libwrapper。如何做? libwrap...

    GPU虚拟化
  • 硬件虚拟化

    硬件虚拟化介绍 硬件虚拟化要做的事情 体系结构支持 体系结构 实现功能 作用 模式切换 Host CPU <-> Guest CPU 切换 CPU 资源隔离 二阶段地址转换 GVA-> GPA...

    硬件虚拟化
  • 《操作系统真象还原》:第八章 内存管理系统

    8.1 makefile 简介 这部分可参考阮一峰的讲解:https://www.ruanyifeng.com/blog/2015/02/make.html 8.1.1 makefile 是什么 makefile 是 Linu...

    《操作系统真象还原》:第八章 内存管理系统