5种IO模型简述

news2024/11/15 20:47:38

文章目录

  • 前言
  • 什么是IO模型?
    • 阻塞IO
    • 非阻塞IO
    • 多路复用IO
    • 信号驱动IO
    • 异步IO
  • 结语

前言

最近学netty,当然无法避免IO模型这部分知识。
我尽量用最简洁的语言来讲清楚这个东西。

什么是IO模型?

既然最近学netty,就拿它来举例子。
比如两个应用通过网络通信(基于TCP)。
应用1发送消息应用2。TCP是有一个发送缓冲区和接受缓冲区的。
大概是这么一个状态
在这里插入图片描述
通信的过程就是,应用1发出的数据先发到TCP发送缓冲区,再经由网络传输给应用2所在主机,此时由对应主机的TCP接收缓冲区接收,接收到后,应用2再去接受缓冲区读。
那么应用2从TCP接收缓冲区中读数据的这个操作,就是一个IO请求(把数据从网卡中最终读到内核空间的TCP缓冲区,再从内核读到读到用户空间,是一个网络IO中的读操作),请求把数据读到用户空间。
那么这就要引出IO模型了。即上文中我们读数据这个过程的具体流程。
我们要读数据,面临着两种情况,网络上有数据到达和没有数据到达。我们调用read函数去读数据,此时内核缓冲区中可能有数据,也可能没数据。那么有数据我们当然可以直接读过来。没有数据的时候呢呢?我们是等待还是直接返回?这里就是区别几种IO模型的地方了。下面详细说一下这5个IO模型。

阻塞IO

阻塞IO
以读操作为例。就是在内核中缓冲区没有数据可读时阻塞等待,直到有数据可读,再读取数据并返回。
也就是说即使当前数据没准备完成,依旧阻塞等待在内核态,直到数据准备完成则开始读到用户空间。
对于写操作,若写缓冲区已满,则此时无法写,则阻塞等待,直到写缓冲区有空间了才去写。
在这里插入图片描述

很容易发现,这个时间可以省掉,本来可以等数据准备完成或者缓冲区可写时再去进行IO操作的。
阻塞操作的性能很差。
它的优点在于实现简单。响应也快,因为数据准备完成就会立即进行数据的复制。

非阻塞IO

非阻塞IO
直接对比阻塞IO的概念。
既然在阻塞IO时在准备时直接阻塞等待。那么非阻塞自然是不阻塞等待。
比如读操作,没有数据可读就直接返回,不再阻塞等待。一般循环去读,直到数据准备完成,就把数据从内核拷贝到用户空间。
写操作也类似,在写缓冲区满时就返回,循环去调用,直到某次调用发现写缓冲区有空间,则进行写操作。
在这里插入图片描述

循环调用虽然没有阻塞,在调用返回时也可以做一些其他事情。
即每次做点其他的事再去调用IO操作来看是否可以进行操作。
这也导致一个问题,由于不是连续调用IO操作函数,中间穿插了其他操作,可能数据准备好时没有立即去进行IO操作,导致一些请求延迟。

多路复用IO

linux多路复用有三种实现select,poll,epoll。这里仅说select,主要讲思想。
多路复用好处在于一个进程监控多个进程的IO操作。什么意思?
假如我们有进程A,B,C,这三个进程都想进行读操作,那么我可以把这些进程IO请求注册到多路复用器上。然后使用一个进程调用select函数,该进程通过select函数来监听A,B,C的IO准备情况。当A,B,C的IO在内核都没有数据可读时,select会阻塞,直到有某个进程IO对应的缓冲区有数据可读,触发读事件,那么select就从阻塞状态恢复,自己进行读操作,或者通知原进程进行读操作。
梳理一下。就是把每个进程想监听的IO事件注册到多路复用器,然后另外一个进程来调用select监控这些IO,触发事件则可以通知原线程进行读操作。
即把原本阻塞IO的阻塞时间和非阻塞IO的空转时间省掉了。直接把事件交给一个进程去监听,有事件则说明当前数据准备完成或者缓冲区准备完成,可以进行对应IO操作了。
多个进程的情况下,不会像阻塞IO一样都阻塞,或者非阻塞IO那样,一直空转。
在这里插入图片描述

