非阻塞I/O多路复用模型

C++高性能服务器优化:从阻塞模型到非阻塞I/O多路复用实战 在网络编程中,I/O多路复用是一种核心机制,它允许单个线程高效监控和管理大量网络连接的状态变化。其原理在于通过系统调用(如epoll、kqueue)将多个文件描述符的I/O事件集中处理,当任一描述符就绪时,内核通知应用程序进行非阻塞读写,从而避免了传统阻塞模型中为每个连接创建独立线程带来的巨大资源开销和上下文切换损耗。这项技术的核心价值在于显著提升服务器的并发处理能力和资源利用率,是实现高并发、高性能网络服务(如Web服务器、实时通信系统)的基石。在C++服务器开发中,结合非阻塞I/O与事件驱动架构,能够有 阅读详情

 

目录

1.传统阻塞I/O模型

2.非阻塞I/O多路复用模型

3.I/O多路复用模型的应用


1.传统阻塞I/O模型

传统的I/O阻塞模型中的“阻塞”的含义是指当前线程的阻塞性,下面用一图来说明这一阻塞I/O模型(读操作)。

看图中易知:整个I/O请求过程中用户线程是阻塞的,所以cpu的利用率大打折扣。

改进版本:上述过程中能否使得用户线程不是阻塞的呢?当然可以,见下图:

上述版本可以认为是同步的非阻塞的I/O版本,但是用户线程还是一直处于读的忙碌的过程中,无法抽出身进行其他事务。

现在提出新的需求,能否使得上述改进版本中的用户线程解放出来,使得用户线程可以去进行其他任务,当然是可以的,I/O多路复用模型解决了这个问题。

2.非阻塞I/O多路复用模型

I/O多路复用模型必须使用系统提供的select函数来监控当前读写状态,通过select函数的监控能力+reactor设计模式便可以实现非阻塞I/O多路复用模型,这样用户线程真正得到解放。如图所示:

从图中可以看出,用户线程只需要先进行事件注册以及读请求就可以完成一次读事件,用户线程不阻塞并且可以去做其他任务。监控I/O的任务交给reactor完成,reactor需要不断轮询直到数据被准备好,最后还要通知用户线程现在数据可读,希望用户线程触发读操作读入数据。综上所述,I/O多路复用模型较传统轮询式非阻塞I/O模型将轮询任务转嫁给reactor从而实现用户线程的解放。

3.I/O多路复用模型的应用

最后说下I/O复用模型常见的使用场景。redis就是采取的I/O多路复用模型,我们知道redis的读写速度极快,研究表明速度可达100000QPS,这样的高速使得redis在单线程工作下依然能够取得优越的性能,那么redis是如何解决I/O读写时用户主线程的轮询或者阻塞问题呢(如第一点所述)?没错,redis就是使用了I/O多路复用模型,解放了主线程,使得redis仅在主线程这一个线程中依靠其高读写速度实现了对客户端多个请求的处理。

 

同步I/O、异步I/O、阻塞I/0、非阻塞I/O、五种I/O模型、高性能网络模型 面试最常问问题之二:五种I/O模型及区别 ​ 阅读详情

相关推荐

I/O模型

1 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 IO 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系

希望我的博客,能帮上你解决学习中工作中所遇到的问题 881

IO模型(阻塞,非阻塞,多路复用)

在IO 多路复用模型中,对于每一个socket,一般都设置成为non-blocking,但是,整个用户的进程其实是一直被block的。但是不知道饭能什么时候做好,只好在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。与第二个方案差不多,餐厅安装了电子屏幕用来显示点餐的状态,这样我和女友逛街一会,回来就不用去询问服务员了,直接看电子屏幕就可以了。这样每个人的餐是否好了,都直接看电子屏幕就可以了,所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。.....

m0_51274562的博客 2732

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

io模型初探

操作系统负责计算机的资源管理和进程调度。应用需要经过操作系统,才能做一些特殊操作,如磁盘读写,内存读写等。应用程序要把数据写入磁盘,只能通过调用操作系统开放出来的API来操作。应用程序在用户空间,不存在实质的io过程,真正的io在操作系统执行,应用程序发起一次IO操作包含两个阶段:操作系统内核完成IO操作还包括两个过程:其实io就是把进程内部数据转移到外部设备,或者把外部设备的数据迁移到进程内部。外部设备一般指 硬盘,socket通讯的网卡。一个完整的io过程包括这几个步骤知道什么是io了,什么是阻塞io

