五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO

网络IO模型(阻塞IO、非阻塞IO、IO多路复用(select、poll、epoll、)、信号驱动IO模型、异步IO 文章目录网络IO模型从TCP发送数据的流程说起阻塞IO | 非阻塞IO同步阻塞IO(Blocking IO)java代码实现服务调用者服务提供者(BIO实现)缺点同步非阻塞IO(Non-blocking IO)缺点IO多路复用(IO Multiplexing)java代码实现服务提供者(NIO实现)IO多路复用与非阻塞的区别IO多路复用与多线程+ 阻塞IO的对比select缺点poll缺点epollepoll简单流程epoll的水平触发与边缘触发优点缺点信号驱动IO模型异步IO(Asynchronous I 阅读详情

目录

1. 同步阻塞 IO(Blocking IO)

2. 同步非阻塞 IO(Non-Blocking IO)

2.1 同步非阻塞 IO 介绍

2.2 错误码介绍

2.3 非阻塞 IO demo 代码

3. 信号驱动 IO(Signal Driven IO,SIGIO)

4. IO 多路复用(IO Multiplexing) 

5. 异步 IO(Asynchronous IO,AIO)


        IO 的过程可以分为等待数据和拷贝数据两个阶段。

1. 同步阻塞 IO(Blocking IO)

        同步阻塞 IO:进程发起 IO 操作后会被阻塞,直到 IO 操作完成才返回,期间无法处理其他任务。阻塞 IO 是最常见的 IO 模型。

        如上图所示,进程调用 recvfrom 向内核发送读请求(读取文件、网络接收数据),内核等待数据就绪(数据从磁盘加载到内存、网络数据到达),数据就绪后,内核将数据拷贝到进程(用户)缓冲区,进程解除阻塞并处理数据。

#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <fcntl.h>

int main()
{
    char buffer[1024];

    while(true)
    {
        std::cout << "请输入数据: ";
        fflush(stdout); // 立即将内核缓冲区的数据刷新到标准输出中
        ssize_t n = read(0, buffer, sizeof(buffer));
        if (n > 0)
        {
            buffer[n - 1] = 0;
            std::cout << "读取的数据:" << buffer << std::endl;
        }
        else
            break;
    }
    r

        如上图,标准输入默认情况下是阻塞模式的,所以每次都会等待用户进行输入之后才进行数据处理。 

2. 同步非阻塞 IO(Non-Blocking IO)

2.1 同步非阻塞 IO 介绍

        同步非阻塞 IO:进程发起 IO 请求后立即返回,通过轮询方式查询 IO 操作是否完成,不会阻塞进程。

        非阻塞 IO 往往需要轮询的方式反复尝试读写文件描述符,这对 CPU 来说是较大的浪费。

        如上图,进程调用 recvfrom 发起读请求,第一次内核中无数据就绪,则返回,然后通过循环调用 recvfrom 发起第二次读请求,内核中依旧无数据就绪,继续返回,知道有数据就绪后,内核将数据拷贝到进程缓冲区中,并进行处理。 

        fcntl 函数:fcntl(file control)是 Linux 系统中用于操作文件描述符属性的核心系统调用,提供了对文件、套接字、管道等 IO 资源的高级控制能力。

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd, ...);

        fd:目标文件描述符。

        cmd:操作命令,决定 fcntl 的具体功能。

        ...:可变参数,根据 cmd 不同可能为整数、指针或结构体。        

        返回值:成功时根据 cmd 返回不同值,失败返回 -1, 并设置 errno。 

        下列介绍部分 cmd 参数:

        (1)F_GETFL:返回 fd 的状态标志(如 O_EDONLY、O_NONBLOCK)。

        (2)F_SETFL:修改 fd 状态标志,常用标志包括:
                O_NONBLOCK:设置为非阻塞 IO。

                O_APPEND:设置为追加模式。

                O_DIRECT:绕过内核缓冲区,直接 IO。

                O_ASYNC:启动信号驱动 IO 通知。

2.2 错误码介绍

        read 函数用于从文件描述符中读取数据,返回读取的字节数,错误时返回 -1,并设置 errno(错误码)。

       下列介绍部分调用 read 函数时发生错误设置的错误码。

       (1)EAGAIN:表示操作无法立即完成,需要重试(通常用于文件描述符设置为非阻塞时)。

       (2)EWOULDBLOCK:与 EAGAIN 本质相同,是其别名,不同系统可能定义不同,在 POSXI 标准中,EWOULDBLOCK 常用于套接字操作。

        (3)EINTR:表示阻塞的系统调用被信号(如 SIGINT、SIGTERM)中断,导致调用未完成而返回错误。

2.3 非阻塞 IO demo 代码

#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <fcntl.h>

void SetNonBlock(int fd)
{
    int fl = fcntl(fd, F_GETFL);
    if (fl < 0)
    {
        perror("fcntl");
        return;
    }
    fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

int main()
{
    SetNonBlock(0);  // 设置标准输入为非阻塞

    char buffer[1024];
    while(true)
    {
        ssize_t n = read(0, buffer, sizeof(buffer));
        if (n > 0)
        {
            buffer[n - 1] = 0;
            std::cout << buffer << std::endl;
            sleep(1);
        }
        else if (n < 0) // 底层数据没有准备好,数据读取不算出错
        {
            // 1. 读取出错或者数据没有就绪
            if (errno == EAGAIN || errno == EWOULDBLOCK)    // 错误码
            {
                std::cout << "数据没有就绪... " << std::endl;
                sleep(1);
                // 其他业务
                // ....
                continue;
            }
            else if (errno == EINTR)
                continue;
            else    // 其他错误
                break;
        }
        else
            break;
    }
    return 0;
}

3. 信号驱动 IO(Signal Driven IO,SIGIO)

        信号驱动 IO:进程通过注册信号处理函数,当 IO 操作就绪时,内核向进程发送信号(如 SIGIO),进程通过信号回调处理 IO 事件。

        如上图,进程将 fd 设置为信号驱动模式,并绑定信号处理函数,内核等待数据就绪后,向进程发送 SIGIO 信号,进程捕获信号,在信号处理函数中完成 IO 操作。 

4. IO 多路复用(IO Multiplexing) 

        IO 多路复用:通过一个进程监控多个文件描述符,当其中一个或多个准备就绪时,进程被唤醒并处理对应的 IO 操作。

        在 Linux 中有三种机制进行 IO 多路复用:select、poll、epoll。

        select:监控 fd(文件描述符)集合,通过遍历 fd 判断就绪状态,fd 数量受限于 FD_SETSIZE(默认 1024)。该机制支持跨平台,但是效率低,并且监控 fd 数量有限,适合小规模连接。

        poll:用链表存储 fd,无数量限制,但仍需遍历所有 fd 进行就绪状态的判断。该机制监控的 fd 没数量限制,效率比 select 高(但是仍需遍历所以 fd,效率也不是特别高)。

        epoll:事件驱动模型,内核维护就绪 fd 列表,仅通知就绪事件(LT/ET 模式)。Linux 高新能机制,支持百万级连接,适用于高并发场景(如 Nginx、Redis)。

        上述三种机制在之后进行详细介绍。

5. 异步 IO(Asynchronous IO,AIO)

        异步 IO:进程发起 IO 请求后立即返回,内核在 IO 操作完成(包括数据拷贝)后通知进程,全程无需进程主动干预。

        如上图,进程通过 aio_read 向内核提交 IO 请求,指定回调函数或事件通知方式。内核负责数据读取和拷贝当用户缓冲区,完成后通过信号、回调或事件通知进程,进程处理 IO 结构,无需关注中间过程。 

        

SQL注入绕过information_schema:实战技法与替代路径详解 SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用 阅读详情

相关推荐

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

五种常见IO模型

🌟 前言 🐶 大家好,我是周周,目前就职于国内短视频某厂的BUG攻城狮一枚。 🤺 如果文章对你有帮助,记得关注、点赞、收藏,一键三连哦,你的支持将成为我最大的动力。 文章目录🌟 前言1 概述🍑 1.1 什么是 IO🍑 1.2 什么是缓冲区🍑 1.3 阻塞和非阻塞🍑 1.4 同步和异步2 五种 IO 模型🍑 2.1 同步阻塞 IO🍑 2.2 同步非阻塞 IO🍑 2.3 IO 多路复用🍑 2.4 异步 IO🍑 2.5 信号驱动 IO 1 概述 服务端高并发 IO 编程往往要求的性能都非常高,一般情况下需要选用高

程序猿周周的博客 7667

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 443

集成电路学习:什么是I/O输入输出

I/O操作通常通过I/O接口进行,这些接口是硬件中用于连接计算机和外部设备的部件。I/O接口的工作原理包括发送命令字到I/O控制寄存器以向设备发送命令(需要驱动程序的协助),以及从数据缓冲寄存器发送或读取数据,完成主机与外设的数据交换。在计算机科学中,I/O操作有多种实现方式,如直接I/O(DIO)、异步I/O(AIO)和内存映射I/O(Memory-Mapped I/O)等。此外,计算机之间的通信设备,如调制解调器和网卡,也涉及I/O操作。

limengshi138392的博客 3182

ARM Cortex平台NEON指令集优化实战指南

本文为ARM Cortex平台开发者提供了一份全面的NEON指令集优化实战指南。文章从NEON的SIMD架构原理讲起,详细介绍了开发环境搭建、NEON内联函数与自动向量化两种核心编程方法、关键数据类型与指令,并通过图像饱和运算、矩阵乘法等实战案例,深入解析了性能调优技巧与常见避坑指南,旨在帮助开发者充分释放ARM处理器的并行计算潜力。

weixin_29162439的博客 260

从法律文档到知识图谱

这里我们定义了两个 Pydantic 模型:Location 用于捕捉结构化的地址信息,包含可选的国家、州和地址字段;Party 用于表示合同参与方,包含必填的名称和可选的位置详情。字段描述通过告知 LLM 每个字段具体需要查找哪些信息,来辅助提取过程。"""包含结构化地址组件的位置信息。"""country: Optional[str] = Field(None, description="国家")

Anspire的博客 3030

信号驱动IO异步IO的对比理解刨析, epoll地ET,LT

信号驱动IO异步IO的对比理解刨析, 代码实现信号驱动IO, 以及select,poll,epoll三个IO多路复用技术的原理再生活化理解,以及细谈一下epoll的LT和ET

小杰312的博客 3770

电子产品设计中EFT防护的关键技术与实践

本文深入探讨了电子产品设计中EFT(快速瞬变脉冲群)防护的关键技术与实践。文章从EFT干扰的原理入手,系统阐述了通过优化PCB布局与地平面设计、构建电源与信号端口滤波防护电路、精选核心器件以及实施软件容错策略,来构建多层次、系统性的抗干扰防线,助力产品稳定通过严苛的电磁兼容测试。

e4f5g6h的博客 787

5种I/O模型

IO

qq_44836676的博客 1万+

apt-get update时出现GPG error:... bionic InRelease:The following signatures were invalid: EXPKEYS解决方案

本文主要介绍了apt-get update时出现W: GPG error: … bionic InRelease: The following signatures were invalid: EXPKEYSIG B7B3B788A8D3785C MySQL Release Engineering E: The repository ‘… bionic InRelease’ is not signed.解决方案,希望能对使用Ubuntu系统的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 179

五种I/O模型

五中I/O模型 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O(SIGIO) 异步I/O 一般来说。程序进行输入操作有两步: 等待有数据可以读; 将数据从系统内核中拷贝到程序的数据区。 对于一个对嵌套字的输入操作,第一步一般来说是等待数据从网络传到本地。当数据包到达的时候,数据将会从网络层拷贝到内核的缓存中;第二步是从内核中把数据拷贝到程序的数据区中。 1、阻塞I/O模式(blo...

gaoyu562389327的博客 1329

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 103

浅谈5种IO模型——阻塞式IO、非阻塞式IO、信号驱动IO、多路复用IO及异步IO

5种IO模型5种IO模型1、背景2、IO模型2.1、阻塞式IO(blocking IO)2.2、非阻塞式IO(nonblocking IO)2.3、多路复用IO(IO multiplexing)2.4、信号驱动IO(signal driven IO)2.5、异步IO( asynchronous IO)参考 5种IO模型 1、背景 从TCP发送数据的流程说起 要深入的理解各种IO模型,那么必须先了解下产生各种IO的原因是什么,要知道这其中的本质问题那么我们就必须要知一条消息是如何从过一个人发送到另外一个人的;

JMW1407的博客 8312

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Redis 篇-深入了解在 Linux 的 Redis 网络模型结构及其流程(阻塞 IO、非阻塞 IO、IO 多路复用、异步 IO、信号驱动 IO)

1)抛开持久化不谈,Redis 是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。2)多线程会导致过多的上下文切换,带来不必要的开销。3)引入多线程会面临线程安全问题,必然要引入线程锁这样的安全手段,实现复杂度增高,而且性能也会大打折扣。

小扳手 4555

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IO 中的阻塞、非阻塞、同步、异步及五种IO模型

本文深入解析了Linux系统中的五种I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。文章首先阐述了I/O操作的两个关键阶段(数据准备和数据传输),并在此基础上比较了不同模型的特点、工作流程和适用场景。特别指出阻塞和非阻塞模式都属于同步I/O范畴,只有异步I/O才是真正的异步操作。通过分析各模型的实现机制和性能特点,为开发者在高并发场景下选择合适的I/O策略提供了理论依据。文章还区分了业务开发中的同步/异步概念与I/O模型的差异,帮助读者建立更全面的理解。

2301_76564925的博客 3432

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux 五种IO模型总篇(阻塞IO、非阻塞IO、信号驱动IO、多路复用IO(select、poll、epoll)、异步IO)

IO(Input Output)简单来说就是和,当底层数据没有就绪时,等待数据就绪,当数据就绪时就拷贝数据到上层。对于怎么等和拷贝的问题,衍生出了五种IO模型,。前四种IO是,多路复用/多路转接IO是异步IO。信号IO是同步还是异步,具有一定争议。但普遍认为,所以信号IO也是同步IO。IO的同步、异步的概念与线程不同,这里的指的是指的是。。对于来说,它的高效体现在IO,其他的IO模型高效在。每一种IO,都有其对应的使用场景,没有说哪一种IO模型在任何情况下都完胜另一种IO模型。

laimaxgg 1540

五种IO模型(阻塞,非阻塞,多路复用[select, poll, epoll],信号驱动,异步IO)

select,poll,epoll,五种IO模型,阻塞,非阻塞,信号驱动,异步IO,多路转接,

qq_74276498的博客 1405

同步IO、异步IO以及五种网络IO模式

当用户进程调用了select,那么整个进程就会被block,而同时,kernel会 “监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。很显然,这种IO模型是同步的。有一天,学校里面优化了热水的供应,增加了很多水龙头,这个时候小明同学再去装水,舍管阿姨告诉他这些水龙头都还没有水,你可以去忙别的了,等有水了告诉他。: 小明去打开水,而开水塔此时没有水,开水塔的阿姨叫小明把水壶放到现场,来水后会帮他打好水,并打电话叫他来取,这是异步IO的一种案例。

m0_65635427的博客 2573

Linux 五种网络IO模式(阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO)

介绍高并发服务器开发所需要的框架知识点,select、poll、epoll 和 libevent!

cpp_learner的博客 2858

五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO

在操作系统中处理输入/输出(IO)操作的过程中,存在多种方式,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。这些方式在操作系统实现和应用程序编写时有着不同的适用场景和性能特征。接下来,我将逐一介绍它们的实现原理、优缺点以及应用场景,同时给出Java和Python的实验示例。

AI大模型/Python/Java/MySQL技术栈,快来和我一起学习吧 ~ 1307

【LInux网络】五种IO模型与高级IO概念 及 非阻塞IO详解

本篇博文对【LInux网络】五种IO模型与高级IO概念 及 非阻塞IO详解做了一个较为详细的介绍,不知道对你有没有帮助呢觉得博主写得还不错的三连支持下吧!会继续努力的~

2301_77954967的博客 1217

同步阻塞-同步非阻塞-多路复用-异步阻塞(?)-异步非阻塞

我们将其按照类型进行区分,其实可以分为这几类同步与异步多路复用阻塞与非阻塞可以看到,这些概念单独拿出来,我们可以比较熟练的说出其功能作用,但是连在一起反而不太能反应过来接下来我们利用网络编程中的IO模型来了解这几个模型到底是什么。

2303_79546217的博客 1028

Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)

