【Linux】高级IO——五种IO模型和基本概念 ,非阻塞IO,fcntl,实现非阻塞IO,同步通信和异步通信

文章目录

  • Linux高级IO
    • 1. 五种IO模型
      • 1.1 阻塞IO
      • 1.2 非阻塞IO
      • 1.3 信号驱动IO
      • 1.4 IO多路转接
      • 1.5 异步IO
    • 2. 同步通信和异步通信
    • 3. 阻塞和非阻塞

Linux高级IO

1. 五种IO模型

  IO是什么?

  IO是计算机领域中的缩写,指的是输入/输出(Input/Output)。在计算机系统中,IO通常指的是计算机与外部设备(如键盘、鼠标、显示器、硬盘、网络等)之间的数据交换过程。

  输入(Input) 输入指的是数据从外部设备传输到计算机系统内部的过程。例如:从键盘输入文字或命令到计算机中;从网络接收数据包;从磁盘读取文件内容。

  输出(Output) 输出指的是数据从计算机系统传输到外部设备的过程。例如:将计算机处理后的数据显示在屏幕上;将数据写入到打印机以打印文档;将文件保存到硬盘上。

  

  数据是怎么从输入到输出的呢,过程是什么样的?

  简单的看,调用read和write函数将数据传入OS,由OS传给不同的外设。

  输入和输出(IO)的过程发生在计算机系统与外部环境之间的数据交换过程中。在计算机系统内部,IO的过程涉及多个层次和组件:

  应用层:应用程序通过调用操作系统提供的IO接口(如read和write函数)来实现数据的输入和输出。

  操作系统操作系统负责管理和调度IO操作,包括与设备驱动程序的交互、数据缓存、IO调度等。

  设备驱动程序:设备驱动程序是操作系统和硬件设备之间的接口,负责控制和管理具体的硬件设备,处理来自设备的IO请求和响应。

  总结来说,IO过程涉及了从用户层到操作系统内核的数据传输,以及操作系统到物理设备或网络的数据传输过程。

  

  操作系统怎么判断IO发生,或者说是输入输出发生?

  通常在系统调用,硬件中断,状态改变,网络活动,资源占用这些情况下会产生IO事件。

  在计算机系统中,IO操作通常可以分解为两个主要阶段:等待(或者说请求)和拷贝(或传输)。在理解拷贝条件是否发生之前,需要考虑以下几个关键点:

  判断等待(或请求)条件发生:

  IO请求发起:应用程序发出IO请求,例如读取文件内容、发送网络数据等。

  系统调用:操作系统接收到应用程序的IO请求,然后开始进行IO操作的准备工作,这通常包括分配内核缓冲区、准备硬件接口等。

  判断拷贝(或传输)条件发生:

  系统调用返回:当应用程序发出读取或写入请求后,操作系统会开始处理这个请求,并最终完成数据的拷贝操作。可以通过系统调用的返回状态来判断拷贝操作是否已经完成。

  数据可用性:在读取操作中,可以通过检查读取的数据是否已经在应用程序的缓冲区中可用来判断拷贝操作是否完成。类似地,在写入操作中,可以通过检查数据是否成功地传输到目标设备或目标位置来确认拷贝操作的完成。

  事件通知:有些IO操作在完成后会通过事件通知机制来通知应用程序,例如异步IO模型中的完成事件或回调。应用程序可以通过这些事件或回调来确认拷贝操作已经完成。

  

  所以为了提高数据交互的效率,我们要提高IO操作的效率。

  

  总结来说:

  1. IO就是Input和Output,是计算机与外部进行交换的过程。

  2. 为了实现应用层的数据交换,我们通常使用read和write函数,本质上就是把数据从用户层写给操作系统,再本质上就是拷贝函数。

  3. IO = 等 + 拷贝 ,再进行拷贝之前,我们要判断拷贝条件是否发生。

  4. 所以我们想要实现高效的IO,在单位的时间里,等 或 拷贝 的时间越小效率越高,但是一般拷贝的时间差不多,所以怎么降低 等 的比重,就是我们提高IO效率的办法。

  

  所以说下面的可以提高IO效率的模型,都是降低了等待的时间。

  怎么降低等待的时间呢?

  

  我们先以简单的钓鱼例子来概括一下这五种IO模型:

  阻塞IO模型:你投放鱼饵后,就等待鱼儿咬钩。在等待鱼咬钩的过程中,不能做其他事情,只能一直盯着浮标,直到有鱼上钩。

  非阻塞IO模型:你在每次投放鱼饵后,你不会傻等鱼儿上钩,而是不断定期检查浮标的状态。如果没有鱼上钩,就继续做其他事情,直到鱼上钩就收杆。

  IO复用模型:你可能会使用多根钓竿,使用10个鱼竿,100个鱼竿,可以是无穷的鱼竿,当有任何一根钓竿的浮标动了,你就知道有鱼上钩,然后去收杆。

  信号驱动IO模型:你可能会使用自动报警装置。每次投放鱼饵后,设定了一个报警器,当有鱼上钩时触发报警器发出信号。在听到报警器响时,立即去收杆。

  异步IO模型:你会雇佣一个专业的钓鱼服务公司。他们会使用不同的钓鱼方式,但是你完全不用关心,你只要他们通知你来收杆就可以了。

  

