Linux:五种IO模型的基本认识

文章目录

  • IO的本质
  • 五种IO模型
    • 异步和同步
  • 阻塞IO
  • 非阻塞IO
  • 信号驱动IO

IO的本质

在之前的内容中已经结束了对于网络和操作系统的学习,那么回过来再继续看IO,什么是IO呢?

对于网络的学习当中,实际上也是一种IO,数据从计算机进入到网卡,或者是从网卡中再加载回计算机,这本质上都是一种硬件级别的IO过程,当把套接字建立完毕之后,如果不进行任何输入,那么此时IO没有数据,那么就会在这里阻塞,这就是一个典型的IO中数据没有就绪的情况

以读写为例,当调用read函数的时候,如果底层的缓冲区没有数据,那么默认情况下就会在这里阻塞等待,如果想发送数据,但是缓冲区已经满了,那么此时也不能把数据进行写入,所以对于读和写的本质,其实就是从网络当中读数据,把数据写入到操作系统当中,至于怎么写,写多少,这些都是下层会帮助完成的事,但是不管怎么说,如果缓冲区为0或者以及满了,对于IO的操作都是不被允许的

IO的本质可以如何理解?IO的本质就是等待加拷贝,在绝大多数的情况下,等待的时间是要占据绝大多数的时间的,也就是说在我们IO的过程中,绝大多数的时间都是在IO,只有少部分的时间是在等待,而在普遍的认知当中,我们往往会忽略这个等待的过程,而是直接去看它拷贝的过程

所以,我们该如何看待提升IO效率这件事?提升效率本质上就是要不然提升拷贝的效率,要不然提升等待的效率,换句话说就是提升单位时间内拷贝的效率,在单位时间内可以拷贝足够多的数据,这本身就是一种提升IO的表现,所以在未来的这些IO模型当中,其实本质上都是在解决等待的这件事,想办法让等待的时间变短,就是提升IO的一种具体体现

五种IO模型

下面要进入的话题是五种IO模型,这里我简单进行一些讲解,我们以钓鱼为例,对于钓鱼这件事来说,什么叫钓鱼?说最简单的来理解就是一直在等待钓鱼,然后等到了把鱼钓起来,这就是对于钓鱼的一个最简单的整体认知,那这有什么用呢?该如何理解呢?我用下面的这五个故事来进行理解

现在有一个人叫做张三,他在钓鱼的时候采用的方式是一直在这等着,双手握着鱼竿死死的看着水面,如果有鱼咬了,就把杆子拽起来,这就完成了一次钓鱼的过程,那么张三在进行钓鱼的过程中,在看着鱼漂的这件事,本质上来说就是在等待的过程,而在张三进行钓鱼的过程中,没有任何人可以打扰他,只有当底层有鱼就绪了才会结束这个事,张三的这种行为就是阻塞式钓鱼,在绝大多数的IO接口当中,都是阻塞式IO的

过了一会,有一个人叫做李四,李四感觉没什么意思也来钓鱼,但是他和张三不一样,李四钓鱼的时候并不会一直在这里等着,而是一会看看手机,一会看看书,一会吃点零食,一会看看水面,当他发现水面上有鱼来了的时候,就把鱼钓起来了,那么李四的这个行为和张三并不一样,他选择的做法是一会钓钓鱼,一会干点别的事,而不是一直在看着水面,那么李四的这种做法也比较好理解,他就是所谓的非阻塞式IO

又过了一会,有一个人叫做王五,他也来钓鱼了,但是不同的是,他要做的是把鱼竿扔到水里面,然后就走了,在旁边躺着看手机,而在鱼竿上有一个铃铛,当有鱼咬钩的时候,铃铛就开始响,之后王五就发现有鱼咬钩了,直接把鱼竿拽起来,完成了一次钓鱼,所以对于王五来说,他没有主动的去检测鱼有没有上钩,而是去选择等着鱼上钩了提醒自己,这种IO的模式被叫做是信号驱动式IO

又过了一会,有一个人叫做赵六,赵六是个小富豪,他的钓鱼装备很多,他一下拿了100个钓鱼竿,同时去钓鱼,赵六要做事就是不断的在这个过程中去遍历这100个钓鱼竿,如果有上钩的就拿起来,没有上钩的就不管他,那么赵六的这件事本身就被叫做是多路复用,也叫做多路转接

