当前位置: 首页 > news >正文

【探索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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

相关文章:

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

阅读导航 引言一、五种IO模型1. 阻塞IO(1)定义(2)特点 2. 非阻塞IO(1)定义(2)特点 3. IO多路复用(1)定义(2)特点 4. 信号驱动IO&#…...

【MongoDB 】MongoDB 介绍及应用,设计到4个案例

MongoDB 介绍概述 基础概念 MongoDB 是非关系型数据库,也就是nosql,存储json数据格式会非常灵活,要比数据库mysql/MariaDB更好,同时也能为mysql/MariaDB分摊一部分的流量压力。 对于经常读写的数据他会存入内存,如此…...

AI浪潮下的程序员生存指南:如何在智能时代锻造不可替代的核心竞争力

人工智能时代,程序员如何保持核心竞争力? 随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工…...

Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]

文章目录 Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术…...

vue 日期控件 100天内的时间禁用不允许选择

vue 日期控件 100天内的时间禁用不允许选择&#xff0c;可以从101天选起 比如&#xff0c;2024年8月9号开始&#xff0c;100天内禁止选择&#xff0c;第101天之后的日期可以选&#xff0c;效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…...

服务器HTTP响应头安全性优化与漏洞修复方案

在对服务器进行漏洞扫描后,通常会发现一些常见的安全漏洞,特别是涉及HTTP响应头的问题。以下是本次扫描过程中发现的漏洞问题以及对应的修复方案 1.X-Content-Type-Options 响应头缺失 描述: 缺失此响应头可能导致浏览器错误地解析资源类型,存在MIME类型混淆攻击的风险。 …...

4.定时器(TIMER)

理论 预分频寄存器(TIMx_PSC)&#xff1a;由于时钟源为&#xff1a;72MHz&#xff0c;T 1/f 1/72MHz&#xff0c;由于不好计算周期时间&#xff0c;则需要分频&#xff0c;若分72则T 1/1MHz 1us(1MHz 一百万秒) 计数方式&#xff1a;向上(递增到某个数触发中断)、向下(递…...

java springboot mqtt控制海康摄像头

GHHKControlService 接口 package org.gh.ghhk.service;public interface GHHKControlService {boolean monitorControl(String payload);}GHHKControlServiceImpl 实现类 ​ package org.gh.ghhk.service.impl;import com.alibaba.fastjson.JSONArray; import com.alibaba.…...

AI大模型02:Prompt Engineering 提示工程

一、什么是提示工程&#xff08;Prompt Engineering&#xff09; 1.提示工程&#xff0c;也叫“指令工程” &#xff08;1&#xff09;Prompt 就是我们给大模型发送的指令&#xff0c;或者说是在聊天对话框中发送的内容。 Prompt是AGI时代的编程语言。 Prompt是去控制大模型的…...

EasyExcel动态表头导出

1、封装方法 package com.skybird.iot.base.utils;import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.w…...

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…...

MySQL基础练习题27-上升的温度

目录 题目 准备数据 分析数据 总结 题目 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id 。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Weather (id int, recordDate date, temperature int);#…...

只出现一次的数字 II

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2]…...

第十一章 数据仓库和商务智能 10分

11.1.0语境关系图 11.1 Q 建立数据仓库&#xff0c;有哪些步骤&#xff1f;如何建设&#xff1f;【6 个步骤非常重要&#xff01;必须知道】 1. 理解需求&#xff08;P&#xff09;&#xff08;目的明确&#xff0c;ETL&#xff09; (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏

数据结构是计算机科学中的一个重要分支&#xff0c;它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点&#xff1a; 基本概念 数据&#xff08;Data&#xff09;。数据元素&#xff08;Data Element)&#xff1a;数据项&#xff08;Data Item&#xff09;&…...

11.3 用Python处理常见文件

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…...

驗證HTTP代理的有效性的方法和步驟-okeyproxy

如何驗證HTTP代理的有效性&#xff0c;確保它的性能和安全性&#xff0c;是非常必要的。本文將詳細介紹驗證HTTP代理有效性的方法和步驟。 HTTP代理作為一種仲介伺服器&#xff0c;它可以幫助用戶在訪問目標網站時隱藏真實IP地址&#xff0c;從而提高匿名性和安全性。通過HTTP…...

Java和kotlin 反射机制

Java 反射机制详解 Java 反射机制是一种强大的工具&#xff0c;使得程序可以在运行时动态地获取类的信息&#xff0c;并且可以在运行时操作类的成员变量、方法和构造函数等。以下是 Java 反射的详细讲解&#xff0c;包括其原理、使用场景、优缺点以及如何使用反射。 1. 反射的…...

Linux Shell编程--数组

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除&#xff01; 一、简介 Shell 脚本中的数组允许你存储多个值&#xff0c;并可以通过索引访问它们。Shell 中的数组是一维的。 二、声明数组 在Shell…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...

spring boot使用HttpServletResponse实现sse后端流式输出消息

1.以前只是看过SSE的相关文章&#xff0c;没有具体实践&#xff0c;这次接入AI大模型使用到了流式输出&#xff0c;涉及到给前端流式返回&#xff0c;所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...

linux设备重启后时间与网络时间不同步怎么解决?

linux设备重启后时间与网络时间不同步怎么解决&#xff1f; 设备只要一重启&#xff0c;时间又错了/偏了&#xff0c;明明刚刚对时还是对的&#xff01; 这在物联网、嵌入式开发环境特别常见&#xff0c;尤其是开发板、树莓派、rk3588 这类设备。 解决方法&#xff1a; 加硬件…...

Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用

1 论文信息 FBRT-YOLO&#xff08;Faster and Better for Real-Time Aerial Image Detection&#xff09;是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架&#xff0c;发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究&#xff0c;重点解决…...

VASP软件在第一性原理计算中的应用-测试GO

VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件&#xff0c;广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算&#xff…...