网络模型—BIO、NIO、IO多路复用、信号驱动IO、异步IO

一、用户空间和内核空间

  以Linux系统为例,ubuntu和CentOS是Linux的两种比较常见的发行版,任何Linux发行版,其系统内核都是Linux。我们在发行版上操作应用,如Redis、Mysql等其实是无法直接执行访问计算机硬件(如cpu,内存,网卡等)的操作的,所以需要借助发行版去访问内核,再通过内核去访问计算机硬件。
在这里插入图片描述

  那么问题来了,我们想要用户的应用来访问,计算机就必须要对外暴露一些接口,从而实现对内核的操控,但是内核本身上来说也是一个应用,所以他本身也需要一些内存,cpu等设备资源,用户应用本身也在消耗这些资源,如果不加任何限制,用户随意地去操作系统资源,就有可能导致一些冲突,甚至有可能导致系统出现无法运行的问题,所以把用户和内核隔离开是十分有必要的。因此,用户空间和内核空间应运而生。
  在Linux系统中,权限分成两个等级,0和3,用户空间只能执行受限的命令(Ring3),而且不能直接调用系统资源,而内核可以执行特权命令(Ring0),调用一切系统资源。所以一般情况下,用户的操作是运行在用户空间,而内核运行的数据是在内核空间的,而某些情况下,一个应用程序需要去调用一些特权资源,其就要去调用一些内核空间的操作,所以此时他需要在用户态和内核态之间进行切换。

注:
Linux系统为了提高IO效率,在用户空间和内核空间都加入缓冲区。
写数据时,要把用户缓冲区的数据拷贝到内核缓冲区,然后写入设备;
读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区。
在这里插入图片描述
上图是用户应用读取数据时的流程图,其中用户在两个阶段需要等待:

  • 驱动程序从硬件上读取数据,内核会将读取到的数据写入到内核缓冲区
  • 将内核缓冲区的数据拷贝到用户缓冲区中

这也是不同网络模型主要优化的两个方面,在理解了上述流程后,我们正式进入到网络模型的介绍中!

二、网络模型

1. 阻塞IO(Blocking IO)

  用户读取数据时,会先发起一个recvform命令,尝试从内核上加载数据,如果内核没有数据,那么用户就会阻塞等待,此时内核会去从硬件上读取数据,内核读取数据之后,再把数据拷贝到用户空间,并且返回OK,整个过程,都是阻塞等待的,这就是阻塞IO。
在这里插入图片描述
总结:
顾名思义,阻塞IO就是两个阶段都必须阻塞等待。

阶段一:

  • 用户进程尝试读取数据(比如网卡数据)
  • 此时数据尚未到达,内核需要等待数据
  • 此时用户进程也处于阻塞状态

阶段二:

  • 数据到达并拷贝到内核缓冲区,代表已就绪
  • 将内核数据拷贝到用户缓冲区
  • 拷贝过程中,用户进程依然阻塞等待
  • 拷贝完成,用户进程解除阻塞,处理数据

2. 非阻塞IO(Nonblocking IO)

  用户读取数据时,会先发起一个recvform命令,尝试从内核上加载数据,如果内核没有数据,会返回给用户一个异常,之后用户会再次发起请求,直至数据就绪,之后把数据拷贝到用户空间,并且返回OK,在拷贝数据到用户空间时,是阻塞等待的,这就是非阻塞IO。
在这里插入图片描述
总结:
非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。

阶段一:

  • 用户进程尝试读取数据(比如网卡数据)
  • 此时数据尚未到达,内核需要等待数据
  • 返回异常给用户进程
  • 用户进程拿到error后,再次尝试读取
  • 循环往复,直到数据就绪

阶段二:

  • 将内核数据拷贝到用户缓冲区
  • 拷贝过程中,用户进程依然阻塞等待
  • 拷贝完成,用户进程解除阻塞,处理数据

  可以看到,在非阻塞IO模型中,用户进程在第一个阶段是非阻塞,只有第二个阶段是阻塞状态。不过虽然是非阻塞,但其采用的是再次请求,因此性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。

3. IO多路复用(IO Multiplexing)

  无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案,我们前面已经分析过,这两种方案性能都不好。
  而在单线程情况下,只能依次处理IO事件,如果正在处理的IO事件恰好未就绪(数据不可读或不可写),线程就会被阻塞,这会导致所有IO事件都必须等待(即使已经有就绪的事件),性能自然会很差。我们知道,Redis的网络模型就是IO多路复用,那么IO多路复用有何优化呢?
  在IO多路复用网络模型中,用户去读取数据时,不再去直接调用recvfrom了,而是调用select函数,select函数会将需要监听的数据交给内核,由内核去检查这些数据是否就绪了,如果说这个数据就绪了,就会通知应用程序数据就绪,然后来读取数据,再从内核空间把数据拷贝给用户空间,完成数据处理,如果所有的数据都没就绪,此时再进行等待。

