美文网首页
Reactor模型/Proactor模型

Reactor模型/Proactor模型

作者: 九楼记 | 来源:发表于2022-03-18 23:38 被阅读0次

先明白基本概念:

  • 同步/异步:区别在于返回结果有没有立即返回。
  • 阻塞/非阻塞:区别在于进程/线程有没有挂起。

传统IO阻塞模型

模型特点

  • 采用阻塞 IO 模式获取输入的数据
  • 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回

问题

  • 当并发数很大,就会创建大量的线程,占用很大系统资源
  • 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在 read 操作,造成线程资源浪费

解决方法:
第一种:IO多路复用,多个事件阻塞在一个进程/线程中

Reactor模式

也叫 Dispatcher 模式。
I/O 多了复用统一监听事件,收到事件后分发(Dispatch 给某进程),是编写高性能网络服务器的必备技术之一。

单reactor单线程

方案说明:

  • Select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通过一个阻塞对象监听多路连接请求

  • Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发

  • 如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理

  • 如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler 来响应

  • Handler 会完成 Read→ 业务处理 →Send 的完整业务流程

多reactor多线程

注意:建立连接和socket里有数据可写可读都是一个就绪事件。

方案详细说明如下:

  • 父进程中mainReactor对象通过select监控连接建立事件,收到事件后通过Acceptor接收,将新的连接分配给某个子进程。
  • 子进程的subReactor将mainReactor分配的连接加入连接队列进行监听,并创建一个Handler用于处理连接的各种事件。
  • 当有新的事件发生时,subReactor会调用连接对应的Handler(即第2步中创建的Handler)来进行响应。
  • Handler完成read→业务处理→send的完整业务流程。

多Reactor多进程/线程的方案看起来比单Reactor多线程要复杂,但实际实现时反而更加简单,主要原因是:

  • 父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理。
  • 父进程和子进程的交互很简单,父进程只需要把新连接传给子进程,子进程无须返回数据。
  • 子进程之间是互相独立的,无须同步共享之类的处理(这里仅限于网络模型相关的select、read、send等无须同步共享,“业务处理”还是有可能需要同步共享的)。

目前著名的开源系统Nginx采用的是多Reactor多进程,采用多Reactor多线程的实现有Memcache和Netty。

Proactor

Reactor是非阻塞同步网络模型,因为真正的read和send操作都需要用户进程同步操作。这里的“同步”指用户进程在执行read和send这类I/O操作的时候是同步的,如果把I/O操作改为异步就能够进一步提升性能,这就是异步网络模型Proactor。

Reactor可以理解为“来了事件我通知你,你来处理”,而Proactor可以理解为“来了事件我来处理,处理完了我通知你”。这里的“我”就是操作系统内核,“事件”就是有新连接、有数据可读、有数据可写的这些I/O事件,“你”就是我们的程序代码。

Reactor实现了一个被动的事件分离和分发模型,服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应;
Proactor实现了一个主动的事件分离和分发模型;这种设计允许多个任务并发的执行,从而提高吞吐量。
所以涉及到文件I/O或耗时I/O可以使用Proactor模式,或使用多线程模拟实现异步I/O的方式。

Reference

https://zhuanlan.zhihu.com/p/95662364
https://ld246.com/article/1594887244486
https://leeshengis.com/archives/8805
https://cloud.tencent.com/developer/article/1769945
[1] https://www.cnblogs.com/goodcandle/archive/2005/12/10/294652.html
[2] https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

相关文章

  • Reactor 模式

    【未完待续】 参考 两种高效的服务器设计模型:Reactor和Proactor模型reactor和proactor...

  • 彻底搞懂Reactor模型和Proactor模型

    在高性能的I/O设计中,有两个著名的模型:Reactor模型和Proactor模型,其中Reactor模型用于同步...

  • Reactor模型/Proactor模型

    先明白基本概念: 同步/异步:区别在于返回结果有没有立即返回。 阻塞/非阻塞:区别在于进程/线程有没有挂起。 传统...

  • actor、reactor与proactor模型

    actor、reactor与proactor模型:高性能服务器的几种模型概念。 actor模型: 实体之通过消息通...

  • actor reactor proactor模型

    actor、reactor与proactor模型:高性能服务器的几种模型概念。 actor模型: 实体之通过消息通...

  • Netty浅析

    IO模型 IO多路复用模式:Reactor、Proactor NIO实现的是Reactor模式。通过select、...

  • Reactor和Proactor对比

    常见的IO事件处理模型有两种:Reactor和Proactor。Redis中的ae就是采用的Reactor事件处理...

  • Proactor和Reactor模型

    随着网络设计模式的兴起,Reactor和Proactor事件处理模式应运而生。同步I/O模型通常用于实现React...

  • I/O模型之三: I/O 设计模式 Reactor

    平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由...

  • Reactor线程模型【原理笔记】

    前言 Reactor模型是基于事件驱动的线程模型,可以分为Reactor单线程模型、Reactor多线程模型、主从...

网友评论

      本文标题:Reactor模型/Proactor模型

      本文链接:https://www.haomeiwen.com/subject/kvtgdrtx.html