【探索Linux】P.46(高级IO —— 五种IO模型简介 | IO重要概念)

在这里插入图片描述

阅读导航

  • 引言
  • 一、五种IO模型
    • 1. 阻塞IO
      • (1)定义
      • (2)特点
    • 2. 非阻塞IO
      • (1)定义
      • (2)特点
    • 3. IO多路复用
      • (1)定义
      • (2)特点
    • 4. 信号驱动IO
      • (1)定义
      • (2)特点
    • 5. 异步IO
      • (1)定义
      • (2)特点
  • 二、同步通信和异步通信
    • 1. 同步通信
    • 2. 异步通信
    • 3. 同步通信和异步通信的区别
    • 4. 适用场景
  • 三、阻塞和非阻塞
    • 1. 概念解释
    • 2. 计算机网络中的应用场景
    • 3. 非网络通信中的应用场景
  • 温馨提示

引言

在上一篇文章中,我们探索了网络系统的奥秘。今天,我们将深入探讨一个同样关键且引人入胜的话题——高级IO模型。IO操作作为程序与网络、文件等外部资源交互的桥梁,其高效性直接关系到系统的整体性能。尤其在网络安全领域,了解并掌握IO模型的特点与应用,对于构建高效、安全的网络应用尤为重要。本文将为您揭开五种主流IO模型的神秘面纱,并深入解析IO的重要概念,带您领略IO世界的无限可能。

一、五种IO模型

在计算机系统中,IO模型是指对输入/输出操作进行处理的不同方式,它定义了操作系统内核、应用程序和IO设备之间如何交互和协调数据传输。常见的五种IO模型包括阻塞IO非阻塞IOIO多路复用信号驱动IO异步IO

1. 阻塞IO

(1)定义

阻塞IO是最传统的IO模型,在IO操作的两个阶段(等待数据和拷贝数据)中,进程或线程都会被阻塞。在Linux下,默认情况下所有的socket接口都是阻塞的

(2)特点

优点:简单,实时性高,响应及时无延迟。
缺点:需要阻塞等待,性能差,对于资源没有充分利用。

在这里插入图片描述

🚨🚨注意当用户进程调用recvfrom等系统调用时,内核开始准备数据。如果数据尚未准备好,用户进程将被挂起(阻塞),直到数据准备好并被拷贝到用户内存后,内核才返回结果,用户进程解除阻塞状态。

2. 非阻塞IO

(1)定义

非阻塞IO允许用户进程或线程在发起IO请求后立即返回,而不会阻塞等待IO操作完成。如果数据未准备好,内核会立即返回一个错误码(如EWOULDBLOCK或EAGAIN),用户进程或线程可以继续执行其他操作,稍后再次尝试IO操作。

(2)特点

优点:在等待时可以做其他事,提高了资源利用率。
缺点:轮询检查数据状态会消耗CPU资源,且IO操作不够实时。

在这里插入图片描述

🚨🚨注意用户进程将socket设置为非阻塞模式,然后发起read操作。如果数据未准备好,内核立即返回错误码,用户进程通过循环或定时器反复尝试,直到数据可用。

3. IO多路复用

(1)定义

IO多路复用允许单个进程或线程同时处理多个IO连接,通过select、poll、epoll等系统调用来监视多个文件描述符(socket连接)的状态。当某个文件描述符就绪(可读/可写)时,内核会通知用户进程或线程进行相应的IO操作。

(2)特点

优点:系统开销小,能同时处理多个连接,提高了并发性能。
缺点:将事件响应和事件探测夹杂在一起,可能导致事件响应不及时。
在这里插入图片描述

🚨🚨注意用户进程调用select或epoll等系统调用,监视多个文件描述符的状态。当某个文件描述符就绪时,系统调用返回,用户进程再调用recvfrom等操作进行数据拷贝。

4. 信号驱动IO

(1)定义

信号驱动IO通过内核发送SIGIO信号来通知用户进程IO操作何时就绪。用户进程需要定义信号处理函数,并在内核中注册该文件描述符以接收SIGIO信号。

(2)特点

优点:IO更加实时,对资源的利用也更加充分。
缺点:实现复杂,开发难度大。
在这里插入图片描述