那上述的这四个人的钓鱼方法,谁是最高效的呢?无疑是赵六,他的多路转接的效率非常高,在短时间内可以把等待的时间压缩到最短,从而起到提升IO的作用

又过了一会,有一个人叫田七,田七就和他们不一样了,他是一个超级大富豪,他从车上下来之后拿出装备,准备进行钓鱼,此时他突然接到了电话,有人告诉他说他现在要去开会,于是田七就不能继续钓鱼了,但是田七又觉得今天很想吃鱼,于是就和司机说,让司机来帮他钓鱼,司机就开始帮他钓鱼,而田七本人去开会去了,到了下班的时候田七就收到了司机钓的一桶鱼

异步和同步

那对于田七来说,他的这个做法属于什么呢?我们把这样的行为叫做是异步,而前面的这四种人的方式都叫做同步,对于同步来讲,一个很重要的事就是他们需要进行等待,前面的四个人,不管是用什么方式进行等待,但是最终都需要进行等待,而我们要学习的重点内容是对于多路转接来进行理解

阻塞IO

在这里插入图片描述
如上所示的是五种基本的IO模型,当有一个系统调用被调用的时候,如果数据没有就绪,那么就会一直卡在这里,等待内核当中的数据包就绪,直到就绪之后才会进行返回,然后处理数据包,这个就是阻塞IO

非阻塞IO

在这里插入图片描述
那什么是非阻塞IO?如上所示就是一个非阻塞IO的示意图,非阻塞IO和阻塞IO一个比较大的区别就是,非阻塞IO会进行轮询的操作,而不是一直在内核当中进行等待,当数据报准备好的时候就会返回,如果没有准备好也会返回,只不过回返回的是一个EWOULDBLOCK的错误码

那在非阻塞IO当中,是可以对于标记位进行设置的,我们回顾一下参数的接口:

在这里插入图片描述
在这里插入图片描述
read的参数和recvfrom基本相同,但是却少了一个标记位的参数,那在之前的内容中对于标记位通常设置的都是0,表示的是阻塞等待,如果想要设置的是非阻塞等待,就可以对于这个标记位进行一些设置

对于文件描述符来说,它是一个数组的下标,而这个数组当中的每一个文件本质上都是一个内核当中的文件对象,文件对象中是有对于文件的flag标记位的,所以可以用一个叫做fcntl函数来对于一个文件的底层flag标记位进行设置,这个设置的原理就是告诉内核,对于这个特定的文件描述符,我要把它设置为非阻塞

在这里插入图片描述
对于这个函数的使用细节,在后面的篇章中会有详细的讲解,这里先不进行使用

信号驱动IO

在这里插入图片描述
下面我们来谈的是信号驱动的IO,

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

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

相关文章

Android Studio导入第三方so库和jar包——Android Studio

导入so库 方式一(libs文件夹) 将项目以【Project】的结构显示,将目标架构对应的so文件夹(如下图中 的arm64-v8a)复制粘贴到app文件下的lib文件夹中(如下图的步骤1 2 3) 在build.gradle&…

【Java EE】Spring请求如何传递参数详解

文章目录 🎍传递单个参数🌴传递多个参数🍀传递对象🎄后端参数重命名(后端参数映射)🌲传递数组🎍传递集合🌴传递JSON数据🌸JSON概念🌸JSON的语法&a…

Python学习,记录不熟悉知识点

