Reactor模式Proactor模式

1.Reactor/Dispatcher模式

1.1 概述

Reactor模式下,服务端的构成为Reactor + 处理资源池。其中,Reactor负责监听和分发事件,而处理资源池则负责处理事件。
该模式下的组合方案有下面几种(第三种几乎没有被实际应用):

  1. 1 * Reactor + 1 * Worker。
  2. 1 * Reactor + n * Worker。
  3. n * Reactor + 1 * Worker
  4. n * Reactor + n * Worker。

注:Worker是指负责处理事件的工作进程/线程。

n * Reactor + 1 * Worker 没有应用的原因(类比Redis为什么始终坚持单线程处理(执行)指令的原因):

  1. 复杂且没有性能优势。
    1. 复杂:多个Reactor去接收用户请求,这就需要处理好线程并发问题。
    2. 没有性能优势:多线程并发,如果是在单核上,可能会面临频繁的线程上下文切换,开销较大。其次,由于我们基本上是在内存中进行请求接收的,因此主要的瓶颈不在于线程数量而在于网络时延&带宽。
  2. 多个reactor去负责接待请求,而真正服务请求的时候确实串行的,你不觉得?。。。

1.2 实现方式

1.2.1 1 * Reactor + 1 * Worker

1.2.1.1 概述


该模式下的三种角色:

  • reactor:负责监听和分发事件。
  • acceptor:获取连接。
  • handler:处理事件。

执行流程

  1. reactor通过select系统调用持续监听IO事件,若监听到有事件发生,则根据事件类型进行分情况处理:
    1. 若为连接事件:则将该事件**分发(dispatch)**给acceptor处理,acceptor在收到该事件后,会通过accept系统调用新建一个连接并同时创建一个handler来处理后续的事件。
    2. 若不是连接事件:则交由handler进行事件处理。
1.2.1.2 评估
  • 该方案不适用于计算密集型场景,仅适用于业务耗时短的场景。
  • 由于全程采用单进程/线程监听&处理任务,因此无法充分利用多核CPU的性能。而且,一旦事件消费的过程中,某个事件的消费耗时特别长,它将影响到后续事件的响应,一般体现在延迟的增加方面。

C语言编写的服务端程序,其模式为1 * Reactor + 1 * 进程,而Java的则是1 * Reactor + 1 * 线程(JVM是一个进程,你所写好的Java程序是其中的一个线程)。
Redis 6.0- 采用的是1 * Reactor + 1 * 进程

1.2.2 1 * Reactor + n * Worker

1.2.2.1 概述


与前面不同的是:
handler不在负责事件的处理,而是负责数据的接收与发送。
handler在通过read系统调用拿到数据后,会将其转交给子线程中的processor进行处理,然后processor处理完成后,再将处理好的数据返回给handlerhandler再通过send系统调用将结果发回客户端。

1.2.2.2 评估
  • 该方案能够充分利用多核CPU的性能。
  • 由于该方案采用多进程/线程来进行事件的处理,因此需要注意在多线程环境下的共享数据的安全问题,而这实现起来,因此该方案较前者复杂一些。
  • 需要注意在高并发环境下,1个reactor可能会成为性能瓶颈的隐患。

1.2.3 n * Reactor + n * Worker

1.2.3.1 概述


与前面不同的是:
handler又再次负责事件的处理了。
对于新的连接事件,将首先分发给acceptor,然后acceptor创建出一个连接来,并将其分发给众多子线程中的其中一个线程。
被选中的这个线程中的reactor将通过select系统调用对该连接进行持续监听,一旦监听到有IO事件发生,便分发给该线程所对应的handler去处理…(后续处理过程一样的)

1.2.3.2 评估
  • 消除了单reactor所带来的潜在的性能瓶颈隐患。
  • 该方案看上去比前者复杂,其实其结构是清晰的,实施起来是简单的:
    • 主线程、子线程分工明确,主线程负责接收新连接,子线程负责事件处理。
    • 不必为主线程与子线程之间的通信而感到苦恼,因为数据流是由主线的单向流动到子线程中,即在子线程拿到新连接,监听并处理好一个IO事件后,不必将数据再返回给主线程,而是直接由子线程自己返回给客户端。