🚨🚨注意用户进程开启信号驱动IO,并在内核中注册SIGIO信号处理函数。当数据准备好时,内核发送SIGIO信号给用户进程,信号处理函数被调用进行IO操作。

5. 异步IO

(1)定义

异步IO是真正的非阻塞IO模型,用户进程发起IO请求后立即返回,不等待IO操作完成。当IO操作完成时,内核会通知用户进程(通过回调函数、事件通知等方式),用户进程再处理IO结果。

(2)特点

优点:对资源利用最充分,能同时发起多个IO调用。
缺点:实现复杂,流程控制难度大。
在这里插入图片描述

🚨🚨注意用户进程通过调用aio_read等异步IO接口发起IO请求,内核接管IO操作并返回控制权给用户进程。当IO操作完成时,内核通过回调函数等方式通知用户进程处理结果。

二、同步通信和异步通信

1. 同步通信

同步通信是一种数据通信方式,它要求发送端和接收端的时钟信号频率和相位始终保持一致。在同步通信中,发送端和接收端通过一个共享的时钟信号来同步数据传输,确保数据的发送和接收具有完全一致的定时关系。同步通信通常需要在数据传输前附加特定的同步字符,以便在双方之间建立同步。一旦同步建立,数据就可以在同步时钟的控制下逐位发送和接收。

2. 异步通信

异步通信则是一种不需要共享时钟信号的通信方式。在异步通信中,发送端和接收端各自维护自己的时钟信号,因此不需要时钟信号的严格同步。异步通信通过在数据传输中加入起始位和停止位来标识数据的开始和结束,从而允许发送端和接收端独立地进行数据传输。异步通信对时序的要求较低,使得通信设备相对简单且成本较低。

3. 同步通信和异步通信的区别

同步通信异步通信
时钟同步需要不需要
数据传输方式在同步时钟的控制下逐位发送/接收通过起始位和停止位标识数据的开始和结束
传输效率较高(无需额外的起始位和停止位)较低(包含起始位和停止位的开销)
实现复杂度较高(需要时钟同步机制)较低(设备简单,成本较低)
适用场景点对多点通信,如局域网、广域网等;实时性要求较高的场景点对点通信,如计算机与外设之间的通信;低速、近距离的通信场景
时序控制严格同步对时序要求较低
错误处理可以通过同步字符重新建立同步依赖于起始位和停止位的检测

4. 适用场景

  • 同步通信:适用于点对多点的通信场景,如局域网、广域网等。它可以实现多个设备之间的同步操作,如多个计算机之间的文件传输、多个传感器之间的数据采集等。此外,同步通信还可以用于实时系统的控制,如工业自动化、航空航天等领域,这些领域对数据传输的实时性和同步性要求较高。
  • 异步通信:适用于点对点的通信场景,如计算机与外设之间的通信等。异步通信适用于低速、近距离的通信场景,其简单的通信设备和较低的成本使得它在这些场景中更具优势。此外,异步通信还可以提高系统的并发性和响应速度,因为发送方不需要等待接收方的响应就可以继续执行其他任务。

三、阻塞和非阻塞

1. 概念解释

阻塞(Blocking):在计算机科学中,阻塞通常指的是某个进程或线程在执行过程中,由于等待某个条件成立(如等待数据到达、等待资源可用等)而暂停执行的状态。在阻塞状态下,该进程或线程不会继续执行后续操作,直到等待的条件满足为止。阻塞操作常见于I/O操作、文件访问、网络通信等场景。

非阻塞(Non-blocking):与阻塞相反,非阻塞操作允许进程或线程在发起某个请求后立即返回,而不需要等待该请求完成。如果请求不能立即得到响应,进程或线程可以继续执行其他任务,而不是停留在原地等待。非阻塞操作通常通过轮询、事件通知或回调机制来实现,以提高系统的并发性和响应速度。

2. 计算机网络中的应用场景

阻塞通信

  • 传统网络编程:在早期的网络编程中,很多套接字(Socket)操作都是阻塞的。例如,在TCP连接中,当使用阻塞套接字发送数据时,发送操作会阻塞当前线程,直到数据完全写入网络或发生错误。接收数据时也是如此,接收操作会阻塞直到有数据可读。
  • 单线程服务器:在单线程服务器模型中,服务器在处理每个连接请求时,都会阻塞等待数据的到来或发送数据完成。这种模型在处理少量连接时效率尚可,但在高并发场景下性能会急剧下降。

