经典网络模型

文章目录

  • 网络演变过程
    • 1、阻塞IO(BIO)
      • 实现
      • 缺点
    • 2、非阻塞IO(NIO)
      • 实现
      • 改进后
      • 设置非阻塞IO
      • 缺点
    • 3、IO多路复用第一版(select/poll)
      • 问题点
      • 改进
      • 缺点
    • 4、IO多路复用第二版(epoll)
    • 5、信号驱动IO
      • 区别
      • 缺点
    • 6、异步IO(AIO)
      • 区别
    • 小总结
  • 经典网络模型
    • 1、单Reactor单线程
      • 经典实现
    • 2、单Reactor线程池
    • 3、多Reactor多线程(多进程)
    • 4、Proactor

网络演变过程

linux内核演变:
在这里插入图片描述

1、阻塞IO(BIO)

实现

  • 简单的c/s模型,通常一个client分配一个线程处理(可以使用队列+线程池优化模型)

缺点

  • 并发数量少(线程有限)
  • 线程上下文切换影响性能(可用线程池缓解)

2、非阻塞IO(NIO)

实现

BIO和NIO的区别在于内核中数据尚未就绪时:

  • 阻塞IO一直处于阻塞状态,直到数据就绪并从内核态拷贝到用户态后返回
  • 非阻塞IO直接返回用户态EWOULDBLOCK错误

改进后

可以在一个线程中管理多个client

设置非阻塞IO

  • socket方法创建时候第二个参数type设置SOCK_NONBLOCK
  • fcntl方法第三个参数设置O_NONBLOCK

缺点

需要不断轮训询问内核数据是否就绪,涉及到很多无效的系统调用(system call)

3、IO多路复用第一版(select/poll)

问题点

非阻塞socket不知道什么时候有数据,所以需要主动询问。

改进

  • 每个client都要询问 —> 批量询问(系统调用次数 O(n) —> O(1))
  • 从主动询问变成等待通知(系统调用次数下降)

缺点

  • 每次查询都会把多个client从用户态拷贝到内核态。(管理百万级别及以上的时候会带来很大开销)
  • 处理有响应的client的时候要遍历所有client判断是否有响应。(模糊通知

4、IO多路复用第二版(epoll)

在这里插入图片描述

改进:

  • 监听fd每次全量维护 —> 监听fd初始化 + 增量维护
  • 模糊通知 —> 明确通知(内部使用就绪列表)

5、信号驱动IO

在这里插入图片描述

区别

无需进程主动去check活跃的socket,把检查工作交给内核。

缺点

当有大量IO操作时,信号较多,SIGIO处理函数不能及时处理可能导致信号队列溢出,而且内核空间与用户空间的频繁信号交互性能也较低

6、异步IO(AIO)

区别

  • epoll(同步非阻塞IO)封装了一个异步事件的通知机制,不负责IO读写操作
  • iocp(异步IO)封装了异步的消息事件的通知机制,同时封装了部分IO操作

iocp将接收发送等io操作也封装到了内核中,对处理大量短连接比较高效。

linux也有AIO,如gcc AIOlibaio等。
流程如下:
在这里插入图片描述

小总结

在这里插入图片描述

经典网络模型

1、单Reactor单线程

在这里插入图片描述

定义:单线程主要针对IO操作而言,I/O中的accept()、read()、write()都是在一个线程完成的。
问题:

  • IO操作和业务逻辑处理操作在一个线程上,大大降低了I/O请求的处理效率。
  • 无法充分利用和发挥多核 CPU 的性能。
  • 可靠性问题,线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。

经典实现

redis:
使用单Reactor单线程,在6.0版本前,核心业务部分使用单线程。官方数据:10万QPS。
6.0版本之后多线程处理网络数据的读写和协议的解析,单线程执行命令。QPS还能提高1~2倍。

为什么用单线程

  • 抛开持久化不谈,Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。
  • 多线程会导致过多的上下文切换,带来不必要的开销。
  • 引入多线程会面临线程安全问题

单线程的缺点:顺序执行影响后续事件

2、单Reactor线程池

在这里插入图片描述

改进:引入了线程池,用来专门处理业务逻辑操作,提升I/O响应速度,利用多 CPU 的处理能力。
问题:

  • 多线程数据共享和访问比较复杂。
  • 管理百万级连接、高并发大数据量时,单个Reactor线程仍然会效率比较低下。

3、多Reactor多线程(多进程)

在这里插入图片描述

改进:扩展了Reactor。引入多个Reactor。也称为主从结构。父线程和子线程的职责明确。

扩展Reactor可以是多线程也可以是多进程。

方式资源分配经典实现
多线程线程之间如果涉及资源竞争的话,需要通过锁来保证同步netty、memcached等
多进程需要进程间通信nginx等

4、Proactor

在这里插入图片描述
对比Reactor

  • Proactor 在处理高耗时 IO 时的性能要高于 Reactor,但对于低耗时 IO 的执行效率提升并不明显
  • Proactor 的异步性使其并发处理能力要强于 Reactor
  • Proactor 的实现逻辑复杂,编码成本较 Reactor 要高很多
  • Proactor 的异步高度依赖于操作系统对于异步的支持。若操作系统对异步的支持不好,Proactor 的性能还不如 Reactor
  • Reactor 是同步非阻塞网络模型,Proactor 是异步非阻塞网络模型

问题:Linux 对 AIO支持的不太友好

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

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

相关文章

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron ),又名感知机( Perceptron ),在模型结构上与 逻辑回归 一致,这里以一个二维输入量的例子对其进行进一步 的解释: 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

