五种常见IO模型

IO线程模型知识 传统阻塞 I/O 服务模型 采用阻塞 IO 模式获取输入的数据, 每个连接都需要独立的线程完成数据的输入 , 业务处理和数据返回工作. 存在问题: 1. 当并发数很大,就会创建大量的线程,占用很大系统资源 2. 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在 read 操作,造成线程资源浪费 Reactor 模型 Reactor 模式,通过一个或多个输入同时传递给服务处理器的模式 , 服务器端程序处理传入的多个 请求,并将它们同步分派到相应的处理线程, 因此 React. 阅读详情
AI摘要

本文深入探讨了IO模型,包括阻塞IO、非阻塞IO、IO多路复用、异步IO和信号驱动IO。重点介绍了它们的工作原理和在高并发服务端的重要性,特别是如何通过IO多路复用提高性能。同时,阐述了缓冲区在IO操作中的作用以及同步和异步的区别。

🌟 前言

🐶 大家好,我是周周,目前就职于国内短视频某厂的BUG攻城狮一枚。

🤺 如果文章对你有帮助,记得关注、点赞、收藏,一键三连哦,你的支持将成为我最大的动力。

1 概述

服务端高并发 IO 编程往往要求的性能都非常高,一般情况下需要选用高性能的 IO 模型,比如我们日常使用的 Redis 就采用了 IO 多路复用以提高自身性能。本文将从操作系统、网络、Java 等多个方面聊聊几种常见的 IO 模型。

🍑 1.1 什么是 IO

IO 全程 Input/Output,即数据的读取(接收)或写入(发送)操作,针对不同的数据存储媒介,大致可以分为网络 IO 和磁盘 IO 两种。

而在 Linux 系统中,为了保证系统安全,操作系统将虚拟内存划分为内核空间和用户空间两部分。因此用户进程无法直接操作IO设备资源,需要通过系统调用完成对应的IO操作。

即此时一个完整的 IO 操作将经历一下两个阶段:用户空间 <-> 内核空间 <-> 设备空间。

🍑 1.2 什么是缓冲区

应用层的 IO 操作基本都是依赖操作系统提供的 read 和 write 两大系统调用实现。但由于计算机外部设备(磁盘、网络)与内存、CPU 的读写速度相差过大,若直接读写涉及操作系统中断,因此为了减少 OS 频繁中断导致的性能损耗和提高吞吐量,引入了缓冲区的概念。

根据内存空间的不同,又可分为内核缓冲区和进程缓冲区。

操作系统会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行 IO 设备的中断处理,集中执行物理设备的实际 IO 操作,通过这种机制来提升系统的性能。至于具体什么时候执行系统中断(包括读中断、写中断)则由操作系统的内核来决定,应用程序不需要关心。

🍑 1.3 阻塞和非阻塞

阻塞 IO指的是需要内核 IO 操作彻底完成后才返回到用户空间执行用户程序的操作指令。

非阻塞 IO(Non-Blocking IO,NIO) 指的是用户进程不需要等待内核 IO 操作彻底完成,即可返回用户空间执行后续指令。与此同时,内核会立即返回给用户一个 IO 状态值。

阻塞是指用户进程一直在等待,而不能做别的事情;非阻塞是指用户进程获得内核返回的状态值就返回自己的空间,可以去做别的事情。

🍑 1.4 同步和异步

同步 IO是指用户空间(进程或者线程)是主动发起 IO 请求的一方,系统内核是被动接收方。

异步 IO则反过来,系统内核是主动发起 IO 请求的一方,用户空间是被动接收方。

同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方(此时数据已 ready,调用方可以直接使用)。

阻塞和非阻塞关注的是调用方进程状态,而同步与异步更关注调用双方进程通信方式。

2 五种 IO 模型

🍑 2.1 同步阻塞 IO

同步阻塞IO(Blocking IO) 指的是用户进程(或线程)主动发起,需要等待内核 IO 操作彻底完成后才返回到用户空间的 IO 操作。在 IO 操作过程中,发起 IO 请求的用户进程处于阻塞状态。

🍑 2.2 同步非阻塞 IO