在这里插入图片描述

总结:
  文件描述符(File Descriptor):简称FD,是一个从0开始的无符号整数,用来关联Linux中的一个文件。在Linux中一切皆文件,例如常规文件、视频、硬件设备等,当然也包括网络套接字(Socket)。
  IO多路复用利用单个线程来同时监听多个FD,并在某个FD可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

阶段一:

  • 用户进程调用select,指定要监听的FD集合
  • 核监听FD对应的多个Socket
  • 任意一个或多个Socket数据就绪则返回readable
  • 此过程中用户进程阻塞

阶段二:

  • 用户进程找到就绪的Socket
  • 依次调用recvfrom读取数据
  • 内核将数据拷贝到用户空间
  • 用户进程处理数据

此外,在监听FD的方式、通知的方式有多种实现,常见的有:

  • select
  • poll
  • epoll

  其中select和poll相当于是当被监听的数据准备好之后,他会把你监听的FD整个数据都发给你,你需要到整个FD中去找哪些是就绪的,需要通过遍历的方式,所以性能也并不是那么好。而epoll,相当于数据准备好了之后,会把准备好的数据直接发给你,省去了遍历的动作,因此性能最好。

4. 信号驱动IO(Signal Driven IO)

  信号驱动IO是与内核建立SIGIO的信号关联并设置回调,当内核有FD就绪时,会发出SIGIO信号通知用户,期间用户应用可以执行其它业务,无需阻塞等待。
在这在这里插入图片描述
里插入图片描述

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

阶段一:

  • 用户进程调用sigaction,注册信号处理函数
  • 内核返回成功,开始监听FD
  • 用户进程不阻塞等待,可以执行其它业务
  • 当内核数据就绪后,回调用户进程的SIGIO处理函数

阶段二:

  • 收到SIGIO回调信号
  • 调用recvfrom读取数据
  • 内核将数据拷贝到用户空间
  • 用户进程处理数据

5. 异步IO(Asynchronous IO)

  异步IO,不仅仅是用户态在试图读取数据后不阻塞,而且当内核的数据准备完成后,也不会阻塞。
在这里插入图片描述
总结:
  异步IO会由内核将所有数据处理完成后,包含将数据写入到用户空间中,才算完成,所以性能极高,不会有任何阻塞,全部都由内核完成。可以看到,异步IO模型中,用户进程在两个阶段都是非阻塞状态。不过其在高并发的情况下也存在一些问题,比如,用户应用发送了过多的IO请求,因为IO操作比较费时,那么在内核空间可能会积累很多IO任务,从而导致系统因为内存占用过多而崩溃。所以,异步IO需要采用合适的限流措施。

三、对比

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

剪画小程序:视频伪原创怎么制作?视频伪原创的几种制作方法分享!

什么是视频伪原创? 视频伪原创是指对已有的视频内容进行一定程度的修改和处理,使其在形式或部分细节上与原始视频有所不同,但保留了核心内容或主题。 视频伪原创包括以下一些常见操作: 剪辑重组:对原始视频进行剪辑…

【C language】统计某数中二进制1的个数

