Linux高级 I/O

news2025/1/11 19:40:02

目录

一、五种I/O模型 

1. 阻塞式I/O

2. 非阻塞式I/O

3. I/O复用(多路转接)

4. 信号驱动式I/O

5. 异步I/O

二、五种I/O模型的比较 

三、I/O复用典型使用在下列网络应用场合


一、五种I/O模型 

  • 阻塞式I/O
  • 非阻塞式I/O
  • I/O复用(多路转接)
  • 信号驱动式I/O
  • 异步I/O

I/O我们并不陌生,简单的说就是输入输出;对于一个输入操作通常包括两个不同的阶段:

  1. 等待数据准备好
  2. 从内核向进程复制数据

        对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达,然后被复制到内核的某个缓冲区;第二步就是把数据从内核缓冲区复制到应用进程的缓冲区。

        注:我们以UDP数据报为例,来介绍这五个模型,主要是因为,数据准备好读取的概念比较简单,要么整个数据报已经收到,要么还没有。对于TCP而言,它是面向字节流的,存在水位线的概念,导致理解起来比较复杂。

        接下来我们都会先以一个简单的生活例子来解释这五种I/O模型,然后再对图例进行解释;

1. 阻塞式I/O

        最流行的I/O模型是阻塞式I/O模型,我们之前的博客中基本都采用的是阻塞式I/O(因为默认情况下所有的套接字都是阻塞的)。

生活中的例子:

        对于阻塞式I/O模型,你可以想象一下钓鱼的例子,假设张三就是在这种模型下进行钓鱼,张三带着一根鱼竿去钓鱼,他在完成所有准备工作后,一心一意的在岸边等待着鱼儿上钩,就像是阻塞了一样,直到鱼儿上钩后或者鱼竿坏了才会动作;

模型解释:

        对于上图给出的模型,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发送错误才返回。最常见的错误是系统调用被信号中断。(进程就好比是张三,调用recvfrom不就是用鱼竿钓鱼嘛,数据报就好比是鱼儿,当数据报准备好并复制会后就好比鱼儿吃钩了)

2. 非阻塞式I/O

        对于非阻塞式I/O模型,就是进程把一个套接字设置成非阻塞,本质上就是在通知内核:当所有请求的I/O操作非得把本进程投入睡眠才能完成时,请不要把本进程投入睡眠,而是返回一个错误。

生活中的例子:

        非阻塞式I/O模型,也是钓鱼的例子,这次是李四在钓鱼。李四拿着一个鱼竿,他觉得张三钓鱼太累了(阻塞了),他将所有工作都完成后,定期的检测水面是否有动静,如果有鱼儿吃钩就立马挥动鱼竿将鱼钓上来,否则就去干其他的事情;

模型解释:

        前三次调用recvfrom时没有数据可以返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用recvfrom时已经有一个数据报准备好了,它被复制到应用进程的缓冲区,于是recvfrom成功返回。进而开始处理数据。

        当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询。应用进程持续轮询内核,以查看某个操作是否就绪。这样做往往耗费大量的CPU时间,不过像这样的模型偶尔也会遇到,通常是在专门提供某一种功能的系统中才有。

3. I/O复用(多路转接)

        有了I/O复用(多路转接),我们就可以调用select或poll或epoll,阻塞在这三个系统调用的某一个之上,而不是阻塞在真正的I/O系统调用上。

生活的例子:

        同样的还是钓鱼的例子,这次是王五钓鱼。王五钓鱼的方式与前两位有所不同。王五带来100个鱼竿来钓鱼,将鱼竿全部插在岸边,只要有一个鱼竿有鱼儿上够了,就立马钓上来;这样一来,整体的效率就上来了。

模型解释:

        我们阻塞于select调用,等待数据报套接字变为可读。当select返回套接字可读这一条件时,我们调用recvfrom把所读的数据报复制到应用进程缓冲区中。相比前两个,调用recvfrom就一定不会阻塞,前两个调用recvfrom是将等的时间和读取的时间一起做了,但是I/O复用就讲这两件事分开了。但是感觉I/O复用好像略显劣势,但是使用select最大的亮点就在于它可以等待多个描述符就绪。

4. 信号驱动式I/O

        我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们。我们称这种模型为信号驱动式I/O模型。

生活中的例子:

        赵六在这种方式下进行钓鱼(一根鱼竿),他将所有工作都做好后,在鱼竿上挂了个铃铛,如果铃铛响了就挥动鱼竿将鱼钓上来,否则就根本不管鱼竿。

模型解释:

        我们首先开启套接字的信号驱动功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它并没有被阻塞。当数据报准备好读取时,内核就为改进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom函数读取数据报,并通知主循环数据报已经准备好待处理,也可以立即通知主循环,让他读取数据报。

        无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等待来自信号处理函数的通知:既可以是数据报已准备好被处理,也可以是数据报已准备好被读取。(后续博客有相关程序案例)