同步非阻塞IO(Non-Blocking IO,NIO) 指的是用户进程主动发起,不需要等待内核 IO 操作彻底完成就能立即返回用户空间的 IO 操作。在 IO 操作过程中,发起 IO 请求的用户进程处于非阻塞状态。

1)当数据 Ready 之后,用户线程仍然会进入阻塞状态,直到数据复制完成,并不是绝对的非阻塞。

2)NIO 实时性好,内核态数据没有 Ready 会立即返回,但频繁的轮询内核,会占用大量的 CPU 资源,降低效率。

🍑 2.3 IO 多路复用

IO 多路复用(IO Multiplexing) 实际上就解决了 NIO 中的频繁轮询 CPU 的问题,并且引入一种新的 select 系统调用。

复用 IO 的基本思路就是通过 slect 调用来监控多 fd(文件描述符),来达到不必为每个 fd 创建一个对应的监控线程的目的,从而减少线程资源创建的开销。一旦某个描述符就绪(一般是内核缓冲区可读/可写),内核就能够将文件描述符的就绪状态返回给用户进程(或者线程),用户空间可以根据文件描述符的就绪状态进行相应的 IO 系统调用。

IO 多路复用(IO Multiplexing)属于一种经典的 Reactor 模式实现,有时也称为异步阻塞 IO。

🍑 2.4 异步 IO

异步IO(Asynchronous IO,AIO) 指的是用户空间的线程变成被动接收者,而内核空间成为主动调用者。在异步 IO 模型中,当用户线程收到通知时,数据已经被内核读取完毕并放在用户缓冲区内,内核在 IO 完成后通知用户线程直接使用即可。而此处说的 AIO 通常是一种异步非阻塞 IO。

🍑 2.5 信号驱动 IO

当进程发起一个 IO 操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用 IO 读取数据。

信号驱动 IO 不同于 AIO 的是依旧存在阻塞状态,即用户进程获取到数据就绪信号后阻塞进行 IO 操作。

【I/O】常见的I/O线程模型 目前常见的I/O线程模型有:传统阻塞I/O服务模型和Reactor模式 传统阻塞I/O服务模型 模型特点: 采用阻塞I/O模式获取输入的数据 每个连接都需要独立的线程完成数据的输入、处理和返回 存在问题: 当并发数很大,就会创建大量的线程,占用很大系统资源 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在 Handler对象中的read操作,导致上面的处理线程资源浪费 ... 阅读详情

相关推荐

vue3 web项目引入高拍仪

高拍仪的引入步骤就两步,安装SDK,然后根据官网的api进行开发。根据自己需要的功能,请求对应的接口。

qq_42480170的博客 4118

5种I/O模型

IO

qq_44836676的博客 1万+

Zemax非序列模式实战:手把手教你设计光纤耦合圆光斑整形系统(附Thorlabs透镜选型)

本文提供了一份基于Zemax非序列模式的光纤耦合圆光斑整形系统实战设计指南。文章详细讲解了从圆柱体光源建模、Thorlabs商业透镜库选型调用,到系统搭建、光线追迹与优化的完整流程,旨在帮助工程师高效完成从仿真到落地的光束整形系统设计。

weixin_28335283的博客 633

五种IO模型

IO,即input/output,IO模型即输入输出模型,而比较常见且听说的便是磁盘IO,网络IO.按照冯诺依曼结构的来看,假设我们把运算器、控制器、存储器三个设备看做一个整体(假设称为中转),那么输入设备、输出设备,和中转就构成一个中转IO,也就是说IO是以某一个核心为的,而涉及计算机核心与其他核心之间的过程我们就成为一个IO.

m0_51723227的博客 7146

告别复杂配置:dbswitch vs 传统工具(Kettle/DataX)在Greenplum数据同步中的性能对比

本文深入对比了新兴工具dbswitch与传统ETL工具Kettle、DataX在Greenplum数据同步中的表现。重点分析了dbswitch如何通过免中间文件、利用二进制COPY协议等设计,在异构数据库同步场景下实现更优的性能和更简化的配置,为技术选型提供清晰参考。

transformer2023的博客 1050

软件测试方法——等价类划分法详解

