Reactor 和 Proactor

什么是阻塞同步 / 非阻塞同步 / 非阻塞异步

  • IO操作分为两个步骤:1. 等待数据准备好(读取到内核缓存) 2. 将数据从内核读取到用户空间(进程空间);一般来说步骤1花费的时间远远大于步骤2。

    • 阻塞同步: 1上阻塞 2上也阻塞
    • 非阻塞同步:1上阻塞,2上不阻塞
    • 非阻塞异步:1上不阻塞 2上也不阻塞

什么是 Reactor / Proactor

这俩个东西解的是啥命题:服务器采用的并发模型,即服务器如何管理连接,以及服务器如何处理请求

以上说的都跟操作系统的IO模型以及进程模型有关

  • IO模型:阻塞 非阻塞 同步 异步
  • 进程模型:单进程 多进程 多线程

Reactor

PPC(Process Per Connection)模式的缺点:每个连接一个进程,连接结束后进程销毁,浪费资源。解决-> : 资源复用。不再为每个连接分配进程,采用进程池,将连接分配给进程,一个进程可以处理多个连接。

引入资源池后,一个新的问题:进程怎么高效的处理多个连接的业务。一般,连接的处理过程是:read -> 业务处理 -> write;在一个进程管理多个连接的场景下,如果进程阻塞在一个连接的read上,即使别的连接有数据可读,也不可能处理别的请求,显然是不合理的。所以解决方式是: 只有连接上有数据的时候进程才去处理,这就是IO多路复用技术的来源

IO多路复用(处理请求的方式) + 资源池(管理连接的方式) = Reactor。 该模式核心实体:Reactor和资源池,模式:

  • 单Reactor单进程

Redis是此模式。此模式适用于业务处理非常快的场景

  • 单Reactor多线程
  • 多Reactor多进程/线程

Reactor是 非阻塞同步的,Proactor是非阻塞异步的;Reactor可以理解为“有事件时,我通知你,你来处理;Proactor是来了事件我来处理,处理完了通知你”。“我”是操作系统内核,事件是:有新连接,有数据可读,有数据可写,“你”是我们的程序代码

NIO 是 Reactor模式;AIO是 Proactor模式

打个比方,餐厅点菜:

  • 柜台点了菜后,在那儿等着。就是阻塞同步;
  • 柜台点了菜后,回到餐桌后,菜好了后,通知你来取。就是Reactor模式;(有事件时,我通知你,你来处理)
  • 柜台点了菜后,回到餐桌后,该干嘛干嘛,菜好了后,给你端上来,你只负责吃就好了,就是Proactor模式(来了事件我来处理,处理完了通知你,“吃”就是业务代码)

案例

消息中间件是什么模式

单Reactor 多线程;中间件一般连接数固定,请求量较大;单reactor来管理就好了,多线程处理请求

Redis是什么模式

单Reactor 单进程/线程

什么是 select / epoll

可以这么理解:select / epoll是IO多路复用的具体实现,都是同步IO。
https://www.cnblogs.com/jeakeven/p/5435916.html