【探索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、非阻塞IO、IO多路复用、信号驱动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天内的时间禁用不允许选择,可以从101天选起 比如,2024年8月9号开始,100天内禁止选择,第101天之后的日期可以选,效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…...

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

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

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 提示工程
一、什么是提示工程(Prompt Engineering) 1.提示工程,也叫“指令工程” (1)Prompt 就是我们给大模型发送的指令,或者说是在聊天对话框中发送的内容。 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…...

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

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

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

第十一章 数据仓库和商务智能 10分
11.1.0语境关系图 11.1 Q 建立数据仓库,有哪些步骤?如何建设?【6 个步骤非常重要!必须知道】 1. 理解需求(P)(目的明确,ETL) (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏
数据结构是计算机科学中的一个重要分支,它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点: 基本概念 数据(Data)。数据元素(Data Element):数据项(Data Item)&…...

11.3 用Python处理常见文件
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

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

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

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

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

sheng的学习笔记-AI-k近邻学习(kNN)
AI目录:sheng的学习笔记-AI目录-CSDN博客 什么是k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,是一种基本的分类与回归方法。 分类问题:对新的样本,根据其 k 个…...

ShardingSphere之ShardingProxy集群部署
文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置,就是关于集群部署的 mode: # typ…...

同态加密和SEAL库的介绍(六)BGV 方案
前面介绍 BFV 和 CKKS 加密方案,这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念,这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密(RLWE)问题的加…...

uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案
背景 我需要在微信小程序中,用canvas绘制一个圆形钟表,在ui设计图中,有一部分阴影,这里我节选一下: 即深色发黑的部分 canvas通用阴影绘制 由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光,…...

W34KN3SS靶机
信息收集: 靶机地址:https://www.vulnhub.com/entry/w34kn3ss-1,270/# (1)ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:E8:66:AB (2)端口扫描 nmap -p- -A 192.168.254.145 (3&…...
8.9套题
A. 猴猴吃苹果 题意:给定根节点k,求访问点的顺序,使得每次从上一个点到当前点的权值最大。访问过的点权值为0。权值一样时,输出最小编号 思路:由于是双向边,先求根节点到每一个节点的距离值。在第一轮中&…...

Python 爬取网页水务数据并实现智慧水务前端可视化
提示:本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…...

百度智能云发布3款轻量级+2款场景大模型
文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景,ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”,推理场景…...

UE基础 —— 编辑器界面
菜单栏 UE中每个编辑器都有一个菜单栏,部分菜单会出现在所有编辑器窗口中,如File、Window、Help,其他则是其编辑器特有的; 主工具栏 UE中部分最常用的工具和命令的快捷方式; 1,保存按钮(ctrls&a…...

2024年Vue组件库大比拼:谁将成为下一个Element?
2024 年,Vue生态蓬勃发展,越来越多的开发者开始探索更适合自己项目的组件库。 今天我们来看一下2024年最受欢迎的几款Vue开源组件库,除了Element,开发者们还有哪些选择呢? 1.Vuetify Vuetify是由社区支持的Vue组件库&…...