5. 异步I/O

        异步I/O的工作机制:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们。这种模型与信号驱动I/O模型的主要区别在于:信号驱动式I/O是有内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

生活中的例子:

        没错还是钓鱼,这次是田七钓鱼。田七是一个有钱的老板,他给了自己的司机一个桶、一个电话、一个鱼竿,让司机去钓鱼,当鱼桶装满的时候再打电话告诉田七来拿鱼,而田七自己则开车去做其他事情去了。

模型解释:

        我们调用aio_read函数,给内核传递描述符、缓冲区指针、缓冲区大小和文件偏移,并告诉内核当整个操作完成时如何通知我们。该系统调用立即返回,而且在等待I/O完成期间,我们的进程不被阻塞。本例子中我们假设要求内核在操作完成时产生某个信号。该信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动式I/O模型。(后续博客有相关程序案例,这里大致了解即可)

二、五种I/O模型的比较 

        如下图所示,前4种模型主要区别在于第一阶段,因为他们第二阶段都是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用。相反,异步I/O模型在这两个阶段都要处理,从而不同于其他4种模型。

同步I/O和异步I/O的比较:

  • 同步I/O:导致请求进程阻塞,直到I/O操作完成;
  • 异步I/O:不导致请求进程阻塞;

简单的讲:就是是否参与了I/O操作;

        前四种I/O模型——阻塞式I/O模型、非阻塞式I/O模型、I/O复用(多路转接)和信号驱动式I/O模型都是同步I/O,因为其中真正的I/O操作(recvfrom)将进程阻塞。只有异步I/O模型是异步I/O。

三、I/O复用典型使用在下列网络应用场合

  • 当客户处理多个描述符时,必须使用I/O复用;
  • 如果一个TCP服务器既要处理监听套接字,又要处理已连接的套接字,一般就要使用I/O复用;
  • 如果一个服务器既要处理TCP,又要处理UDP,一般就要使用I/O复用。
  • 如果一个服务器要处理多个协议或多个服务,一般就需要使用I/O复用。 

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

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

相关文章

ios 计算label宽度方法效率对比

方式1: 设置好label的文字,字号等属性后,调用 self.label.text "111"; self.label.font [UIFont systemFontOfSize:17]; [self.label sizeToFit]; 方式2: 使用字符串的方法计算文字宽度, - (CGRect)boun…

TheFuck—Python写的超实用命令纠正工具

序言 哈喽兄弟们,我们在学习Python的过程中,有这么一款工具,可以轻松纠正我们写错的命令,简直太好用了~ The Fuck 是一款功能强大的、Python编写的应用程序,可用于纠正控制台命令中的错误,非常强大。此外…

Linux多线程(二):线程控制

文章目录一、前言二、认识线程控制函数1.线程创建2.线程退出3.线程等待4.查看线程id5.线程分离6.综合demo三、线程id本质是地址?一、前言 上篇博客谈到,Linux并没有真线程,而是通过复用进程的数据结构来模拟实现线程的。因此 Linux 自然不会提…

所有的为时已晚都是恰逢其时,社科院与杜兰大学金融管理硕士邀你在职读研

最近有咨询的同学询问,我年龄快35岁了读研晚吗?记得在网上看到过一句话,你觉得为时已晚的时候,恰恰是最早的时候。你可以确定一下你的内心,是不是真的想读研,既然迟早要读的话,与其等到了40、50…

ISO 15765-2协议分享(一)- TP时间参数详解

文章目录 前言一、时间参数协议定义二、使用步骤 1.引入库2.读入数据总结前言 无大志者常立志,让自己生活中时时有目标,有努力的方向。 老规矩,正文前分享喜欢的文字: 生活中,你越是去竭力回避不适的感觉,就越是难以推进生活中的重要转变。 不回避,积极面对,是提升自…

蓝奥声网关为什么会受到广大用户的欢迎?

蓝奥声GP20蓝牙网关是一款支持无线和有线连接的智能网关,配有独特的网口驱动,支持带有TCP/IP的以太网接口。用于互联网访问和与主机服务器的通信,用于远程命令和本地处理数据的数据上传/下载。它支持 RJ45/POE 和 WiFi 两种网络角色。 GP20蓝…

点面科技荣获优胜企业奖,圆满从2022“创·在上海”国际创新创业大赛之“创·加速营”毕业

创在上海 赢在未来 “创在上海”国际创新创业大赛暨中国创新创业大赛 (上海赛区) 是一项具有广泛影响力的创新创业活动。 为提升入围全国赛的参赛企业的参赛能力,“创在上海”将充分整合和调动多方资源,结合国赛进程,创新推出针对入围国赛企…

