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

news2024/11/26 6:20:07

文章目录

  • 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.coloradmin.cn/o/1872009.html

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

相关文章

(番外篇)指针的一些相关习题讲解(速进,干货满满)(1)

前言: 我已经好久没写过博客了,这几天确实有点偷懒了,上次博客我们已经讲完了指针的部分内容,但我觉着没有习题是不够的,于是我出了这一篇番外篇,来让各位读者朋友们进行指针强化,这些题目都是小…

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

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

中北大学算法课动态规划问题实验:题目1 数塔问题

目录 1.实验名称2.实验目的3.实验内容4.实验过程伪代码java代码 5.实验结论及心得代码运行截图心得 实验报告 1.实验名称 动态规划问题实验:题目1 数塔问题 2.实验目的 (1)掌握动态规划法的设计思想; (2)掌握数塔问题的具体实现过程; (3)熟…

Zynq7000系列FPGA中的DMA控制器简介(一)

DMA控制器(DMAC)使用64位AXI主接口来执行与系统存储器和PL外围设备之间的DMA数据传输,操作频率同CPU_2x的时钟速率。传输由DMA指令执行引擎控制。DMA引擎运行在一个小指令集上,该指令集提供了一种灵活的指定DMA传输的方法。这种方…

Echarts图表的动画是如何实现的?一文为你解密,有图有代码

Echarts图表是可视化大屏中最常用组件,我们经常看到各种炫酷的图表动画效果,但是你知道这些动画效果叫什么,是如何实现的吗?今天贝格前端工场为大家分享一下。 一、Echarts图表动画有哪些类型? ECharts是一个基于Jav…

鸿蒙开发HarmonyOS NEXT (二) 熟悉ArkUI

一、构造函数 构造一个商品类Item,然后利用foreach函数循环渲染 class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number 0) {this.name name;this.image ima…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于最大信息系数-双层置信极端梯度提升树的电网虚假数据注入攻击定位检测》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Python 全栈体系【三阶】(一)

三阶:Django - Redis - Ajax 第一章 Django 一、Django 基础 1. 基础 Django是一个开源的、重量级的WEB开发框架。 Django的官网: https://www.djangoproject.com 2. 安装与卸载 Django Django目前最新的版本为4.2,教学环境使用3.2 2.1 在线安装 …

libctk shared library的设计及编码实践记录

一、引言 1.1 <libctk>的由来 1.2 <libctk>的设计理论依据 1.3 <libctk>的设计理念 二、<libctk>的依赖库 三、<libctk>的目录说明 四、<libctk>的功能模块及使用实例说明 4.1 日志模块 4.2 mysql client模块 4.3 ftp client模块 4…

【Python】已解决:(SqlServer报错)SQL错误(208):对象名‘string_split’无效

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;&#xff08;SqlServer报错&#xff09;SQL错误&#xff08;208&#xff09;&#xff1a;对象名‘string_split’无效 一、分析问题背景 在使用Python连接SqlSe…

移动UI:我的界面,竟然有这么设计方式,而且个个都简洁美观。

移动应用中的个人中心页面通常包含以下内容&#xff1a; 1. 用户头像和昵称&#xff1a;展示用户的头像和昵称&#xff0c;用于个人身份的展示和识别。 2. 个人资料&#xff1a;展示用户的个人信息&#xff0c;如姓名、性别、生日、联系方式等。用户可以在这里查看和编辑自己…

增量模型:软件开发中的渐进式进步

目录 前言1. 什么是增量模型1.1 增量模型的工作原理1.2 增量模型与其他开发模型的对比 2. 增量模型的优势2.1 早期交付与用户反馈2.2 降低风险2.3 提高开发效率2.4 改进的项目管理 3. 增量模型的应用场景3.1 需求不明确的项目3.2 大型复杂项目3.3 有明确阶段性目标的项目 4. 增…

如何在LabVIEW中使用FPGA模块

LabVIEW FPGA模块是NI公司推出的一款强大工具&#xff0c;它允许用户使用LabVIEW图形化编程环境来开发FPGA&#xff08;现场可编程门阵列&#xff09;应用程序。与传统的HDL&#xff08;硬件描述语言&#xff09;编程相比&#xff0c;LabVIEW FPGA模块大大简化了FPGA开发的过程…

高效利用iCloud指南:打造无缝连接的数字生活

iCloud是苹果公司推出的一项云存储和云计算服务&#xff0c;它为用户提供了一个安全、便捷的云端存储空间&#xff0c;帮助用户在各个苹果设备之间无缝同步数据。无论是照片、文档、备忘录&#xff0c;还是应用程序数据&#xff0c;iCloud都能让你的数字生活更加高效和有序。本…

ECharts 源码代码规范

代码规范 - Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。https://echarts.apache.org/zh/coding-standard.html 源文件 [强制] JavaScr…

9. Revit API UI: UIView、UIDocument、框选聚焦

9. Revit API UI: UIView、UIDocument、框选聚焦 UI命名空间下的API&#xff0c;到这里差不多就押送讲完了&#xff0c;同Application那篇所讲的几个类与接口&#xff0c;都是带UI的对应了一个不带UI的&#xff0c;如UIApplication和Application&#xff0c;作用呢&#xff0c…

理解MySQL核心技术:外键(Foreign Key)的设计与实现

在日常开发中&#xff0c;数据库是必不可少的部分&#xff0c;而MySQL作为最流行的关系型数据库之一&#xff0c;广泛应用于各类项目中。为了确保数据的完整性和一致性&#xff0c;外键&#xff08;Foreign Key&#xff09;无疑是一个重要的概念。在本篇文章中&#xff0c;我们…

Py之dashscope:dashscope的简介、安装和使用方法、案例应用之详细攻略

Py之dashscope&#xff1a;dashscope的简介、安装和使用方法、案例应用之详细攻略 目录 dashscope的简介 1、产品的主要特点和优势包括&#xff1a; dashscope的安装和使用方法 1、安装 2、使用方法 dashscope的案例应用 1、通义千问-Max&#xff1a;通义千问2.5系列 2…

apk右键一键签名方法

使用说明 1 修改reg文件最后一行&#xff0c;修改为自己的电脑路径 2 修改bat文件apksigner_path路径为自己的SDK路径&#xff0c;将签名文件命名为platform.keystore放在该文件夹内 3 运行reg文件添加注册表后&#xff0c;要签名的apk右键选择“cux”系统签名即可 一键cux系…

第4章,在 PyCharm 中创建、打开、关闭项目的操作

在 PyCharm 中创建、打开、关闭项目的操作 在PyCharm中创建、打开和关闭项目的操作步骤。以下是每个操作的步骤说明&#xff0c;以及在PyCharm界面中可能对应的区域&#xff1a; 1、创建新项目 1&#xff09;启动PyCharm&#xff1a; 打开PyCharm IDE。 2&#xff09;创建新…