io多路复用的原理和实现_IO多路复用机制详解

article/2025/10/19 10:18:35

select,poll,epoll机制区别总结:
在这里插入图片描述
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:

(1)同步阻塞IO(Blocking IO):即传统的IO模型。

(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。

(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Linux中的epoll都是这种模型。

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

另外,Richard Stevens 在《Unix 网络编程》卷1中提到的基于信号驱动的IO(Signal Driven IO)模型,由于该模型并不常用,本文不作涉及。接下来,我们详细分析四种常见的IO模型的实现原理。为了方便描述,我们统一使用IO的读操作作为示例。

IO多路复用

要弄清问题先要知道问题的出现原因

原因:

由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞在这个调用上,不能执行其他操作.阻塞很正常.

接下来考虑这么一个问题:一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将阻塞,直到客户端调用write(sockfd,but,size)发来数据.在一个客户和服务器通信时这没什么问题;

当多个客户与服务器通信时当多个客户与服务器通信时,若服务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达套接字sockfd2时,服务器不能处理,仍然阻塞在read(sockfd1,…)上;此时问题就出现了,不能及时处理另一个客户的服务,咋么办?

I/O多路复用来解决!

I/O多路复用:
在这里插入图片描述
继续上面的问题,有多个客户连接,sockfd1,sockfd2,sockfd3…sockfdn同时监听这n个客户,当其中有一个发来消息时就从select的阻塞中返回,然后就调用read读取收到消息的sockfd,然后又循环回select阻塞;这样就不会因为阻塞在其中一个上而不能处理另一个客户的消息

Q:

那这样子,在读取socket1的数据时,如果其它socket有数据来,那么也要等到socket1读取完了才能继续读取其它socket的数据吧。那不是也阻塞住了吗?而且读取到的数据也要开启线程处理吧,那这和多线程IO有什么区别呢?

A:

1.CPU本来就是线性的不论什么都需要顺序处理并行只能是多核CPU

2.io多路复用本来就是用来解决对多个I/O监听时,一个I/O阻塞影响其他I/O的问题,跟多线程没关系.

3.跟多线程相比较,线程切换需要切换到内核进行线程切换,需要消耗时间和资源.而I/O多路复用不需要切换线/进程,效率相对较高,特别是对高并发的应用nginx就是用I/O多路复用,故而性能极佳.但多线程编程逻辑和处理上比I/O多路复用简单.而I/O多路复用处理起来较为复杂.

  1. 五种I/O模型介绍

IO 多路复用是5种I/O模型中的第3种,对各种模型讲个故事,描述下区别:

故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。

1.阻塞I/O模型

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

2.非阻塞I/O模型

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。

耗费:往返车站6次,路上6小时,其他时间做了好多事。

3.I/O复用模型

1.select/poll

老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次

2.epoll

老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话

4.信号驱动I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话

5.异步I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。

耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话

1同2的区别是:自己轮询

2同3的区别是:委托黄牛

3同4的区别是:电话代替黄牛

4同5的区别是:电话通知是自取还是送票上门


http://chatgpt.dhexx.cn/article/xUsX2hYy.shtml

相关文章

【多路复用器介绍】

【多路复用器介绍】意义 作用 实现 意义逻辑电路原理结构与真值表逻辑电路 实现代码参考资料 意义 多路复用器将接收的复合数据流,依照信道分离数据,并将它们送到对应的输出线上,故称为解多路复用器。 实际生活中,使用多路复用器…

多路复用技术(频分多路复用、时分多路复用和波分多路复用)

基带信号就是将数字信号1或0直接用两种不同的电压来表示,然后送到线路上去传输。 宽带信号则是将基带信号进行调制后形成的频分复用模拟信号。 多路复用技术的基本原理是:各路信号在进入同一个有线的或无线的传输媒质之前,先采用调制技术把…

8、多路复用技术

这一节,我们介绍信道的多路复用,作为数据通信基础的收尾知识点,这个知识点并没有特别复杂的地方,主要是理解不同的复用技术的特点,在一些考试中也没有多少考点,或者说不做重点。 多路复用技术 先从字面上来…

TCP/IP多路复用

所有网络通信的本质目标就是进程间通信。 除了寻址(Addressing),IP 协议还有一个非常重要的能力就是路由。 寻址告诉我们去往下一个目的地该朝哪个方向走,路由则是根据下一个目的地选择路径。寻址更像在导航,路由更像…

多路复用,讲的很明白

作者:罗志宇 链接:https://www.zhihu.com/question/32163005/answer/55772739 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 假设你是一个机场的空管, 你需要管理到你机场的所有…

全网最详细的 I/O 多路复用解析

前言 IO多路复用目前在大厂的面试中,一般在两个地方可能会被问到,一个是在问到网络这一块的时候,另一个是在问到 Redis 这一块的时候,因为 Redis 底层也是使用了IO多路复用,所以整体来说 IO多路复用,也算是…

计算机网络基础之多路复用技术

温故: 1、单工传输:单工传输只支持数据在一个方向上传输,数据传送只能在一个方向上进行,任何时候都不能改变方向,就像公路上的单行道,例如无线电广播。 2、半双工传输:半双工传输允许数据在两个方向上传输&…

《JAVA核心知识》学习笔记(JVM)-1

JVM (1) 基本概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。 JVM 是运行在操作系统之上的,它与硬件没有直接 的交互 Hotspot JVM 后台运行的系统线…

多路复用技术概述

概述频分复用(Frequency Division Multiplexing)时分复用(Time Division Multiplexing)波分复用(Wave Division Multiplexing)码分复用(Code Division Multiplexing) 概述 数据是在物理链路的信道中传输的,通常一条链路上会有多条信道。在默认情况下,一…

计算机网络-多路复用

什么是多路复用技术呢? 多路复用(multiplexing),简称复用,是通信技术中的基本概念 。 事实上,多路复用技术的原理就是,把通信资源或者说是链路、信道资源进行的划分,分成一系列的资源片。把这些资源片分配…

一、多路复用

1.什么是多路复用 数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个信号组合起…

分类变量回归: R语言中哑变量编码本质

本篇描述分类变量如何进行回归(翻译自http://www.sthda.com/english/articles/40-regression-analysis/163-regression-with-categorical-variables-dummy-coding-essentials-in-r/) 分类变量(也称为因子或定性变量)是可以将观测数据分组的变量。它们有…

python哑变量转换为类别变量

就是get_dummies()功能的逆变化,把哑变量重新变为类别变量 原先的数据 转变后的数据 代码如下: df.columns[1,2,3,4,5,6]df df[df1].stack().reset_index() df.columns[A,B,C] print(df) del df[A] del df[C]

回归模型中的哑变量

在构建回归模型时,如果自变量X为连续性变量,回归系数β可以解释为:在其他自变量不变的条件下,X每改变一个单位,所引起的因变量Y的平均变化量;如果自变量X为二分类变量,例如是否饮酒(…

Python超实用小技巧:分类变量转化为哑变量(附哑变量详解)

代码示例 features ["Pclass", "Sex", "SibSp", "Parch"]# 筛选出分类变量用来建模X pd.get_dummies(train[features])# 把分类变量转化为哑变量 哑变量详解 定义:哑变量(DummyVariable)&#xf…

多元线性回归哑变量设置方法

多元线性回归是研究一个连续型变量和其他多个变量间线性关系的统计学分析方法,如果在自变量中存在分类变量,如果直接将分类变量和连续性变量统一纳入模型进行分析是有问题的,尤其是无序分类资料,即使进入了模型,也难以…

matlab虚拟变量,不要再稀里糊涂的做回归了:如何设置哑变量

原标题:不要再稀里糊涂的做回归了:如何设置哑变量 虚拟变量 ( Dummy Variables) 又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。引入哑变量可使线形回归模型变得更…

哑变量与逻辑回归

哑变量与逻辑回归 数据 部分数据: admit,gre,gpa,rank 0,380,3.61,3 1,660,3.67,3 1,800,4,1 1,640,3.19,4 0,520,2.93,4 1,760,3,2 1,560,2.98,1 0,400,3.08,2 1,540,3.39,3 0,700,3.92,2 0,800,4,4 0,440,3.22,1 1,760,4,1 0,700,3.08,2 1,700,4,1导入库 numpy…

哑变量处理

dummyVars(formula, data, sep “.”, levelsOnly FALSE, fullRank FALSE, …) sep:因子变量名及其级别之间的可选分隔符。使用sep NULL表示没有分隔符(即模型的正常行为)。 data4 <- read.csv("玩家玩牌数据.csv") head(data4) library(VIM) aggr(data4,pro…

哑变量的基本介绍及R语言设置

哑变量的基本介绍及R语言设置 1. 哑变量的基本介绍【摘自医咖会】1.1 什么是哑变量&#xff1f;1.2 什么情况下需要设置哑变量?1.3 如何设置哑变量的参照组&#xff1f;1.4 设置哑变量时的注意事项 2. R语言中哑变量的设置2.1 示例数据2.2 哑变量设置的4种方式2.3 线性回归小实…