【linux高级IO(一)】理解五种IO模型

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

Linux高级IO

  • 1. 前言
  • 2. 重谈对IO的理解
  • 3. 阻塞IO讲解
  • 4. 非阻塞IO讲解
  • 5. 信号驱动IO
  • 6. IO多路转接
  • 7. 异步IO
  • 8. 理解异步和同步
  • 9. 总结以及拓展

1. 前言

本篇文章开始, 将与大家分享高级IO相关的内容
本章重点:

本篇文章会带大家初识五种常见的IO模型, 分别是: 阻塞IO, 非阻塞IO, 信号驱动IO, IO多路转接, 异步IO. 其中, 多路转接将会是本系列文章后续的重点


2. 重谈对IO的理解

IO: input or output --> 访问外设 效率低
IO一定是非常低效的, 以读取为例:

当我们read/recv时, 如果底层缓冲区没有数据, read/recv函数会阻塞
当我们read/recv时, 如果底层缓冲区有数据, read/recv函数会拷贝

所以说, IO = 等待 + 拷贝 !!!

记住这句话, 会一直贯穿整个IO系列文章

探讨低效IO和高效IO:

很明显, IO = 等待 + 拷贝.
所以可以得出下面的结论:

  • 低效IO: 单位时间内, 大部分时间, IO类接口都在等待
  • 高效IO: 让等待的比重降低

接下来的五种IO模型, 就是围绕着是否高效进行的


3. 阻塞IO讲解

正如其名, 阻塞IO 在内核将数据准备好之前, 系统调用会一直等待, 并且所有的套接字默认都是阻塞IO. 阻塞IO是最常见的IO模型, 它比较好理解, 下面是关于阻塞IO的图像讲解

在这里插入图片描述

通俗来讲, 阻塞IO就是, 你去河边钓鱼, 只拿一根鱼竿等于上钩, 并且时刻盯着水面


4. 非阻塞IO讲解

顾名思义, 非阻塞IO就是说, 当底层数据没有准备就绪时, 不会傻傻的等待, 而是直接返回. 但是调用recv时, 出现错误也会直接返回, 应该怎样区分这两种情况呢? 答案是阻塞式IO的正常返回时, 会将errno全局遍历设置为宏: EWOULDBLOCK. 这下就能将它们区分开了

在这里插入图片描述

非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一般只有特定场景下才使用. 下面是非阻塞IO的简单示例:

#include <fcntl.h>
#include <unistd.h>
#include<errno.h>
#include <cstdlib>
#include <iostream>
using namespace std;//对指定的fd设置非阻塞
void SetNonBlock(int fd) {int fl = fcntl(fd, F_GETFL);if (fl < 0) {cerr << "fcntl error" << endl;exit(1);}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}int main() {SetNonBlock(0);while (1) {char buffer[1024];ssize_t s = read(0, buffer, sizeof(buffer) - 1);if (s > 0) {buffer[s] = 0;cout << buffer << endl;} else if (s == 0) {cout << "读到文件结尾了" << endl;break;}else{//1. 数据没用准备好 2. 真的出错了. 都以-1的返回值返回// 数据没有准备好,不算出错. 需要区分这两种情况if(errno == EWOULDBLOCK || errno == EAGAIN){cout<<"os底层数据还没就绪"<<endl;cout<<errno<<endl;}//被信号中断, 也不算read出错else if(errno == EINTR){cout<<"IO interrupted by signal"<<endl;}else{cout<<"read error"<<endl;break;}}sleep(1);}
}

调用fcntl函数将fd设置为非阻塞

通俗来讲, 非阻塞IO就是, 你去河边钓鱼, 也只用一根鱼竿, 但是你过一分钟才去看看有没有鱼上钩, 其他时间你可能在刷抖音


5. 信号驱动IO

信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作. 也就是说信号驱动的方式你不用像非阻塞IO一样, 每过一段时间去检查是否有数据就绪, 一旦有数据就绪, 会有信号通知你, 这也就可以更多时间刷抖音了(不是)

在这里插入图片描述

通俗来讲, 信号驱动IO就是, 你去河边钓鱼, 也只拿一个鱼竿, 只不过鱼竿上有压力传感器, 一旦有鱼上钩就会发出声音提醒你. 其余时间我们当然可以愉快的刷抖音


6. IO多路转接

前面几个钓鱼的人是不是有点寒酸了?一次只拿一个鱼竿, 效率太低了吧! 多路转接直接把桌子掀了, 它拿了100个鱼竿去钓鱼: IO多路转接能够同时等待多个文件描述符的就绪状态

在这里插入图片描述

通俗来说就是你拿一百个鱼竿去钓鱼, 同时等待一百种可能, 一旦有鱼上钩了, 会同时把所有上钩的鱼都拉上来, 这效率简直是指数级增长, 所以这也是在实际生活中使用的最多的IO方案


7. 异步IO

前面所有的IO方式, 都是同步IO, IO=等待+拷贝, 同步IO就是要么参与了等待过程, 要么参与了拷贝过程, 要么都参与了. 而异步IO则是等待和拷贝都不参与: 由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据).

在这里插入图片描述

还是拿钓鱼的例子来说, 前面的钓鱼者, 不管你一次性带多少鱼竿(多路转接), 不管你在鱼竿上安装什么高科技(信号驱动), 但是你总得去河边, 自己拿着鱼竿钓鱼. 而异步IO是怎么做的呢? 他直接雇佣了一个人帮它去钓鱼, 什么时候鱼上钩, 你等待了多久我都不在乎, 我只需要你在晚上九点的时候将钓的鱼全部带给我即可.


8. 理解异步和同步

同步和异步关注的是消息通信机制.

在这里插入图片描述

同步和异步在实际场景中怎样运用?

虽然说大部分IO类型都是同步IO, 但是实际生活中运用异步IO的概率也不小. 举个例子, 你是王者荣耀的后端, 一个英雄放了一个技能打在对面身上, 此时我们后端要将这个操作做成同步的还是异步的? 很明显是同步, 因为我想要实时的看见对面英雄的血条在减少. 再举个例子, 现在你是QQ的后端, 你现在要查询一千万个QQ号中, 有哪些QQ号超过1个月没有上线了. 你把此功能做成同步还是异步? 很明显考虑到成本问题一定是做成异步, 一千万个QQ号如果用一台机器可能会查询几个小时, 你可能会说, 那我可以用多台机器做负载均衡, 是的没错, 但是机器数量多了, 成本就上去了. 所以做成异步的IO比较好

综上所述, 实际场景中要根据自己的情况和需求来觉得使用同步还是异步, 不要觉得在学习时都用同步, 以后工作了也就无脑的用同步


9. 总结以及拓展

本篇文章只是简单的介绍了IO模型的几个分类, 其中, 最重要的模型是多路转接, 后面的文章会着重讲解它. 多路转接为什么重要? 因为它是业内最常用的用来提高并发性的模型, 后续大家都接触都reactor模型, 而reactor模型可以有多种实现方式, 而效率最高的reactor模型则是用多路转接实现的!!!


🔎 下期预告:多路转接之select 🔍

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

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

相关文章

kubernetes dashboard安装

1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 对应版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改对应的yaml,…

adb不插usb线通过wifi调试

说起做手机开发也有好多年了&#xff0c;说来惭愧&#xff0c;我最近才知道安卓手机是可以不插数据线进行开发调试的。起因是公司近期采购了一批安卓一卡通设备&#xff0c;需要对其进行定制开发APP,但是由于我插USB调试发现没有反应。通过询问厂家才知道可以通过WIFI进行调试。…

请注意,以下这几种操作都会导致流量卡被停用!

最近一段时间&#xff0c;小编经常收到一些反馈&#xff0c;明明是刚办理的手机号还没有用几天就被停用了&#xff0c;今天&#xff0c;这篇文章我们要了解就是手机号被停用的问题。 ​ 对于新办理的手机号会被停用这个问题&#xff0c;主要还是因为运营商为了防止电话诈骗&…

java数据结构集合复习之包装类和泛型

前言: 这是我最一年学习java的一部分的回顾总结 1.包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1.1基本数据类型和对应的包装类 ----—基本数据类型包装类…

ubuntu软件源的两种格式和环境变量

1. ubuntu的/etc是什么目录&#xff1f; 在Ubuntu操作系统中&#xff0c;/etc/是一个特殊的目录&#xff0c;它包含系统的配置文件。这些配置文件用于设置各种系统和应用程序的参数和选项。 一般来说&#xff0c;用户可以在这个目录下找到各种重要的配置文件&#xff0c;如网络…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括为以下几点&#xff0c;Web3 ETF仍是一项新兴投资产品&#xff0c;其长期表现仍存在不确定性。投资者在投资Web3 ETF之前应仔细研究相关风险&#xff0c;并做好充分的风险评估。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

BBA车主,千万别去试驾问界M9

文 | AUTO芯球 作者 | 雷慢&响铃 我劝你啊&#xff0c;千万别去试驾问界M9&#xff0c; 不然啊&#xff0c;可能1个小时50万就没了&#xff0c; 不信你看这个“大冤种”&#xff0c; 他曾经发誓打死不买电车&#xff0c; 考虑了三、四年换宝马X5&#xff0c; 结果谈完…

前端面试题5(前端常见的加密方式)

前端常见的加密方式 在前端进行数据加密主要是为了保护用户的隐私和提升数据传输的安全性。前端数据加密可以采用多种方法&#xff0c;以下是一些常见的加密技术和方法&#xff1a; 1. HTTPS 虽然不是直接的前端加密技术&#xff0c;但HTTPS是保障前端与后端数据传输安全的基…

关于MCU-Cortex M7的存储结构(flash与SRAM)

MCU并没有DDR&#xff0c;所以他把代码存储在flash上&#xff0c;临时变量和栈运行在SRAM上。之所以这么做是因为MCU的cpu频率很低&#xff0c;都是几十MHZ到一二百MHZ&#xff0c;flash的读取速度能够满足cpu 的取指需求&#xff0c;但flash 的写入速度很慢&#xff0c;所以引…

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况&#xff0c;那么你知道你的手机号为什么会被停用吗&#xff1f;接下来&#xff0c;关于手机号被停用的问题&#xff0c;跟着小编一块来了解一下吧。 ​停机的两种形态&#xff1a; 1、第一个是局方停机&#xff0c;即语音、短信和流量都不…

xmind2testcase工具将测试用例从Xmind转为CSV导入禅道

使用xmind编写测试用例&#xff0c;使用xmind2testcase工具将测试用例从Xmind转为CSV导入禅道&#xff0c;便于管理。 1.工具准备 第一步&#xff1a;安装python 第二步&#xff1a;安装xmind2testcase工具 运行-cmd-打开命令提示符弹窗&#xff0c;输入安装命令 安装命令&…

意图数据集HWU、Banking预处理

当谈到意图数据集时&#xff0c;HWU、Banking和Clinc是三个常见的数据集。以下是关于这三个数据集的介绍&#xff1a; 目录 一、数据集介绍 HWU数据集 Banking数据集 Clinc数据集 二、数据集预处理 数据处理 数据存储 数据类别分析 句子长度统计 一、数据集介绍 HW…

AI产品经理能力模型的重点素质:人文素养和灵魂境界

在AI产品经理的能力模型中&#xff0c;我最想提的差异化关键点&#xff0c;就是“人文素养和灵魂境界”。 1 为什么“人文素养和灵魂境界”非常重要&#xff1f; 一、“人文素养和灵魂境界”如何影响AI产品设计&#xff1f; 例1&#xff1a;面对一个具体的AI场景&#xff0…

25考研,数二全程跟的张宇老师请问660(做了一半)880和张宇1000题应该怎么选择?

跟张宇老师&#xff0c;也可以做其他的题集&#xff0c;不一定非要做1000题 我当初考研复习的时候&#xff0c;也听了张宇老师的课程&#xff0c;但是我并没有做1000题 因为1000题对于我来说太难了。做了一章之后&#xff0c;就换成其他的题目了。 对于大家来说&#xff0c;…

ppt接单渠道大公开‼️

PPT 接单主要分两种&#xff1a;PPT 模板投稿和PPT 定制接单&#xff0c;我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间&#xff0c;做一些 PPT 模板上传到平台&#xff0c;只要有人下载你的模板&#xff0c;你就有收入。如果模板质量高&#xff0c;简直就是一…

【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

文章目录 定义结构Demo | 代码Subject目标类Observer抽象观察者观察者1 | CPU监听器观察者2 | 内存监听器客户端 | Client 优点适合场景 定义 所谓观察者模式就是你是被观察的那个对象&#xff0c;你爸爸妈妈就是观察者&#xff0c;一天24h盯着你&#xff0c;一旦你不听话&…

【BUUCTF-PWN】7-[第五空间2019 决赛]PWN5

参考&#xff1a;BUU pwn [第五空间2019 决赛]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客园 (cnblogs.com) 格式化字符串漏洞原理详解_printf 任意内存读取-CSDN博客 32位小端排序&#xff0c;有栈溢出保护 运行效果&#xff1a; 查看main函数 存在格式化字符串漏洞 输…

SQL二次注入原理分析

二次注入在测试的时候比较少见&#xff0c;或者说很难被测出来&#xff0c;因为测的时候首先要去找注入的位置&#xff0c;其次是去判断第一次执行的SQL语句&#xff0c;然后还要去判断第二次进行调用的 SQL 语句。而关键问题就出在第二次的调用上面。 下面以一个常用过滤方法…

macos下搭建minikube dashboard的启动

背景 最近在复习一下k8s环境相关的知识&#xff0c;需要在自己电脑上搭建一个minikube的环境供自己使用。但是因为docker的镜像仓库最近被墙了&#xff0c;因此在执行minikube dashboard的时候&#xff0c;拉不到相应的镜像&#xff0c;就导致页面看不到相应的一些信息因此本文…