Netty、Memcache、Nginx均采用了此方案。
Nginx的方案与上面的并不完全相同,它选择去掉主线程部分,即连接的接收可以由每个子线程来完成。

2.Proactor模式

2.1 概述


执行流程:

  1. 进程通过Proactor Initiator借助Asynchronous Operatio Processor注册proactorhandler到内核上。
  2. 后面将由Asynchronous Operatio Processor 负责请求的接收与IO操作,一旦接收到IO事件,它将自动进行IO操作,当IO完成后,它将通知Proactor,然后Proactor再根据具体的事件类型回调handler进行处理。

2.2 评估

  • 实现了异步I/O,即数据的准备和由内核拷贝至用户缓冲区的过程均无需用户进程(或者CPU)参与。

目前仅有Windows系统平台完全实现系统级别下的了异步I/O——IOCP
Linux平台尽管也有POSIX定义的异步IO接口aio函数,但它是用户层面的实现,而且仅支持本地文件的异步IO操作,不支持网络I/O。但是,在Linux 5.1之后,又引入io_uring异步I/O操作接口,它绝对是一个实打实的系统基本的实现,并且也可以用于网络I/O,并且它无需中断即可实现I/O操作,非常惊艳。

3.两种模式的对比

  • reactor模式下,reactor所感知到的事件是待完成的I/O事件,后续handler处理需要先把数据由内核缓存拷贝至用户缓冲区中才能继续处理事件,这种I/O模式属于非阻塞式I/O同步I/O
  • proactor模式下,proactor所感知到的事件是已完成的I/O事件,即不需要handler再去拷贝数据了,而是直接去处理事件,这种I/O模式属于非阻塞式I/O异步I/O,效率更高。

参考文档

9.3 高性能网络模式:Reactor 和 Proactor


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞,这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说,开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

APM2.8下载固件的方法(两种办法详解)

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口,不要选择auto,如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意:烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

Ubuntu Nvidia Docker单机多卡环境配置

ubuntu版本是22.04,现在最新版本是24.xx,截止当前,Nvidia的驱动最高还是22.04版本,不建议更新至最新版本。本部分是从0开始安装Nvidia docker的记录,若已安装Nvdia驱动,请直接跳至3。 1、更新软件软件列表…

【软件设计师】网络安全

1.网络安全基础信息 网络安全的五个基本要素: 机密性:确保信息不暴露给未授权的实体或进程 完整性:只有得到允许的人才能修改数据,并且能判断出数据是否已被修改 可用性:得到授权的实体在需要时可以访问数据&#xff0…

Laravel和ThinkPHP框架比较

一、开发体验与易用性比较 1. 代码可读性: - Laravel以其优雅的语法和良好的代码结构著称,使得代码更加易读易懂。 - 相比之下,ThinkPHP的代码可读性较为一般,在一些复杂业务场景下,可能会稍显混乱。 让您能够一站式…

【动手学PaddleX】谁都能学会的基于迁移学习的老人摔倒目标检测

本项目使用PaddleX搭建目标检测模块,在一个精选的数据集上进行初步训练,并在另一个老年人跌倒检测的数据集上进行参数微调,实现了迁移学习的目标检测项目。 1.项目介绍 迁移学习是非常有用的方法,在实际生活中由于场景多样&…

[大师C语言(第十三篇)]C语言排序算法比较与技术详解

引言 排序算法是计算机科学中最基础且重要的内容之一。在数据处理、数据库索引、搜索算法等多个领域都有广泛的应用。C语言作为一种高效、底层的编程语言,被广泛用于实现各种排序算法。本文将深入探讨几种常用的排序算法,包括冒泡排序、选择排序和插入排…

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上(2024年5月20日至23日),杰出化合物半导体材料企业Brewer Science,将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲,定于五月二十一日星…