题解:统计某数中二进制1的个数(取模法 看某位是1/0法 干掉最右边的1法) 目录 1.题目2.取模法3.看某位是1/04.干掉最右边的1 1.题目 题目:设计一个程序,统计某数中二进制1的个数 2.取模法 int main() {int num 15;int count 0;while (n…

【UE 反射】反射的原理是什么?如何使用机制?

目录 0 拓展0.1 静态类型检查0.1.1 静态类型检查的主要原理0.1.2 编译器的工作流程0.1.3 静态类型检查的优点和缺点0.1.4 示例0.1.5 C也可以在运行时类型检查RTTI基本原理RTTI的实现RTTI的工作流程RTTI的限制 0.2 运行时动态类型检查0.2.1 主要特点0.2.2 动态类型检查的实现0.2…

元宇宙vr工业产品展示空间降低研发成本

元宇宙产品虚拟展厅搭建编辑器为您提供了一个自助式元宇宙场景搭建的绝佳平台。无论您是设计公司、摄影公司、营销公司还是教育机构,我们都能为您量身打造专属的元宇宙解决方案,满足您的多样化需求。 元宇宙产品虚拟展厅搭建编辑器具备强大的3D编辑功能&…

FPGA基础:触发器和锁存器

目录 锁存器(Latch)D触发器(Flip-Flop)最基本时序电路时序块(Sequential blocks):同步与异步触发器概念触发器分类触发器的Verilog实现1. 上升沿触发的触发器2. 带异步复位、上升沿触发的触发器3. 带异步复…

rtsp协议分析

rtsp概述 rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326:这是RTSP的初始定义版本v1.0,由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组(IETF)作为RFC标准。RFC7826:这是RTSP的后续更新…

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接:loading 截稿时间:9月15日 检索:EI检索 一、会议信息 大会官网:www.ciotsc.org 会议地点:湖南株洲 会议时间:2023年11月15日-17日 二、征稿主…

探索AES对称加密:Python代码实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:从非对称到对称 二、AES加密机制概述 三、Python实现AES加密与解密 …

FreeRTOS【8】二值信号量使用

1.开发背景 FreeRTOS 提供了队列可以在线程间快速交换信息,那么还有没有其他交互渠道?答案是有的,相对于队列传递信息,还有更轻量级的线程唤醒操作,那就是信号量,而二值信号量就是最简单的一种。 二值信号量…

揭秘希喂、小米、安德迈宠物空气净化器的惊人效果,性价比爆表!

当谈及养猫,首先浮现在脑海中的烦恼无疑是猫咪的掉毛和便臭问题。这些问题对于我们这些爱宠人士来说,无疑是一种持续的挑战。特别是在炎热的夏季,高温本身就让人焦躁不安,而空气中飘散的猫浮毛和便臭更是加剧了这种不适感。 为了…

Linux系统编程(五)多线程创建与退出

目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建(1)整型的传入与接收(2)浮点数的传入与接收(3)字符串的传入与接收(4)结构体的传入与接收 2. 线程的退出3. 线程的…

智慧仓储新动力:EasyCVR+AI视频智能监管系统方案助力仓储安全高效管理

一、背景 随着物流行业的快速发展和智能化水平的提升,智慧仓储视频智能监管系统已成为现代仓储管理的重要组成部分。本系统通过综合运用物联网、视频分析、边缘计算等技术手段,实现对仓储环境的全面监控、智能分析和高效管理。 TSINGSEE青犀视频汇聚Ea…

【单片机毕设选题】-智能语音控制风扇

一. 系统功能 此设计采用STM32和SU-03T离线语音模块来控制风扇, 主要功能如下: 1. 通过DHT11温湿度模块来采集环境温湿度。 2. 通过SU-03T语音模块来控制风扇启停加减速等。 3. 通过OLED显示系统状态。 4. 可以通过按键控制风扇启停加减速等。 5. 通过蓝牙模块监视系统状…

【IOT】OrangePi+HomeAssistant+Yolov5智能家居融合

前言 本文将以OrangePi AIpro为基础,在此基础构建HomeAssistant、YOLO目标检测实现智能家居更加灵活智能的场景实现。 表头表头设备OrangePi AIpro(8T)系统版本Ubuntu 22.04.4 LTSCPU4核64位处理器 AI处理器AI算力AI算力 8TOPS算力接口HDMI2、GPIO接口、Type-C、M.2…

06.逻辑回归

文章目录 Generate Model优化边界为线性证明损失函数比较逻辑回归不能用均方误差Generative v.s. DiscriminativeMulti-class Classification逻辑回归的限制自己找线性变换 Generate Model 假设样本符合高斯分布 即找 μ \mu μ和 σ \sigma σ 优化 共用 Σ \Sigma Σ减少…

CSS学习笔记:vw、vh实现移动端适配

移动端适配 移动端即手机端,也称M端 移动端适配:同一套移动端页面在不同屏幕尺寸的手机上可以实现宽度和高度的自适应,也就是页面中元素的宽度和高度可以根据屏幕尺寸的变化等比缩放 之前我在一篇博客中介绍了rem实现移动端适配&#xff0…

这样写代码太优雅了吧

文章目录 优化案例初次优化再次优化看看Spring源码的处理 优化案例 假设一个场景, 开发代码时,需要对类中的方法进行遍历,判断有没有注解NotNull,暂时没有合适的工具类,需要自己手搓一个。 无须多想,分分钟…

CSS学习笔记:响应式布局的原理——媒体查询

什么是响应式布局? 在实际书写代码时,我们不会自己去手写媒体查询来实现响应式布局,我们一般会调用现成的代码库或使用现成的框架(但这些代码库或框架的底层原理是媒体查询,所以了解媒体查询也是很有必要的&#xff0…

应用弹窗优先级

背景 由于活动业务越来越多,积累的弹窗越来越多和杂乱,出现如下弹窗交互问题: 弹窗无限重叠,影响操作 弹出顺序无优先级,重要弹窗被隐藏 原因相信大家都一样,产品是一次次迭代的,也可能是不…

ozon卖家精灵,ozon卖家怎么使用

在跨境电商的浪潮中,OZON作为俄罗斯领先的电商平台,吸引了众多卖家争相入驻。然而,面对日益激烈的市场竞争,如何提升店铺的运营效果,成为卖家们迫切需要解决的问题。而OZON卖家精灵作为一款专为OZON卖家打造的辅助工具…