1.1 阻塞IO

  阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式。

  阻塞IO是最常见的IO模型。
在这里插入图片描述

1.2 非阻塞IO

  非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码。

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

在这里插入图片描述

  

1.3 信号驱动IO

  信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作

在这里插入图片描述

  

1.4 IO多路转接

  IO多路转接: 虽然从流程图上看起来和阻塞IO类似. 实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态。

在这里插入图片描述

  

1.5 异步IO

  异步IO: 由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。

在这里插入图片描述

  总结:任何IO过程中,都包含两个步骤:第一是等待,第二是拷贝。而且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间,让IO更高效,最核心的办法就是让等待的时间尽量少。

  

2. 同步通信和异步通信

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

  所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了; 换句话说,就是由调用者主动等待这个调用的结果

  异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果; 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用

  同步通信:类比钓鱼例子,同步通信就像你投放鱼饵后,自己必须一直盯着浮标,直到鱼上钩才能继续下一步操作。这种方式下,发送方和接收方都必须严格按照某种约定的时间或步骤进行操作,以确保信息的同步传输和处理。

  异步通信:类比钓鱼例子,异步通信就像你投放鱼饵后不再一直盯着浮标,而是定期检查浮标的状态。你可以在等待鱼上钩的同时做其他事情,当浮标动了或者有鱼上钩时,你会得到通知,然后再去收杆。

  

3. 阻塞和非阻塞

  阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。

  非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  类比钓鱼例子,阻塞就像你投放鱼饵后,不得不一直盯着浮标,不能离开或者做其他事情,直到鱼上钩。

  类比钓鱼例子,非阻塞就像你投放鱼饵后,定期检查浮标的状态。如果浮标没有动,你可以继续做其他事情,不需要一直等待鱼上钩。

          

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

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

相关文章