!如果下面这些资料用得到的话可以直接拿走:1、自学开发或者测试必备的完整项目源码与环境2、测试工作中所有模板(测试计划、测试用例、测试报告等)3、软件测试经典面试题4、Python/Java自动化测试实战.pdf5、Jmeter/postman接口测试全套视频获取6、Python学习路线图。

MXB1220的博客 1万+

五种IO模型:操作系统五种IO模型大全

包含操作系统的应用与内核,CPU指令等级,内核空间、用户空间,内核态与用户态;网络IO,磁盘IO,内存IO,异步/同步IO,阻塞/非阻塞IO,以及操作系统的五种IO模型,阻塞IO,非阻塞IO,复用IO(select、poll、epoll)、信号驱动IO模型,异步IO模型等...

緑水長流*z 10万+

地平线旭日X3派(RDK X3)从开箱到联网:新手避坑指南

本文为地平线旭日X3派(RDK X3)新手提供从开箱到联网的完整避坑指南。详细讲解了硬件识别、系统镜像烧录、串口调试(波特率921600)、有线/无线网络配置以及SSH/VNC远程访问等关键步骤,帮助开发者快速搭建稳定的开发环境,为后续AI应用部署扫清障碍。

weixin_29174385的博客 949

IO模型 | 常见的五种IO模型介绍

常见IO模型 对于一次 IO 访问,它会经历两个阶段:等待数据准备就绪 (Waiting for the data to be ready);将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。 举例来说: 读函数:分为等待系统可读和真正的读。 写函数:分为等待网卡可以写和真正的写。 说明: 等待就绪的阻塞是不使用 CPU 的,是在“空等”。而真正的读写操作的阻塞是使用 CPU 的,真正在“干活”,而且这个过程非常快,属于

quwenjing_blog 4552

反激开关电源设计全解析:从CCM/DCM原理到PCB布局实战

开关电源作为现代电子设备的能量转换核心,其核心原理是通过高频开关动作实现高效的电能变换。反激拓扑因其结构简单、成本低廉且易于实现电气隔离,成为小功率离线式电源的主流选择。其技术价值在于通过变压器耦合实现能量存储与传递,解决了安全隔离与多路输出等关键需求,广泛应用于充电器、适配器及家电供电等场景。本文聚焦反激电路,深入剖析其CCM与DCM两种工作模式的原理差异及选型考量,并结合伏秒平衡定律与RCD钳位等热词,详解从变压器计算到MOSFET选型的完整工程设计流程。

weixin_31951365的博客 344

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5805

【网络编程】十四、五种常见IO模型详解

文章主要介绍了五种常见的IO模型,并通过钓鱼的例子形象地解释了这些模型的工作原理。五种IO模型分别是:阻塞式IO、非阻塞式IO、信号驱动式IO、多路转接式IO和异步IO。其中,前四种属于同步IO,进程或线程亲自参与IO处理;而异步IO则由操作系统处理完成后通知应用程序。文章还强调了IO的本质是“等待+数据拷贝”,提高IO效率的关键在于减少等待时间。此外,文章还介绍了高级IO中的重要概念,如同步与异步、阻塞与非阻塞的区别,并提到了一些高级IO技术,如非阻塞IO、多路转接等。最后,文章介绍了fcntl函数,用于

lirendada的博客 1227

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 577

五种常见的IO模型

五种常见的IO模型 第一部分:必须理解的几个重要概念 用户空间和内核空间       现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分...

爱吃蘑菇的小男孩 278

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

操作系统常见的五种IO模型

操作系统常见的五种IO模型如下: 阻塞式IO模型 非阻塞式IO模型 IO多路复用模型 信号驱动IO模型 异步IO模型 下面是详细介绍。 阻塞IO 所谓阻塞IO就是当应用B发起读取数据申请时,在内核数据没有准备好之前,应用B会一直处于等待数据状态,直到内核把数据准备好了交给应用B才结束。 术语描述:在应用调用recvfrom读取数据时,其系统调用直到数据包到达且被复制到应用缓冲区中或者发送错误时才返回,在此期间一直会等待,进程从调用到返回这段时间内都是被阻塞的称为阻塞IO; 非阻塞IO 所谓非阻塞IO就是