目录 Set(集合) 集合内置方法完整列表 根据字符串的表达式计算结果 ​编辑 条件控制: if – elif – else match...case 循环语句: while循环 for循环 在同一行中有多个赋值操作(先计算,再赋值&…

ThinkPhp8 框架使用 mysql find_in_set 函数

前言: 使用mysql 存储一些标签时 会使用逗号拼接的存储方法 比如 1,2,3,11 一般情况下 查询 1 可能会用到 like %1% 但这样查询的不够准确 因为11也会被查询到 如果每次都多一个逗号 1,2,3,11, 查询时 like %1,% 这样存储有点不太符合程序设计 解决方案 ----------- 官网…

Google Play上架:恶意软件、移动垃圾软件和行为透明度拒审解析(关于对SDK 要求,第三方插件需自查清理混淆)

近期发现很多开发者在上架过程中遇到了 《关于恶意软件、移动垃圾软件和行为透明度》相关的拒审邮件,今天来聊一下关于sdk的政策要求,希望能提供一个自查方向。如有疑问,可以关注博主后私聊进行讨论和咨询。 SDK要求要求如下用户数据政策“敏感信息访问权限和 API”政策“恶…

YOLOv8的多分类模型如何计算准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score模型评估参数

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

mysql 连接查询和子查询

学习了mysql基本查询, 接着学习连接查询和子查询。 4,连接查询 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建…

rsync实时同步(上行同步)

目录 一、实现实时同步 1. 定期同步的不足 2. 实时同步的优点 3. Linux内核的inotify机制 4. 发起端配置rsyncinotify 4.1 修改rsync源服务器配置文件 4.2 调整inotify内核参数 4.3 安装inotify-tools 4.4 在另一个终端编写触发式同步脚本 4.5 验证 二、使用rsync实现…

直播美颜SDK:AI视觉技术在直播平台中的创新与实践

在直播平台里,主播们通过各种形式的内容吸引着观众,而其中一项重要的技术创新便是直播美颜SDK的应用。本文将探讨这一技术在直播平台中的创新与实践。 一、直播美颜SDK的背景 随着社交媒体的兴起,人们对于自己的形象越来越注重,尤…

【php开发支付宝web支付】

首先介绍下 我用的框架ci 在吐槽下百度的其他人的写的都很垃圾,还不如自己看支付宝的开发手册了 1、composer安装支付宝的sdk composer require alipay/alipay-sdk-php安装完毕 不多哔哔 代码展示 先点地址登录支付宝以后再上我这重点下 支付宝沙箱地址 $ord…

C/C++中局部变量static用法实例

1. 普通局部变量存储于进程栈空间,使用完毕会立即释放,静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0,并且静态局部变量存储于进程的全局数据区,即使函数返回&#xff0…

企业3D数字化网络展馆成为企业文化传承与发扬的圣地

在河北这片古老而富饶的土地上,文明的火种薪火相传,燕赵之风历久弥新。河北企业也多年持续稳居我国第五的宝座,企业文化展馆不仅是企业形象的展示窗口,更是企业文化传承与发扬的圣地。 与短暂的行业展会不同,企业展馆是…

Mac下载的软件显示文件已损坏,如何解决文件已损坏问题

当在Mac上下载的软件显示文件已损坏时,这可能是因为多种原因导致的,包括网络问题、下载中断、软件未完整下载、文件传输错误等。解决这个问题需要采取一些步骤来排除可能的原因,并尝试修复文件。下面将详细介绍一些常见的解决方法&#xff1a…

让WIN7运行WIN10软件的插件

GitHub - vxiiduu/VxKex: Windows 7 API Extensions 安装包才5.23M。 程序 - 属性 - VxKex:勾选 Enable Qt6版的Raptor登录后报错Device offline OpenSCAD的WIN10版

交易要想成功澳福总结几点

100%使用基本面分析的投资者能保证每次交易都能成功吗?100%使用技术分析的投资者能保证每次交易都能成功吗?在fpmarkets澳福看来无论是基本面分析还是技术分析都不能保证100%交易成功。 投资者不能只依赖一种分析进行投资交易。在fpmarkets澳福看来成功的…

vue3中项目优化(Web Worker的使用)

1.Web Worker的作用 本人的理解:js是单线程执行代码,也就是代码需要从上往下执行,而使用Web Worker后相当于分了一条线程出来执行代码,那么两条线程肯定是比一条线程执行的快。 2.新建Web Worker文件 在public文件夹下新建work…

【第二十六篇】Burpsuite实现请求方式修改+请求体文件选取

有时我们想将请求包的请求方法或请求体进行修改,这些操作可以由burpsuite完成,以节省时间。 文章目录 修改请求方法请求体文件选取修改请求方法 例如,某请求包的请求方法为GET: 如果我们想将其修改为POST且传递POST参数、上传文件,可以按以下步骤: 1、修改请求方法 2…

避雷!网络安全学习五大误区,你还不知道?

尽管安全问题老生常谈,但一些普遍存在的误区仍然可能让企业随时陷入危险境地。 为了有效应对当前层出不穷且不断变换的网络威胁,最大程度规避潜在风险,深入了解网络安全的发展趋势必不可少。即使部署了最新且最先进的硬件和解决方案并严格遵守…

LeetCode-热题100:138. 随机链表的复制

题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。…

【数据结构与算法】力扣 142. 环形链表 II

题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统…