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

news2024/10/6 1:38:03

文章目录

  • 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,

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

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

相关文章

基于单片机钢琴电子节拍器系统设计

**单片机设计介绍,基于单片机钢琴电子节拍器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机钢琴电子节拍器系统设计是一个综合性的项目,它结合了单片机编程、音频处理、用户界面设计等多个领域的…

Ai软件下载安装 Adobe Illustrator一键安装 5分钟搞定

ai软件又叫adobe illustrator软件,它是设计者们比较常用的平面设计软件,不仅可以用来学习日常的学习设计,还能够用作于商业设计用途,作为一款全球知名的矢量图形处理工具,ai软件广泛应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等.从事设计行业的…

Ceph学习 - 2.分布式文件系统DFS

文章目录 1.分布式文件系统DFS1.1 DFS简介1.1.1 存储基础1.1.2 分布式文件系统1.1.3 DSS简介1.1.4 常见的文件系统 1.2 原理解读1.2.1 分布式数据存储1.2.2 存储角色1.2.3 数据高可用 1.3 小结 1.分布式文件系统DFS 学习目标:这一节,我们从DFS简介、原理…

《MATLAB科研绘图与学术图表绘制从入门到精通》

解锁MATLAB科研绘图魅力,让数据可视化成为你的科研利器! 1.零基础快速入门:软件操作实战案例图文、代码结合讲解,从入门到精通快速高效。 2.多种科研绘图方法:科研绘图基础变量图形极坐标图形3D图形地理信息可视化等&a…

JavaWeb前端基础(HTML CSS JavaScript)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. HTML 1.1 HTML基础 结构 头<head>身体<body> 内容 图片<img>段落<p>图标<link> 标签 单标签双标签 常用标签 div&#xff1a;分割块span&#xff1a;只占需要的大小p&…

Linux网卡IP地址配置错误的影响

在Linux系统中&#xff0c;网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而&#xff0c;如果在这个过程中发生错误&#xff0c;可能会带来一系列问题。让我们一起探讨一下&#xff0c;如果Linux网卡的IP地址配置错误…

nVisual软件在企业运维管理中的价值

​ 企业运维常见问题 1. 设备进出机房&#xff0c;上架下架一直使用excel表格记录&#xff0c;无法持续跟踪机柜设备变化&#xff0c;对机房内设备管理无法做到全过程记录&#xff1b; 2. 资料分散缺乏统一管理&#xff0c;表格手工记录容易产生遗漏&#xff0c;资料不准确&a…

小核引导RTOS---RISC-V C906

文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start&#xff01;参考3. 使用uboo…

【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

【JavaSE零基础】00-基础语法(1-12章)

1 第一章 Java开发环境搭建 1.1 章节目标与知识框架 1.1.1 章节目标 掌握Java的开发环境搭建&#xff0c;会编写HelloWorld程序&#xff0c;并能够准确的进行编译和运行&#xff1b;理解path和classpath环境变量并可以自行配置。 1.1.2 知识框架 1.2 Java语言概述(了解) J…

20240404这个数字有什么特点吗?

今天是2024年的清明节&#xff0c;20240404这个数字让我提出了一个疑问&#xff0c;它是否有什么含义或者特点呢&#xff1f; 首先&#xff0c;如果把它拆分为两个整数的平方和&#xff0c;会怎么样呢&#xff1f; 于是&#xff0c;我一顿操作猛如虎&#xff0c;搞出了这么个…

如何在Python中将HTML实体代码转换为文本

在处理HTML数据时&#xff0c;有时会遇到HTML实体代码&#xff0c;这些代码是为了在HTML中表示特殊字符而使用的。例如&#xff0c;<表示小于符号(<)&#xff0c;>表示大于符号(>)&#xff0c;&表示和符号(&)等等。那么当我们在实际操作中可能会遇到下面的…

并发编程BlockingQueue、BlockingDeque

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 BlockingQueue 也叫做阻塞队列,在某些情况下对BlockingQueue的访问可能会…

Kubernetes学习笔记7

使用kubeadm部署Kubernetes集群方法 使用kubernetes部署单节点Master节点K8s集群。 在实际生产环境中&#xff0c;是不允许单master节点的&#xff0c;如果单master节点不可用的话&#xff0c;当导致我们的K8s集群无法访问。 可以使用kubeadm将单master节点升级为多master节点…

【计算机毕业设计】企业员工信息管理系统——附系统源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

[AIGC] Spring Interceptor 拦截器详解

文章目录 什么是Spring Interceptor如何使用Spring InterceptorSpring Interceptor的影响 什么是Spring Interceptor Interceptor&#xff08;拦截器&#xff09;是Spring MVC框架中的一种特性&#xff0c;类似于Servlet开发中的Filter&#xff08;过滤器&#xff09;&#xf…

007 CSS的继承和层叠 元素特性

文章目录 CSS属性的继承CSS属性的层叠选择器的权重 HTML元素的类型编写HTML注意事项元素隐藏方法CSS属性-overflowCSS样式不生效可能原因 CSS属性的继承 如果一个属性具备继承性&#xff0c;那么在该元素上设置后&#xff0c;它的后代元素都可以继承这个属性 如果后代元素自己…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

浅谈智能照明控制系统的节能优势及其应用

【摘要】&#xff1a;通过智能照明控制系统与传统照明控制的对比&#xff0c;阐明智能照明控制系统的优势&#xff0c;基本组成、在智能建筑中的应用效果以及其实施存在的问题和前景展望。 【关键字】&#xff1a;智能照明控制&#xff1b;系统组成&#xff1b;优势&#xff1…

关于代码审查的一些思考

作为一名代码审查员&#xff0c;首先我们已经具备了丰富的代码开发经验&#xff0c;并且对提交的代码工程非常熟悉 代码审查可以发现并纠正代码中的错误、缺陷和不良实践。通过多人对代码进行仔细的检查和讨论&#xff0c;能够发现一些单独开发时难以察觉的问题&#xff0c;从…