Fastjson 的 JSONObject 类

在fastjson中 JSONObject类有许多常用的方法用于操作 JSON 对象,下面我们一起了解一下。 1、put(String key, Object value) 用途:在 JSONObject 对象中设置键值对。如果键已存在,则更新其值。示例: JSONObject jsonObject ne…

【Java面试】五、MySQL篇(下)

文章目录 1、事务的特性2、并发事务问题3、事务的隔离级别4、undo log 和 redo log4.1 底层结构4.2 redo log4.3 undo log 5、MVCC5.1 隐式字段5.2 undo log 版本链5.3 ReadView5.4 ReadView的匹配规则实现事务隔离 6、MySQL的主从同步原理7、分库分表7.1 垂直分库7.2 垂直分表…

stm32启动文件

启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作: 初始化堆栈指针SP_initial_sp 初始化PC指针Reset_Handler 初始化中断向量表 配置系统时钟 调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界 …

js内置对象和对象方法

内置对象(Math) Math.PI 表示圆周率 console.log(Math.PI); // 3.141592653589793 Math.abs()可以用来计算一个数的绝对值 console.log(Math.abs(-3)); // 3 Math.ceil() 可以用来对一个数向上取整,小数位只要有值,就自动进1…

linux下使用cmake-gui编译WXQT

一.编译环境 操作系统:Ubuntu 22.04.3 LTS wxWidgets源码:wxWidgets-3.1.5 编译工具:CMake-gui qt版本:5.13.2 二.编译步骤 1.将源码解压。 2.打开CMake-gui,并设置好源码目录和构建目录 3.点击configure 会弹出…

图解操作系统学习笔记

1、一些系统命令 学习图解操作系统的时候,其中提供了一些查看系统状态的命令,这里做一下笔记,记录一下。 1、strace 查看和记录一个进程的系统调用和信号传递的详细过程 # 查看和记录一个进程的系统调用和信号传递的详细过程 strace -p <pid> # 读取某个命令的系统…

C++模板使用

文章目录 目录 文章目录 前言 一、交换函数(泛型编程) 二、函数模板 2.1 函数模板概念 2.2函数模板格式 2.3使用方法 2.4 函数模板的原理 2.4.1库中的swap 2.5 函数模板的实例化 2.6 模板参数的匹配原则 三、类模板 3.1 类模板的定义格式 3.2类模板声明和定义分离 前言 C语言阶…

前端面试题日常练-day29 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 在Vue中&#xff0c;以下哪个选项用于监听用户的输入事件&#xff1f; a) v-on:input b) v-model c) v-bind d) v-show 2. Vue中&#xff0c;以下哪个选项用于为异步操作提供更好的错误处理机…

数据仓库——分层原理

目录 一、什么是数据仓库 二、数仓建模的意义&#xff0c;为什么要对数据仓库分层&#xff1f; 三、ETL 四、技术架构 五、数仓分层架构 数仓逻辑分层 1、数据引入层&#xff08;ODS&#xff0c;Operational Data Store&#xff0c;又称数据基础层&#xff09;&#xff…

解决 WooCommerce 的分析报表失效问题

今天明月的一个境外电商客户反应网站的 WooCommerce 分析报表已经十多天没有更新了&#xff0c;明明每天都有订单交易可分析报表里的数据依旧是十多天前的&#xff0c;好像更新完全停滞了似的。明月也及时的查看了后台的所有设置&#xff0c;确认没有任何问题&#xff0c;WooCo…

机器学习:在Python中sklearn库的使用,纯干货!12个小时的整理!

无监督学习是在没有标签的数据上训练的。其主要目的可能包括聚类、降维、生成模型等。 以下是 6 个重要的无监督学习算法&#xff0c;这些算法都可以通过使用sklearn&#xff08;Scikit-learn&#xff09;库在Python中很好地处理&#xff1a; 目录 K-Means 聚类 层次聚类 …

Android刮刮卡自定义控件

效果图 刮刮卡自定义控件 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import …