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,

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

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

相关文章

使用vite创建一个react18项目

一、vite是什么? vite 是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成: 一个开发服务器,它基于原生 ES 模块提供了丰富的内建功能,如速度快到惊人的模块热更新(HMR)。 …

博客部署004-centos安装mysql及redis

1、如何查看当前centos版本? cat /etc/os-release 2、安装mysql 我的是centos8版本,使用dnf命令 2.1 CentOS 7/8: sudo yum install -y mysql-community-server 或者在CentOS 8上,使用DNF:🌟 sudo dnf install -y mysql-ser…

探秘MIMO技术:无线通信革命的多天线奇迹

单根发射天线和单根接收天线之间的信道容量受限于香农公式,要想在相同的频谱带宽下进一步提高信道容量,要采用多天线技术。 1. 什么是MIMO MIMO:Multiple-Input Multiple-Output,即多入多出系统。这里的入和出是相对于发射天线和…

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时,将力传感技术(Force Sensing Technology)和控制算法(Control Algorithm)结合起来&a…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔:这年头工作不好找咯,大家有学历提升的赶快了,还有外出人多注意身体,没错我在深圳这边阳了,真的绝啊,最尴尬的还给朋友传染了!!! 之前三种的监听情况,监听…

LabVIEW太赫兹波扫描成像系统

LabVIEW太赫兹波扫描成像系统 随着科技的不断发展,太赫兹波成像技术因其非电离性、高穿透性和高分辨率等特点,在生物医学、材料质量无损检测以及公共安全等领域得到了广泛的应用。然而,在实际操作中,封闭性较高的信号采集软件限制…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持: ◆ 主流大型数据库Oracle、SQLServer、MyS…

DC9 Debian和sql注入

信息收集 sudo arp-scan -l 列出局域网主机 arp-scan向局域网中所有可能的ip地址发出arp请求包,如果得到arp回应,就证明局域网中某台主机使用了该ip dc9的ip : 192.168.146.133 访问网页 cms为Debian 端口扫描 22端口是filtered 隐藏目…

详细分析Python爬虫中的xpath(附Demo)

目录 前言1. 基本知识2. 常用API3. 简易Demo 前言 关于爬虫的基本知识推荐阅读:Python爬虫从入门到应用(超全讲解) 该知识点需要提前安装相关依赖:pip install lxml 1. 基本知识 XPath(XML Path Language&#xf…

GIt 删除某个特定commit

目的 多次commit,想删掉中间的一个/一些commit 操作方法 一句话说明:利用rebase命令的d表示移除commit的功能,来移除特定的commit # 压缩这3次commit,head~3表示从最近1次commit开始,前3个commit git rebase -i head~3rebase…

机器学习每周挑战——信用卡申请用户数据分析

数据集的截图 # 字段 说明 # Ind_ID 客户ID # Gender 性别信息 # Car_owner 是否有车 # Propert_owner 是否有房产 # Children 子女数量 # Annual_income 年收入 # Type_Income 收入类型 # Education 教育程度 # Marital_status 婚姻状况 # Housing_type 居住…

使用GPT需要注意的事项

GPT出来之后,基本就告别浏览器搜索问题答案了。将问题原封不动的copy给GPT基本可以得到解答。 但是这个也有弊端,那就是太依赖GPT了。 1,使用GPT需要更强的专业知识:除了能问对问题,还要具备识别GPT&q…

拦截器抛出异常无法被全局异常处理器捕获问题

文章目录 基本说明问题描述问题原因解决方法前端执行的所有请求都通过Controller,而不是直接访问html定义一个/error路径的方法 总结 基本说明 我的前后端项目是放在一起的,前后端都是由springMVC进行控制,但是现在我在拦截器的preHandle方法…

蓝桥杯单元测试专项练习Java版(单元测试4)(修正版)

关于简单循环覆盖法可以看看这里我的上一个文章http://t.csdnimg.cn/k92fn\ 题目4链接:单元测试专项练习(JavaPython) - 第四题单元测试题目(Java) - 蓝桥云课 (lanqiao.cn) 目录 题目描述 源代码功能 原题: Datas.java Good…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别:各目标检测算法评测 论文题目:Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码:https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验:…

计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述 在计算机视觉领域,处理文档数据时,OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正,模型就无法期待模型能够提供准确的预测结果,或者模型预测的精度会降低。例如,在信息提…

助力蓝桥杯单片机省一————模块之超声波

距离蓝桥杯单片机省赛还有7天 本次介绍的模块是超声波模块,将使用定时器1和PCA进行距离的测量。如果对PCA还未了解的,可以打开官方给的芯片数据手册,自行查看。 一、超声波测量原理 二、产生8个40KHz的超声波 void Init_wave() {unsigned …

7 个 iMessage 恢复应用程序/软件可轻松恢复文本

由于误操作、iOS 升级中断、越狱失败、设备损坏等原因,您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是,这种情况经常发生在 iDevice 缺乏备份的情况下。 (iPhone消息消失还占用空间?&…

实际项目中如何使用Git做分支管理

前言 Git是一种强大的分布式版本控制系统,在实际项目开发中使用Git进行分支管理是非常常见的做法,因为它可以帮助团队高效的协作和管理项目的不同版本,今天我们来讲讲在实际项目中最常用的Git分支管理策略Git Flow。 常见的Git分支管理策略…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1)git加入鼠标右键 2)git clone源码 2、VSCode出场 1)创建pyth…