Git常用命令总结

配置git 本地创建 ssh key: ssh keygen -t rsa -c “email” // email:github上注册用的邮箱 把上面生成的 key 粘贴到 gitHUb中的 sshkey中 验证 是否成功 ssh -T gitgithub.com 如果是第一次的会 提示 是否continue ,输入 yes 就会看到 You’ve succe…

Springboot健康上报小程序: element后台管理系统(完整代码)

这几天接到了个学生的需求,挺简单的,大概就是按照她的需求做一个疫情期间常态化管理的小程序,由于我对java不熟悉,基本上是边做边学,这里我将对本次项目做个记录 ✨✨欢迎订阅本专栏或者关注我,大家一起努力…

内科大机器学习框架课程重点内容笔记

文章目录一.背景二.内容一.背景 这是2020届内科大机器学习框架课程的考试复习内容 二.内容 1.变量间的相互关系: (1)确定性关系或函数关系:研究的是确定现象非随机变量间的关系。 (2)相关关系或统计依赖关系:研究的是非确定现象随机变量间…

计算机毕设Python+Vue校园一卡通管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

外滩金融峰会公布“第七届融城杯十佳案例”,工行、创邻科技等成功上榜

12月11日,由中国金融四十人论坛(CF40)主办的第四届外滩金融峰会在上海召开。国家副主席王岐山为峰会致开幕辞,中国人民银行原行长周小川、上海新金融研究院理事长屠光绍、中国人民银行副行长宣昌能、中央财经委员会办公室副主任尹…

存储mybatis的xml标签,动态sql 查询

前言: 通过表动态存储mybatis 的xml标签,通过动态sql 入参查询,方便更新查询逻辑,无需发版即可;(当前用的是 mybatis-plus ,db用的是oracle【这个无所谓】) 注意事项:这…

【C】带你复习有趣的函数

作者 :会敲代码的Steve 墓志铭:博学笃志,切问静思。 前言:本文旨在总结C语言函数章节的知识点、分为以下九个模块、分别是: 1.函数是什么 2.库函数 3.自定义函数 4.函数参数 5.函数调用 6.函数的嵌套调用和链式…

vue3计算属性和侦听与script setup区别使用

一、计算属性computed 计算属性&#xff0c;只要依赖值不变&#xff0c;那么不会重新计算计算属性将基于它们的反应依赖关系缓存&#xff0c;提高性能对于任何包含响应式数据的复杂逻辑&#xff0c;应该使用计算属性 <template><!--重复使用--><p>{{ msg.s…

Redis——好友关注、共同关注、Feed流推送

1. 好友关注 在探店图文的详情页面中&#xff0c;可以关注发布笔记的作者&#xff1a; 进到探店笔记详情页&#xff0c;会发出两个请求&#xff0c;1是判断是否已经关注&#xff0c;2是尝试关注用户的请求。 关注是User之间的关系&#xff0c;是博主与粉丝的关系&#xff0c;…

你用过猿如意吗?猿如意可以使用ChatGPT哦,这里详细介绍了猿如意的功能,为什么我建议你使用猿如意,来看看吧

文章内容介绍 你是否还在为为每次安装IDE&#xff08;集成开发工具&#xff09;要去各种网站找教程而烦恼&#xff1f;你是否还在为各种文本格式转换而头痛&#xff1f;你是否在为斗图都不过兄弟们而卑微&#xff1f;你是否在为互联网中庞大冗杂却低效的教程文档而崩溃&#x…

SpringMVC:SpringMVC响应结果(7)

响应结果1. 环境准备2. 响应页面3. 响应文本数据4. 响应JSON数据&#xff08;掌握&#xff09;4.1 响应POJO对象4.2 响应POJO集合对象1. 环境准备 项目结构 pom.xml添加Spring依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"…

Mathtype / Word OMML / Latex 公式相互转换

文章目录Part.I 快应用Part.II 详细操作Chap.I Mathtype ↔ WordChap.II Mathtype ↔ LatexChap.III Latex ↔ WordPart.I 快应用 本文介绍了除了使用 Word 和 Mathtype 之外不使用其他任何辅助软件来实现三者相互转换的方法。 项目操作方法Mathtype 转成 Word OMMLWord菜单栏→…

信息化课堂怎么控屏教学的

现在的很多学校都在建设机房进行互动教学&#xff0c;相比于传统的教学方法&#xff0c;计算机的教学方式能够直观的表达每堂课的知识点&#xff0c;过程更为新颖&#xff0c;有利于吸引学生的注意力&#xff0c;提高在学习过程中的专注力。 但是&#xff0c;在提高增加课堂中学…