信号驱动IO

信号驱动IO
想进行读操作,注册一个信号处理函数给内核就返回,不阻塞。
在数据准备完成,内核就会发送信号,进程收到就会触发设定好的回调函数来进行读操作。

在这里插入图片描述
涉及信号相关操作,实现有难度。
同时信号队列大小有限,可能无法处理太多请求。

异步IO

上述几个模型,最多只在等待数据的部分异步由其他人来做。
而复制数据一般都需要本进程进入内核态完成数据拷贝。
而异步IO则是把这个数据复制的部分也异步来做。
即在系统调用读操作时,直接返回,但是并不会返回任何结果,因为此时还没执行完成。等待数据还有复制数据的部分都交给内核来进行。在内核完成数据复制后通知进程IO操作完成

缺点在于实现难度大,应用难度大。

结语

这篇文章介绍了这几个IO模型。
仅为个人理解,这块也看过不少文章博客。

了解这些,再看Netty的IO模型可能就更好理解。
后面可能会更一期Netty的IO模型。

感谢阅读,欢迎批评指正。

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

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

相关文章

ITPUB专访 | 张宏波:一场关于编程语言速度与效率的深度对话

ITPUB专访 | 张宏波:一场关于编程语言速度与效率的深度对 随着 AI 大语言模型(LLM)不断突破和开源社区活跃程度达到前所未有的高度,以 OpenAI 的 GPT-4、Meta-LLaMA 等为代表的重量级产品和服务相继发布,AI 技术的蓬勃…

视频VIP收费会员播放帝国CMS模板HTML5自适应手机多种运营模式

采用帝国CMS最新版核心制作,自适应响应式手机平板浏览,手机浏览器非常舒服哦!多种运营模式。用户中心逻辑和页面,都已经制作完整,可以搭建后稍微修改即可使用! 模板特点: 支持多集和单集播放&…

【2024】Datawhale AI夏令营 Task2笔记——Baseline代码详细解读

【2024】Datawhale AI夏令营 Task2笔记——Baseline代码详细解读 本文对可完成赛事“逻辑推理赛道:复杂推理能力评估”初赛的baseline代码进行详细解读,该baseline代码由Datawhale AI夏令营提供,核心内容是调用灵积模型服务平台的大语言模型…

大众点评采集店铺全部推荐菜的全部信息

大众点评餐饮店铺的推荐菜是个好东西,蕴含的信息很丰富,可以用作店铺运营分析参考。 指定大众点评店铺,可以采集该店铺的全部推荐菜的全部信息,包括推荐菜的名字、价格、最近三个月推荐次数、推荐菜的评价、推荐菜的标签、菜品所…

从PyTorch官方的一篇教程说开去(5 - 神经网络 torch.nn)