面试题:Spring(一)

1. Spring框架中bean是单例么? Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例。 2. Spring框架中的…

qt QFileSystemModel详解

1、概述 QFileSystemModel是Qt框架中的一个关键类,它继承自QAbstractItemModel,专门用于在Qt应用程序中展示文件系统的数据。这个模型提供了一个方便的接口,使得开发者可以轻松地在应用程序中集成文件和目录的树形结构,并通过视图…

从0开始深度学习(26)——汇聚层/池化层

池化层通过减少特征图的尺寸来降低计算量和参数数量,同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样,是在输入图片上进行滑动计算,但是不同于卷积层的…

右旋圆极化散射后的stocks矢量 与T3矩阵的关系

T3矩阵如下 斯托克斯与T3的关系如下。 斯托克斯与T3均没有平均处理,即斯托克斯是完全极化波的(一种琼斯矢量得到),T3是由一个散射矩阵得到,只有一个特征值。

【Unity】Unity拖拽在Android设备有延迟和卡顿问题的解决

一、介绍 在制作Block类游戏时,其核心的逻辑就是拖拽方块放入到地图中,这里最先想到的就是Unity的拖拽接口IDragHandler,然后通过 IPointerDownHandler, IPointerUpHandler 这两个接口判断按下和松手,具体的实现逻辑就是下面 public void On…

解线性方程组(二)

实验类型:●验证性实验 ○综合性实验 ○设计性实验 实验目的:进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法,提高编程能力和解算线性方程组问题的实践技能。 实验内容: 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档,Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置(路径Proxy->Proxy Settings) 3.1.1.不抓包Windows,即不勾选此项,免得打输出不…

进程崩溃难以定位,日志分析五步搞定|OceanBase故障排查实践

作者:胡呈清,爱可生 DBA 团队成员,擅长故障分析、性能优化。 背景 Server 进程崩溃的常见原因包括程序bug、文件损坏、磁盘坏块以及内存坏块,这类故障通常较难分析和定位。 在OceanBase 集群部署时,系统会自动配置co…

[spring源码]spring配置类解析

解析配置类 在启动Spring时,需要传入一个AppConfig.class给ApplicationContext,ApplicationContext会根据AppConfig类封装为一个BeanDefinition,这种BeanDefinition我们把它称为配置类BeanDefinition AnnotationConfigApplicationContext a…

低压电容器衰减的计算方法

低压电容器的衰减(通常指电容器容量的衰减)是指电容器在长时间运行或经历一些不良工作环境下,电容值随时间逐渐减少的现象。这个衰减会影响电容器的工作性能,尤其是在无功补偿和功率因数校正等应用中。计算电容器衰减的具体方法可…

Maven的安装配置

文章目录 一、MVN 的下载二、配置maven2.1、更改maven/conf/settings.xml配置2.2、配置环境变量一、MVN 的下载 还是那句话,要去就去官网或者github,别的地方不要去下载。我们下载binaries/ 目录下的 cd /opt/server wget https://downloads.apache.org/maven/maven-3/3.9.6/…

构建Java教学新生态:SpringBoot应用实例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面: 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题,看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台,显示的cookie还是这样…

【设计模式系列】建造者模式(十)

目录 一、什么是建造者模式 二、建造者模式的角色 三、建造者模式的典型应用 四、建造者模式在StringBuilder中的应用 五、典型建造者模式的案例 一、什么是建造者模式 建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对…

NVR批量管理软件/平台EasyNVR多个NVR同时管理的智能化革新

随着安防监控技术的不断进步和普及,视频监控系统在各行各业中的应用愈发广泛。无论是大型企业、工业园区,还是公共场所、住宅小区,视频监控都成为了保障安全、提升管理效率的重要手段。 NVR批量管理软件/平台EasyNVR,作为一款集多…

【公司新闻】实力出圈!开放传神(OpenCSG)登上《IT时报》!

2024年11月1日(星期五),《IT时报》刊登了关于开放传神(以下简称:OpenCSG)的新闻内容,这期报道究竟揭示了哪些亮点?让我们一起来深入了解。 来源:《 IT时报 》 本报记者 &…

python的安装环境Miniconda(Conda 命令管理依赖配置)

这一段时间,对AI大模型 有了兴趣就想研究一下。 在研究之前肯定要先把需要的编程技能掌握了。经过我查阅资料,今天就先学一下 python的 环境安装。 Node.js 包管理工具:npm 依赖配置文件:package.json 环境管理:nvm&am…

初级图像处理工具

图像处理-初级 1、功能概览 初级图像处理工具旨在为用户提供一个易于使用的界面来执行常见的图像处理任务。该工具集成了多项实用功能,从显示和调整图像的基本属性到应用各种滤镜效果,用户都可以通过简单的命令行交互来完成。 我们的初级图像处理工具…