HappySundlut的博客 1153

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

这些IO模型你都知道吗 - 五种常见IO模型介绍

面试的时候也许你被问到过IO模型,可能你知道有五种,可是却不一定能准确指出他们之间的关系,下面我们介绍下这五种IO模型五种IO模型阻塞IO非阻塞IOIO复用(select和poll)信号...

宋宝华 975

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java常见的开发模型_java编程开发常见的五种IO模型

IO操作是我们在学习java编程开发语言的时候需要重点掌握的一个编程技术,而今天我们就通过案例分析来了解一下,java编程开发常见的五种IO模型。1、BIOBIO是的一种IO方式,也是简单粗暴的方式,在发起IO操作之后,当前调用线程就会处在阻塞状态,直到数据传输完成。2、NIONIO是在BIO基础之上的一个改进,NIO在数据还未准备好的情况下,不会阻塞进程,而是通过轮询的方式,不断的去查询数据时候...

weixin_30320081的博客 323

常见五种IO模型简介

学会常见的的五种IO模型,包括阻塞IO、非阻塞IO、IO多路复用中select、poll、epoll和信号量IO以及异步IO

热爱生活の李 1372

常见的五种IO模型

同步阻塞IO 死等。你只要不来,我就不走。(一直等着你来,只能接待你一个人) 示例:界面的模态窗,你不输入点什么,或者关闭当前窗口,休想继续下一步。 轮训式非阻塞IO 一会儿问你来不来,你说不来。一会再来问问你来不来,直到你来。(一会催你一下,一会催你一下,只能接待你一个人) 示例:通过while循环的方式,等待输入为“q”的时候,控制台退出。直到等到一个条件的成立,才会结束。 多路复用主动型IO 让哨兵帮你死等,你挨个问哨兵,到底客人来没来。(可以同时接待多个客人) 信号...

『程序员·小李』的博客 381

网络 一篇博文搞懂五种常见的IO模型

概念前情 阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则调用一直阻塞等待 非阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则立即返回一个状态值 阻塞与非阻塞的区别:常用于讨论函数是否阻塞,表示这个函数无法立即完成功能时是否立即返回 同步:功能完成的流程通常是顺序化的,并且功能由进程自身完成 异步:功能完成的流程通常是不确定的,并且功能由系统完成 同步与异步的区别:通常用于讨论功能的完成方式,表示一个功能是否是顺序化且是否由自己来完成 异步的种类:异步阻塞----等待别人完成功能。异

WhiteShirtI的博客 618

什么是非集计模型_这些IO模型你都知道吗 五种常见IO模型介绍

面试的时候也许你被问到过IO模型,可能你知道有五种,可是却不一定能准确指出他们之间的关系,下面我们介绍下这五种IO模型五种IO模型阻塞IO非阻塞IOIO复用(select和poll)信号驱动异步IO(Posix.1 的 aio...系列函数)备注一个输入操作一般分为两个阶段:等待数据准备好把数据从内核拷贝到进程一个套接字的输入操作,第一步是等待数据到达网络,当分组到达时,它被拷贝到内核中...

weixin_36245958的博客 130

什么是非集计模型_这些IO模型你都知道吗 - 五种常见IO模型介绍

五种IO模型阻塞IO非阻塞IOIO复用(select和poll)信号驱动异步IO(Posix.1 的 aio...系列函数)备注一个输入操作一般分为两个阶段:等待数据准备好把数据从内核拷贝到进程一个套接字的输入操作,第一步是等待数据到达网络,当分组到达时,它被拷贝到内核中的某个缓冲区,第二步是将数据从内核缓冲区拷贝到应用缓冲区那我们来分别看下这五种IO模型阻塞IO模型阻塞IO是最通用的IO模型,使...

weixin_35851515的博客 184
上一篇: 一文整理常见Java后端面试题系列——RocketMQ篇(2022最新版)
下一篇: 详解IO多路复用机制——select、poll、epoll的原理和区别
程序猿周周
程序猿周周 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄10年 1万+粉丝 125原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿周周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值