神经网络长啥样?有没有四只眼睛八条腿? 借图镇楼 - 真的是非常经典,可以给下面的解释省掉很多力气。 分3个维度阐述 - 1)输入数据集。假如你自己去微调一下大模型就知道,最开始的一步就是要准备(足够大…

一个项目的坎坷一生

大家好,我是苍何。 目前呢,主要是负责部门的项目管理和团队管理相关工作,今天想和大家分享一下企业级标准的项目管理流程以及苍何的实践。 通过本文,能帮助你更快的在企业中上手项目并定位好自己的角色,别人一脸懵逼…

高效恢复误删文件:2024年数据恢复工具

现在都是互联网的时代,数据已成为我们生活与工作中不可或缺的一部分。很多时候我们都依赖电子设备来存储数据,这也造成来数据丢失风险的增加。这时候如果掌握了一些数据恢复软件,比如转转大师数据恢复软件这种就能对你的电子存储数据有保障。…

如何在 Windows 系统环境下安装 Tesseract OCR? ( •̀ ω •́ )✧

第一步:下载Tesseract OCR引擎安装包 🍑 访问Tesseract的GitHub发布页面(https://github.com/tesseract-ocr/tesseract)或第三方下载站点(https://digi.bib.uni-mannheim.de/tesseract/),下载适…

Docker与LXC差异以及相关命令

容器:Docker与LXC差异以及相关命令 ​ LXC与Docker对比,LXC只实现了进程沙盒化,不支持在不同的机器上进行移植;Docker将应用的所有配置和环境进行了抽象,打包到一个容器中,此容器可以在任何安装了docker的…

mybatis-plus实现分页功能

第一步:添加mybatis-plus为分页所使用的拦截器插件 (不用这个的话sql里面的limit关键字无法实现,也就没办法实现查询操作) 代码: Configuration public class mybatis_plus_config {Beanpublic MybatisPlusIntercept…

4大类75项BUG场景大盘点!测试人必看!

本文主要针对填写BUG时,bug分类共分为多少项,每一项内容都有哪些场景,并结合具体错误案例进行简单分析。 一UI表示层 在软件测试和开发中,当提到“用户UI”类型的bug时,通常是指与用户界面(User Interface…

Weights2wights Interpreting the Weight Space of Customized Diffusion Models

Weights2wights: Interpreting the Weight Space of Customized Diffusion Models 导语 可控生成是图像生成领域的一个重要方向。从最基础的文本条件生成,到 ControlNet、IP-Adapter 等图像条件生成,再到各种概念定制化生成,扩散模型的可控…

InternLM Git 基础知识

提交一份自我介绍。 创建并提交一个项目。

采用GDAL批量波段运算计算植被指数0基础教程

采用GDAL批量波段运算计算植被指数0基础教程 1. 引言 在传统的遥感数据处理方法中,通常使用ArcGis或ENVI软件进行波段运算。然而,这些软件在处理大量数据时往往效率低下。有没有一种方法可以批量进行波段运算,一下子计算几十个植被指数&…

将项目部署到docker容器上

通过docker部署前后端项目 前置条件 需要在docker中拉去jdk镜像、nginx镜像 docker pull openjdk:17 #拉取openjdk17镜像 docker pull nginx #拉取nginx镜像部署后端 1.打包后端项目 点击maven插件下面的Lifecycle的package 对后端项目进行打包 等待打包完成即可 2.将打…

【全志H616开发】Linux的热拔插UDEV机制

文章目录 udev简介工作原理Udev 配置文件和规则示例总结: udev简介 Udev 是 Linux 系统中设备管理的一部分,它负责管理动态设备节点并处理设备的热插拔。Udev 提供了一种在用户空间管理设备节点的机制,可以在设备插入或移除时自动执行相应的…

2024.7.30问题合集

2024.7.30问题合集 1.adb调试出现5037端口被占用的情况2.更改ip地址时出现以下问题3.RV1126 ip配置问题 1.adb调试出现5037端口被占用的情况 问题:5037端口被占用的情况 解决方案:将adb文件下的adb.exe和AdbWinApi.dll两个文件复制到C:\Windows\SysWOW6…

红外热成像仪的功能应用_鼎跃安全

红外热成像仪利用红外探测器接收被测目标物体发射的红外辐射能量;通过接收到红外辐射转化为电信号,将这些信号放大转化后,通过不同的颜色代表不同温度,从而直观的在电子屏显示出来,可以清晰的观察到物体的热分布。 热成…

flex/bison结合使用解析配置文件

flex是gnu linux下的语法分析器程序(lex则是Unix下的语法分析器),它将输入文件(yyin)的内容去匹配对应的匹配规则表达式,并返回一个token。注意,flex的copyright并不是gnu的。 bison是gnu linux下的yacc(Yet Another Compiler Compiler)&…

【计算机毕设论文】基于SpringBoot的成绩管理系统

💗博主介绍:✌全平台粉丝5W,高级大厂开发程序员😃,博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 感兴趣的可以先收藏起来,同学门有不懂的毕设选题,项目以及论文编写等相…