设置日历程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 设置日历 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void dateTimePicker1_ValueChanged(object sender, EventArgs e){richTextBox1.Text dateTimePicker1.T…

linux系统中vim ls grep等命令无法使用

linux突然vim ls grep等命令无法使用 系统配置路径被修改导致无法使用: echo $PATH 查看配置路径 添加路径 执行以下命令 export PATH$PATH:/root/bin export PATH$PATH:/usr/sbin

基于ARM的通用的Qt移植思路

文章目录 实验环境介绍一、确认Qt版本二、确认交叉编译工具链三、配置Qt3.1、修改qmake.conf3.2、创建autoConfig.sh配置文件 四、编译安装Qt五、移植Qt安装目录六、配置Qt creator6.1、配置qmake6.2、配置GCC编译器6.3、配置G编译器6.4、配置编译器套件6.5、创建应用 七、总结…

Keil Pack Installer

本文仅介绍了安装Pack,今晚2024-6-28会录制视频,详细讲解安装卸载的各种方法 前言 大家好,我是梁国庆。 收到粉丝留言,说 Keil 安装 Pack 不太明白,可不可以详细演示一下? 当然可以有,本篇安…

搭建一个简单的xxljob

数据库表结构: YyJobInfo: public class YyJobInfo {//定时任务idprivate int id;//该定时任务所属的执行器的idprivate int jobGroup;//定时任务描述private String jobDesc;//定时任务添加的时间private Date addTime;//定时任务的更新时间private D…

百问网全志D1h开发板投屏功能实现

投屏功能实现 D1系列号称点屏神器,不仅能点屏,还能用于投屏。 源码准备 百问网为 【百问网D1h开发板】提供了投屏功能需要使用的源码,直接git下载即可: git clone https://github.com/DongshanPI/DongshannezhaSTU_DLNA_Scree…

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞(一) 专项漏洞部分注重测试方法论,每个专项仅列举一个例子。实际测试过程中,需视情况而定。 文章目录 Web应用安全测试-专项漏洞(一)Web组件(SSL/WebDAV)漏…

擎耀解码汽车大灯照明系统电动调节步进电机位置反馈的解决方案

在现代汽车设计中,智能照明系统扮演着至关重要的角色。其中,汽车大灯的电动调节功能不仅提高了夜间行车的安全性,还增强了车辆的科技感和便利性。然而,要实现精准的大灯角度调节,步进电机的位置反馈机制尤为关键。擎耀…

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充&#xff…

SpringBoot脚手架MySpringBootAPI(PgSQL+Druid+MyBatisPlus+Lombok)

MySpringBootAPI SpringBoot脚手架,基于SpringBootDruidPgSQLMyBatisPlusFastJSONLombok,其他的请自行添加和配置。 Author powered by Moshow郑锴(大狼狗) , https://zhengkai.blog.csdn.net 如何运行 1.首先确保你是JDK17,推荐微软的MSJDK…

Links: Challenging Puzzle Game Template(益智游戏模板)

链接:挑战益智游戏 《Links》是一款独特且具有挑战性的益智游戏,即将发布。 每个级别都会向玩家展示不同的棋盘。目标是通过移动和旋转所有棋子来连接它们。每个棋子都有自己的特点和功能-你可以移动它们,旋转它们,或者两者兼而有之。连接所有棋子,以解决难度和挑战不断增…

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

目录 一、访问控制技术 二、信息安全的抗攻击技术 2.1 分布式拒绝服务DDoS与防御 2.3 ARP欺骗攻击与防御 2.4 DNS欺骗与防御 2.5 IP欺骗与防御 2.6 端口扫描(Port Scanning) 2.7 强化TCP/IP堆栈以抵御拒绝服务攻击 2.8 系统漏洞扫描 三、信息安…

实现矩阵乘法【矩阵乘法复杂度优化】

实现矩阵乘法【矩阵乘法复杂度优化】 题目描述:解题思路一:使用NumPy库解题思路二:三个for循环解题思路三:分块矩阵乘法, 利用多线程或多进程 题目描述: 实现矩阵乘法【矩阵乘法复杂度优化】 解题思路一:…

面试突击:Java 集合知识体系梳理

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 前言 哈喽,大家好,我是 DanMu。在 Java 开发中,集合类对象绝对是被使用最频繁的对象之一。因此,深入了解集合类对象的底层数…

World of Warcraft T2.5

World of Warcraft T2.5 猎人和术士套装需要的材料,好多啊,废墟和神殿打材料 猎人: 术士:

k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录 zookeeper什么是zookeeper基本概念主要功能工作原理使用场景优点缺点 k8s集群部署zookeeper环境一、zookeeper部署YAML资源清单准备二、zookeeper部署及部署验证三、zookeeper应用验证 zookeeper 什么是zookeeper ZooKeeper 是一个开源的分布式协调服务,…

多线程(基础)

前言👀~ 上一章我们介绍了什么是进程,对于进程就了解那么多即可,我们作为java程序员更关注线程,线程内容比较多,所以我们要分好几部分才能讲完 目录 进程的缺点 多线程(重要) 进程和线程的区…

数据结构速成--树和二叉树

由于是速成专题,因此内容不会十分全面,只会涵盖考试重点,各学校课程要求不同 ,大家可以按照考纲复习,不全面的内容,可以看一下小编主页数据结构初阶的内容,找到对应专题详细学习一下。 气死了…

昇思25天学习打卡营第4天|数据集Dataset

数据集 Dataset 介绍 之前说过,MindSpore是基于Pipeline,通过Dataset和Transformer进行数据处理。Dataset在其中是用来加载原始数据的。mindSpore提供了数据集加载接口,可以加载文本、图像、音频等,同时也可以自定义加载接口。此…

乾坤微服务的使用

前言: 在这里整理下用乾坤来开发微服务的一些资料。 使用好处: 使用乾坤可以实现什么效果呢?众所周知,前端的框架五花八门,react/vue/angular等各领风骚,那么如果我们有需要把不同技术栈的项目整合起来&…