MrPeng的博客 404

国产PHY芯片YT8512H替代LAN8742A的实战指南(STM32F407平台)

本文详细介绍了在STM32F407平台上,使用国产PHY芯片YT8512H替代LAN8742A的完整实战过程。文章深入剖析了硬件设计中的关键信号连接差异(如CRS_DV与RXDV复用)、时钟布线要点,并提供了软件驱动修改、PHY配置及调试排错的系统指南,旨在帮助工程师高效完成国产化替代,规避常见陷阱。

defi6farmer的博客 854

目标检测——布匹缺陷检测数据集

结构瑕疵指的是布料本身的缺陷,包括嵌结、抽纱、错纱、断纱、预缩等问题,这些问题通常是在布料生产过程中出现的。而质量瑕疵则是指布料在使用过程中出现的问题,如污渍、断裂、鼓囊、针眼等,这些问题可能由生产过程中的结构瑕疵导致,也可能是在运输、存放和使用过程中引起的。布匹瑕疵如缺纬、断纬、粗纬、松纬、缺经、断经、粗经、筘痕、污点、破损等,若未得到及时有效的检测,这些瑕疵产品可能会流向市场,导致消费者的不满和退货,严重影响企业的声誉和品牌形象。织疵包括缺经、缺纬、跳花、弓纱、错纱、厚薄段、油污渍等;

zzjlhlcd的博客 612

Redis非阻塞IO复用模型

Redis线程模型(非阻塞IO复用模型) Redis优点 基于内存,C语言编写-速度快 非阻塞的IO复用模型机制 单线程- 避免多线程的频繁上下文切换问题 丰富的数据结构 - 字符串、链表、哈希、集合、有序集合 文件事件处理器(file event handler) Redis服务器是一个事件驱动程序 Redis基于Reactor模型开发了自己的网络事件处理器 - 文件事件处理器 文件事件处理器使用I/O多路复用(multiplexing)同时监听多个套接字,并根据套接字目前执行的任务为套接字关联不

GeekDengshuo 799

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5397

IO多路复用机制

讲述 阻塞IO、非阻塞IO以及 IO多路复用的原理

明月朗,潇水寒 1124

AD20丝印层导入图片logo保姆级教程(附黑白预览避坑技巧)

本文提供了一份详尽的AD20丝印层导入图片Logo的实战指南。核心在于将图片预处理为高质量的单色BMP位图,并独家分享了利用Windows画图工具进行“黑白预览”的关键技巧,以提前规避转换失真。教程涵盖了从脚本获取、图片处理、参数设置到生产规范的完整流程,帮助硬件工程师高效、准确地在PCB的Top Overlay层添加个性化标识。

weixin_29194255的博客 385

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

五种IO模型:同步阻塞I/O、同步非阻塞I/O、同步I/O复用模型、同步信号驱动I/O、异步I/O模型

阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行,全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理,完成后内核通知进程IO完成。同步:执行一个操作之后,进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成,等待结果,然后才继续执行后续的操作。

CLZHIT的博客 1345

I/O 模型——阻塞 I/O、非阻塞 I/O、 I/O 多路复用、信号驱动 I/O、异步 I/O

模型特点使用场景优缺点阻塞 I/O阻塞操作,直到完成才返回简单应用场景,如文件操作编程简单,但性能差,阻塞线程,不适合高并发非阻塞 I/O发起 I/O 操作后立即返回,若没有准备好则返回错误适合高并发场景,轮询检查 I/O 状态编程复杂,CPU 占用高I/O 多路复用单线程监听多个 I/O 事件,减少线程切换开销高并发服务器,网络通信编程复杂,某些实现效率低,需频繁系统调用信号驱动 I/O使用信号来通知 I/O 完成较少使用,主要用于特定的事件处理编程复杂,信号处理可能影响控制流。

1345

代码复现5——VLMaps

报错“AttributeError: module 'clip' has no attribute 'load'”,运行下述命令解决。运行后接着报错:“ModuleNotFoundError: No module named 'pytorch_lightning'”运行后命令后会弹出一个RGB窗口,可以用键盘上的“W”“A”“D”键控制移动视角的变化,“空格”键开始记录,“q”键停止。并更改相关代码文件,vlmaps/vlmaps/lseg/modules/models/lseg_vit.py。