本文介绍了Unix五种I/O模型及其对比。

weixin_38597669的博客 1621

五种IO模型(阻塞 非阻塞 IO多路复用 信号驱动 异步)和两种IO事件处理模式(Reactor Proactor)

欢迎交流 QQ 2431173627 微信 ccc17862701790 引入 在介绍六种IO模型之前首先需要理解 四个概念:同步 异步 阻塞 非阻塞 关于同步 异步 阻塞 非阻塞 在不同上下文讨论时候背景是不同的 这里讨论的背景是linux环境下的networkIO 首先一个IO操作其实分成了两个步骤: 1.用户进程向内核发起IO请求,等待内核数据准备 2.实际的IO操作...

vjhghjghj的博客 1212

【计算机网络】五种IO模型——非阻塞IO

比如调用 recv(),其实是两个阶段: 1. 等待数据到达内核(数据准备阶段) 2. 将内核的数据拷贝到用户空间(数据复制阶段) 这两个阶段的等待和谁来“干活”,决定了是哪种 I/O 模型。 **IO=等+拷贝** ## 同步IO和异步IO **同步IO** 同步IO是指在执行IO操作时,调用方(程序或线程)必须等待IO操作完成才能继续执行后续代码。 **程序在发起IO请求后会被阻塞,直到数据返回或操作完成。** 特点 阻塞:调用IO操作的线程暂停,等待操作完成(如等待网络响应、磁盘读取)。 顺

GGDxianv的博客 1250
上一篇: MySQL 内置函数 -- 日期函数,字符串函数,数学函数,其他函数
下一篇: MySQL 复合查询和内外连接 -- 子查询,多表查询,自连接,合并查询,表的内外连接
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值