非阻塞通信

  • 高并发服务器:在高并发的网络应用中,非阻塞通信是提高服务器性能的关键。通过非阻塞I/O,服务器可以在等待某个连接的数据时处理其他连接,从而显著提高系统的并发处理能力。
  • 事件驱动模型:非阻塞通信常与事件驱动模型结合使用。服务器注册对特定事件(如数据可读、连接关闭等)的监听,当这些事件发生时,服务器会收到通知并处理相应的事件,而不是阻塞等待事件的发生。
  • 实时系统:如游戏服务器、实时通信应用等,对响应时间和并发性能有极高要求。这些系统通常采用非阻塞通信模型来确保数据的实时处理和系统的高并发性。

3. 非网络通信中的应用场景

阻塞操作

  • 文件I/O:在文件读写操作中,如果采用阻塞方式,调用者会等待I/O操作完成才能继续执行后续代码。这在处理大文件或网络文件系统时可能会导致较长的等待时间。
  • 数据库访问:在数据库查询操作中,如果数据库服务器响应较慢或网络延迟较高,采用阻塞方式访问数据库的客户端线程可能会长时间处于等待状态。

非阻塞操作

  • GUI(图形用户界面)编程:在GUI编程中,非阻塞操作尤为重要。如果GUI事件处理线程被某个长时间运行的阻塞操作占用,将导致用户界面无响应。通过非阻塞操作,事件处理线程可以立即响应用户输入和其他事件,同时异步处理耗时操作。
  • 后台任务处理:在需要同时处理多个后台任务的场景中,非阻塞操作允许主线程在等待任务完成时继续执行其他任务,从而提高程序的整体效率和响应速度。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

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

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

相关文章

深入探索:【人工智能】、【机器学习】与【深度学习】的全景视觉之旅

目录 第一部分:人工智能、机器学习与深度学习概述 1.1 人工智能的概念与发展 代码示例:简单的AI决策系统 1.2 机器学习的定义与分类 代码示例:简单的线性回归模型 1.3 深度学习的基础与应用 代码示例:构建简单的神经网络 …

【TwinCAT】TwinCAT3 PLC HMI在WIN10系统中的全屏显示及用户管理

在工业自动化领域,TwinCAT3 PLC HMI 是一款强大的可视化工具,它支持多种操作系统,并且能够满足不同控制器的需求。在本文中,我们将详细介绍如何在WIN10系统中进行全屏显示设置以及如何进行用户管理配置。 一、TwinCAT3 PLC HMI 全屏显示方法 1. 创建Visualization和配置Vi…

Git开发流程

Git开发流程规范如下: 详情参考:https://www.processon.com/view/link/5d0cf86ce4b0376de9c19e16

【自动驾驶】ROS中自定义格式的服务通信,含命令行动态传参(c++)

目录 通信流程创建服务器端及客户端新建服务通讯文件修改service的xml及cmakelistCMakeLists.txt编辑 msg 相关配置编译消息相关头文件在cmakelist中包含头文件的路径在service包下编写service.cpp在client包下编写client.cpp测试运行查询服务的相关指令列出目前的所有服务&…

【Vue3】组件通信之mitt

【Vue3】组件通信之mitt 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

什么是智能加密?超好用神器智能加密软件推荐

信息安全已成为我们日常生活中不可忽视的一环。 随着网络攻击手段的不断升级和隐私泄露事件的频发,如何有效保护个人及企业的敏感数据成为了亟待解决的问题。 智能加密,作为信息安全领域的一项重要技术,正逐渐走进大众视野,以其高…

【数据结构七夕专属版】单链表及单链表的实现【附源码和源码讲解】

本篇是博主在学习数据结构时的心得,希望能够帮助到大家,也许有些许遗漏,但博主已经尽了最大努力打破信息差,如果有遗漏还请见谅,嘻嘻,前路漫漫,我们一起前进!!&#xff0…

超声波眼镜清洗机哪家强?盘点四款精品超声波清洗机机型

超声波清洗机因其卓越的清洁能力,成为了家庭和专业环境中清洁小物件的理想选择。无论是日常佩戴的眼镜、珍贵的珠宝首饰,还是精密的电子设备和实验工具,超声波清洗机都能提供深层、温和且高效的清洁。然而,面对市场上众多品牌和价…