qq_44100524的博客 603

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

day 39 I/O模型之阻塞I/O模型、非阻塞I/O模型、多路复用

今日内容:阻塞I/O模型、非阻塞I/O模型、多路复用 阻塞、非阻塞:程序的运行状态。   阻塞:指遇到I/O操作;非阻塞:指运行态与就绪态 同步、异步:任务的提交方式。   同步:指提交任务后在原在等待,等任务运行完毕后再执行其他代码;   异步: 提交任务不用等,直接运行其他代码,通常与回调函数一起使用 I/O模型:模型就是一种解决问题的套路方法 ,I/O模型解决的是在单线程下的I/...

weixin_30419799的博客 293

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

weixin_38597669的博客 1621

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

I/O模型(同步阻塞I/O,同步非阻塞I/O,I/O多路复用,信号驱动I/O,异步I/O)

1、I/O是什么? 根据冯·诺依曼结构,计算机结构分为5大部分:运算器、控制器、存储器、输入设备、输出设备。 从计算机结构上来说,IO就是计算机系统和外部设备(输入设备、输出设备,硬盘等也属于外部设备)之间的通信的过程。 从应用程序上看,为了保证操作系统的稳定性和安全性,一个进程的地址空间分为用户空间(User space)和内核空间(Kernel space)。 我们平时运行的应用程序都是运行在用户空间的,只用内核空间才能进行系统态级别的资源操作,如文件管理、内存管理,进程通信等。而用户空间的程序是不能

weixin_42142057的博客 652

Linux/Unix I/O模型全解析:阻塞、非阻塞、多路复用、信号驱动、异步I/O与Reactor/Proactor模式及select/poll/epoll实践

本文全面解析Linux/Unix系统中的I/O模型,包括阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O,详述内核数据准备与拷贝的两个阶段。深入探讨Reactor模式(单/多Reactor单/多线程)与Proactor模式的实现、优缺点及应用场景,对比select、poll、epoll的性能与机制,并分析BIO、NIO、AIO及信号驱动I/O的特点。为高性能网络编程提供理论基础与实践参考

weixin_45922644的博客 1340

python 之 并发编程(非阻塞IO模型、I/O多路复用、socketserver的使用)

9.16 非阻塞IO模型 cpu占用率过高 服务端: from socket import * import time s = socket() s.bind(('127.0.0.1',8080)) s.listen(5) s.setblocking(False) #使accept接收不到连接时不在阻塞 ​ r_list=[] while True: ...

191

网络编程I/O模型

非阻塞IO、fcntl函数、I/O多路复用、select函数、poll函数、并发服务器、循环服务器、

only_write_bug的博客 978

计算机系统I/O模型与I/O多路复用学习笔记

特性阻塞 I/O非阻塞 I/OI/O 多路复用信号驱动 I/O异步 I/O数据准备阶段阻塞立即返回 (需轮询)阻塞在多路复用调用上立即返回立即返回数据拷贝阶段阻塞阻塞 (当数据就绪)阻塞 (在就绪的 FD 上操作)阻塞不阻塞(内核完成)线程使用1 线程 / 1 连接1 线程可轮询多连接1 线程可管理大量连接1 线程可管理多连接1 线程可管理大量连接CPU 效率等待时低轮询时高 (浪费)高 (只在事件就绪时处理)高最高编程复杂度简单中等中等 (多路复用 API)

yuhui2331的博客 1699

什么是IO多路复用,理解IO多路复用

一、什么是socket? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算...

heidou_2016的博客 1万+

Linux 网络I/O模型

Linux下面一共有五种可以使用的I/O模型,如下:1)阻塞式I/O2)非阻塞式I/O3)I/O多路复用(select与epoll)4)信号驱动式I/O5)异步I/O下面重点介绍前三种I/O模型。

个人技术博客 629

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

Java 网络 I/O 编程:同步阻塞 I/O,同步非阻塞 I/O 和 I/O 多路复用

lybugproducer的博客 1363
上一篇: 事务的四大隔离级别中的幻读问题
下一篇: 数据库下的阻塞和死锁的理解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值