原神4.8版本升级计划数据表

原神4.8版本角色数据升级计划表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本升级计划…

使用Anaconda安装多个版本的Python并与Pycharm进行对接

1、参考链接 Anaconda安装使用教程解决多Python版本问题_anaconda安装多个python版本-CSDN博客 基于上面的一篇博客的提示&#xff0c;我做了尝试。并在Pycharm的对接上做了拓展。 2、首先安装Anaconda 这个比较简单&#xff0c;直接安装即可&#xff1a; 3、设置conda.exe的…

【iOS】SideTable

目录 SideTablesStripedMapSideTable1. spinlock_t slock2. RefcountMap3. weak_table_t 总结 objc4源码地址&#xff1a; SideTable& table SideTables()[this]; // 获取对象的SideTable size_t& refcntStorage table.refcnts[this];SideTables 查源码SideTables…

K8s第三节:k8s1.23.1升级为k8s1.30.0

上回书说到我们使用了kubeadm安装了k8s1.23.1,但是在k8s1.24之前还是使用docker作为容器运行时&#xff0c;所以这一节我打算将我安装的k8s集群升级为1.30.0版本&#xff1b; 1、修改containerd 配置 因为我们安装的docker自带containerd&#xff0c;所以我们不需要重新安装con…

docker拉取MySQL后数据库连接失败解决方案

如果数据库连接失败&#xff0c;检查以下几个地方&#xff1a; 1&#xff1a;防火墙&#xff0c;查看防火墙是否打开&#xff1a; systemctl status firewalld 关闭状态&#xff1a; 开启状态&#xff1a; 如果是开启状态&#xff0c;则很有可能是防火墙拦截掉了3306端口的访问…

挖矿木马攻破了服务器

最近被国外的挖矿木马攻破了服务器 根据非法登录&#xff0c;用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后&#xff0c;服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…

HarmonyOS Flex布局

前置知识&#xff1a; 一次开发&#xff0c;多端部署:一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署。支撑开发者快速高效的开发支持多种终端设备形态的应用&#xff0c;实现对不同设备兼容的同时&#xff0c;提供跨设备的流转、迁移和协同的分布式体验自适应…

[FSCTF 2023]细狗2.0

尝试输入cat /f* 输入&#xff1b;ls / 过滤了空格 输入 &#xff1b;ls 看到2个php, 空格绕过可以用注释替换空格 &#xff1b;ca\t/*123*/f* 发现不可以&#xff0c;看题解后发现使用${IFS}绕过 $IFS代替空格;$IFS、$IFS2、${IFS}、$IFS$9 Linux下有一个特殊的环境变量…

Java 文件上传七牛云

Java系列文章目录 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 新建空间4.2 查找密钥4.3 进入开发者中心查找JavaSDK文档4.4 查找文件上传方法4.5 运行测试 五、总结&#xff1a;5.1 学习总结&#xff1a; 一、前言 学…

数据结构(其六)--树(一般的树)

目录 1.树的知识总览 2.树的基本概念 i.部分名词 ii.结点间的关系 iii.属性 3.树的常考性质 i.结点数 ii.度为m的树 与 m叉树 的区别&#xff08;m>0&#xff09; iii.树的第 i 层的结点数&#xff08;i>1&#xff09; ​编辑 iiii. 高度为h的m叉树的结点数 iiiii.高…

人工智能安全态势和趋势

吴世忠 中工院士 国家保密科技委主任 重大风险隐患呼唤加强安全研究&#xff0c;人工智能面临未来担忧 1 总体态势 1.1 相对于技术发展&#xff0c;安全研究严重滞后 1.2 我国研究十分活跃&#xff0c;论文数量遥遥领先 1.3 影响力美国排名第一&#xff0c;大厂大学作用大 1…

C#获取Network的相关信息

1&#xff0c;获取网络的通断。 //方法1&#xff1a;无效果&#xff0c;并不能反映当前网络通断 bool availableSystem.Windows.Forms.SystemInformation.Network//方法2&#xff1a;通过VB获取网络状态&#xff0c;可反映当前网络通断 Microsoft.VisualBasic.Devices.Network…