I/O多路复用select/poll/epoll的区别

《Linux系统编程:I/O多路复用select、poll、epoll的区别使用》 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作。但select(),poll(),... 阅读详情

I/O多路复用是一种同步的I/O模型,它允许一个进程监视多个文件描述符,并在一个线程中高效地处理来自多个文件描述符的I/O事件。

工作原理

I/O多路复用通过轮询或事件驱动的方式来监视文件描述符。

  • 轮询方式:应用程序会定期检查所有关注的文件描述符,看它们是否就绪。
  • 事件驱动方式:内核会维护一个就绪链表,当某个文件描述符就绪时,内核会将其添加到链表中,应用程序只需遍历链表即可获得就绪的文件描述符。

主要特点

  • 提高效率:I/O多路复用可以减少应用程序在I/O操作上的等待时间,从而提高应用程序的效率。
  • 节省资源:I/O多路复用可以减少应用程序对线程和进程的使用,从而节省系统资源。
  • 扩展性好:I/O多路复用支持对大量文件描述符进行监视,可以满足高并发应用的需求。

应用场景

I/O多路复用广泛应用于网络编程、服务器端编程等领域,例如:

  • Web服务器:Web服务器需要同时处理来自多个客户端的请求,I/O多路复用可以提高Web服务器的并发处理能力。
  • 聊天服务器:聊天服务器需要同时处理来自多个客户端的聊天消息,I/O多路复用可以提高聊天服务器的响应速度。
  • 文件传输:文件传输需要同时处理多个文件传输任务,I/O多路复用可以提高文件传输的效率。

I/O多路复用的实现

Linux内核提供了三种I/O多路复用机制:

  • select:select是传统的I/O多路复用机制,使用轮询方式来监视文件描述符。
  • poll:poll是select的改进版本,支持更多的文件描述符,并支持边缘触发。
  • epoll:epoll是Linux内核提供的更高效的I/O多路复用机制,使用事件驱动方式来监视文件描述符。

select/poll/epoll 区别

select、poll和epoll都是I/O多路复用技术,用于同时监听多个文件描述符的事件,以便在事件发生时及时响应。它们的主要区别如下:

1. 工作方式

  • select和poll都是轮询方式,即每次调用都需要遍历所有关注的文件描述符,检查它们是否就绪。
  • epoll则是事件驱动方式,内核会维护一个就绪链表,当某个文件描述符就绪时,会将其添加到链表中,应用程序只需遍历链表即可获得就绪的文件描述符。

2. 效率

  • select和poll的效率较低,因为每次调用都需要遍历所有文件描述符,即使大部分文件描述符都没有就绪。
  • epoll的效率更高,因为只需要遍历就绪链表,而链表的长度通常远小于文件描述符集合的长度。

3. 扩展性

  • select和poll都存在最大文件描述符数量的限制,这个限制是由系统内核决定的。
  • epoll没有这个限制,可以支持非常大量的文件描述符。

4. 其他区别

  • select只支持水平触发,即只要文件描述符就绪,就会一直触发事件。
  • epoll支持水平触发和边缘触发,边缘触发只在文件描述符状态发生变化时触发事件。
  • select、poll和epoll都支持对文件描述符的读、写和异常事件进行监听。

源码层面分析

1. 数据结构

  • select使用fd_set结构来表示文件描述符集合,poll使用pollfd结构来表示文件描述符和事件。
  • epoll使用epoll_event结构来表示文件描述符和事件,并使用红黑树来维护就绪链表。

2. 函数

  • select、poll和epoll都提供了相应的系统调用函数,用于监视文件描述符的事件。
  • epoll还提供了一些额外的函数,用于控制就绪链表、设置边缘触发等。

3. 工作流程

  1. 应用程序调用select/poll/epoll系统调用,传入要监视的文件描述符集合、事件类型和超时时间。
  2. 内核遍历所有文件描述符,检查它们是否满足指定的事件条件。
  3. 如果有文件描述符满足事件条件,内核将该文件描述符添加到相应的就绪结构中。
  4. 如果没有文件描述符满足事件条件,并且没有设置超时时间,则内核会将进程挂起等待事件发生。
  5. 如果有文件描述符满足事件条件,或者超时时间到期,则内核会唤醒进程。
  6. 应用程序从就绪结构中获取就绪的文件描述符,并进行相应的处理。

4. 源码示例

select

C

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);

poll

C

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

epoll

C

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

总结

select、poll和epoll的源码实现比较复杂,但基本原理相同。它们都是通过不同的方式来监视多个文件描述符的事件,并利用内核提供的机制来实现。

  • select和poll是传统的I/O多路复用技术,简单易用,但效率较低,扩展性有限。
  • epoll是Linux内核提供的更高效、更可扩展的I/O多路复用技术,是现代网络编程中常用的选择。
FDTD脚本教程——结构的创建 文章目录结构的搭建创建长方体创建柱体多边形柱体(椭)圆柱体圆环柱自定义形状创建surface波导球棱锥 在lumerical中,可以使用脚本进行操作,可在右侧脚本编辑器运行,或者直接在下方shell输入。 结构的搭建 创建长方体 um = 1e-6; nm = 1e-7; addrect; set("name","myRect"); set("material","SiO2 (Glass) - Palik"); set("render type","wireframe"); # 默认是细节渲染,也就是det 阅读详情

相关推荐

富斯遥控器-ros机器人控制

富斯遥控器-ros机器人手柄控制

zkh7758的博客 1699

epoll 为什么能提高网络性能

epoll 提高网络性能的原因

一叶知秋的博客 491

电赛控制-----经验分享

1.赛前准备 先简单介绍一下电赛。电赛是两年一届,单数年是大电赛,全称是全国大学生电子设计大赛,之前由瑞萨电子赞助,所以之前也叫瑞萨杯,从19年开始赞助方变成了TI公司,偶数年是小电赛,全称是“TI杯”模电邀请赛,(这里不得不提TI公司的实力是愈来愈大了),一般来说小电赛的含金量会略低于大电赛,而且对与想拿国奖的同学来说还是要参加大电赛,因为小电赛一般每个学校会限制只有两个队伍进国赛,而大电赛是没有这个限制的,而且我们学校电赛保研的话,大电赛只要求国二,而小电赛只有国一才可以保,这样难度就增加了很多。..

qq_35656655的博客 1万+

I/O多路复用select、poll、epoll的区别

select 和 poll:都使用水平触发模式(Level-Triggered),即当文件描述符状态就绪时,会一直通知应用程序进行处理,直到应用程序处理完所有数据后才返回阻塞状态。select:受文件描述符数量限制,一般默认在32位系统上限制为1024个,64位系统上限制为2048个,可以通过修改内核参数来增加,但性能可能会受影响。epoll:由于采用了事件驱动和回调机制,且没有文件描述符数量的限制,因此在处理大量并发连接时表现出色,性能和扩展性都优于select和poll。

刘皇叔说Java的博客 1132

PCB激光直接成像(LDI)设备技术解析与优化方案

激光直接成像(LDI)是PCB制造中的关键数字化工艺,通过激光束直接在基板上形成电路图案。其核心技术在于高精度光学系统与智能控制算法的结合,工作精度可达微米级。在HDI板、柔性电路等高端PCB制造中,LDI技术能显著提升线宽精度和层间对位准确性。当前行业面临材料适配性、热变形控制等挑战,动态能量补偿、多波长曝光等创新方案正在突破这些瓶颈。随着模块化设计、预测性维护等工程实践的普及,LDI设备综合效率持续提升,为5G、汽车电子等领域的精密电路生产提供关键技术支撑。

weixin_29168393的博客 391

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

IO多路复用中select/poll/epoll的区别

select : 1.最多监听1024个文件描述符 2.select有清空表的过程,需要反复从用户空间向内核空间拷贝文件描述符。效率较低。 3.select需要遍历所有的文件描述符,找到准备好的文件描述符,这个遍历的过程非常浪费时间。 poll : 1.监听文件描述符没有个数限制 2.poll没有清空表的过程,效率比select高。 3.poll也需要遍历所有的文件描述符,找到准备好的文件描述符,这个遍历的过程非常浪费时间。 epoll :(本世纪最好的IO多路复用机制) 1.监听文件描述符没有个数限制

weixin_42510813的博客 200

二、TCP/IP协议之网络层(IP地址的格式、分类、报文格式)

数据报每经过一个路由器,路由器都要重新计算一下首部检验和,若首部未发生变化,则此结果必为 0,于是就保留这个数据报。对于网络号相的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。在首部的固定部分的后面是一些可选字段,其长度是可变的。IPv4 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。表示数据报在网络中的寿命,英文缩写是 TTL(Time To Live),功能是“跳数限制”。地址的网络号码字段用来标识一个网络,网络号码字段的前几位用来区分。

锦慈的技术博客 185

i/o多路复用(一次认清select,poll,epoll的区别)

关键词:线性结构存储 用户态到内核态频繁拷贝 文件描述符最大限制1024 每次轮询所有描述符1.select是底层原理是基于一个线性结构fd_set来存储文件描述符集合2.每次select都会将文件描述符集合从用户态拷贝到内核态,由内核来检测对应的文件描述符是否有事件发生,3.内核检测到文件描述符有对应事件发生,就将对应的标志位置为1,检测完毕将修改后的集合拷贝回用户态。4.然后再由用户遍历每个文件描述符是否有事件就绪,有事件就绪则执行相关的事件。

qq_62821433的博客 1238

【ROS机器人系统】自主导航+YOLO目标检测+语音播报

完成自主导航功能,并在小车移动至指定地点的过程中,通过机器人的摄像头检测导航途中所见物体,识别出物体的种类(框选出不同物体并标注识别结果),结合科大讯飞语音合成模块对识别结果进行语音播报。..............................

南京大学软件工程硕士在读 2万+

51单片机 DHT11温湿度传感器LCD显示+串口打印+Proteus仿真

DHT11+LCD1602+串口输出+Proteus仿真

perseverance51博客 7198

I/O多路复用机制的区别(select, poll, epoll)

每次调用时,都需要将完整的fd集合从用户态拷贝到内核态。最后再将整个集合(或标记了就绪状态的集合)拷贝回用户态,用户程序还需要再次遍历以找出真正就绪的fd。epoll主要通过其独特的设计机制来显著减少数据拷贝的开销,其核心在于将频繁的、全量的数据拷贝转变为一次性的注册和高效的事件通知。所有被监视的fd,而只需检查就绪链表是否为空。这个回调函数,该函数将对应的fd加入到就绪链表中。,应用程序可以直接处理,无需再遍历所有监控的fd来判断哪些真正就绪。系统调用,将需要监控的文件描述符(fd)及其关注的事件。

melonbo的专栏 711

使用R语言中的NbClust包确定最佳聚类簇数

聚类分析是一种常用的数据分析技术,它将相似的数据点分组成不同的簇。NbClust包是R语言中一个强大的工具,它提供了多种方法来帮助我们确定最佳的聚类簇数。综上所述,使用R语言中的NbClust包可以帮助我们确定最佳的聚类簇数。通过选择适当的聚类算法和评估指标,我们可以更好地理解数据集的结构和模式,并根据需要进行进一步的分析和解释。此外,NbClust包还提供了其他函数和参数,用于执行不同的聚类算法、选择不同的评估指标等。安装完毕后,我们需要加载NbClust包,以便使用其中的函数。函数来确定最佳聚类簇数。

2301_79326559的博客 2279

【I/O多路复用】select、poll、epoll的区别

文章目录

Lebron 1464

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux系统编程——I/O多路复用select、poll、epoll的区别使用

I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。 select(),poll(),epoll()都是I/O多路复用的机制。I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪,就是这个文件描述符进行读写操作之前),能够通知程序进行相应的读写操作。但select(),poll

秋叶原 && Mike || 麦克 16万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Linux】I/O多路复用——select、poll、epoll的区别

I/O复用 I/O多路复用是为了解决进程或线程阻塞到某个I/O系统调用而出现的技术,使进程不再阻塞于某个特定的I/O系统调用。 利用select、poll、epoll实现多个端口通信。I/O复用使得程序能同时监听多个文件描述符,当某个文件描述符就绪时,能够通知程序进行相应的读写操作,但select()、poll()、epoll()本身是阻塞的,直到出现就绪的文件描述符。并且当多个文件描述符同时...

QX_a11的博客 429

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

I/O多路复用:select、poll和epoll区别

select poll epoll

goodgoodstudy___的博客 339

I/O模型与I/O多路复用之select、poll 和 epoll 的区别

1、对于多进程或多线程I/O 同步与异步:针对多个事件(线程或进程)来说的。如果事件A需要等待事件B的完成才能完成,这种串行执行的机制称为同步。这是可靠的任务序列,要么都成功要么都失败。如果事件A的执行不需要事件B的完成结果,这种并行的执行机制称为异步。事件AB相互不知道对方是否完成,是不可靠的任务序列。 2、对于单进程或单线程I/O 阻塞与非阻塞:针对单一事件(线程或进程)来说的。阻塞:如...

xzengwei1313的博客 436

I/O多路复用的select、poll,以及epoll的区别

问题提出 在Linux2.6中,加入了新的api:epoll,对比以前使用select和poll,epoll的增加使得性能大大提升,这是如何实现的?epoll的工作模式有哪几种?其内部原理是什么? 相关 文件描述符:索引值,指向记录表,当程序打开或者创建一个文件时,内核向进程返回一个文件描述符。 在网络编程中,很多函数是阻塞的,利用IO复用可以用非阻塞的形式来执行代码。同时处理读写、监听多端口等...

Zero's Zone 418

I/O模型以及多路复用三种实现方式select、poll和epoll比较及区别

I/O过程: 图 图中明显忽略了很多细节,仅显示了涉及到的基本步骤。 注意图中用户空间和内核空间的概念。用户空间是常规进程所在区域。JVM 就是常规进程, 驻守于用户空间。用户空间是非特权区域:比如,在该区域执行的代码就不能直接访问硬件设备。 内核空间是操作系统所在区域。内核代码有特别的权力:它能与设备控制器通讯,控制着用户区域 进程的运行状态,等等。最重要的是,所有 I/O 都...

hotpots--火锅技术栈 3027

I/O多路复用---epoll、poll、select的区别

多路复用概念 I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 阻塞I/O有一个比较明显的缺点是在I/O阻塞模式下,一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,需要多个进程或者多个线程,但是这种方式效率不高。 非阻塞的I/O需要轮询查看流是否已经准备好了,比较典型的方式是忙轮询。 忙轮询 ...

wuud__的博客 313

2020-08-22:I/O多路复用中select/poll/epoll的区别?

福哥答案2020-08-22: select,poll,epoll 都是 操作系统实现 IO 多路复用的机制。 我们知道,I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是 读就绪或者写就绪),能够通知程序进行相应的读写操作。那么这三种机制有什 么区别呢。 1、支持一个进程所能打开的最大连接数 select:单个进程所能打开的最大连接数有 FD_SETSIZE 宏定义,其大 小是 32 个整数的大小(在 32 位的机器上,大小就是 3232,同 理 64 位机器上 FD_SETS

福大大架构师每日一题 2万+

select、poll、epoll 到底有什么区别?一文讲透 I/O 多路复用

等待数据准备好从内核向进程复制数据对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。阻塞式 I/O非阻塞式 I/OI/O 复用(select 和 poll)信号驱动式 I/O(SIGIO)异步 I/O(AIO)

VFK3sLDl4的博客 227

Linux I/O多路复用之select,poll与epoll区别

1 selectselect()系统调用提供一个机制来实现同步多元I/O:#include #include #include int select (int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct

和大黄的博客 1万+

I/O多路复用中select、poll和epoll区别

I/O多路复用中select、poll和epoll区别 select: 通过它,我们可以把文件描述符的数组发给操作系统, 让操作系统去遍历,等到数据到达后,告诉我们哪个文件描述符可以读写。操作系统内核做遍历,没有用户态到内核态的切换开销 poll:它和 select 的主要区别就是,去掉了 select 只能监听 1024 个文件描述符的限制。因为select描述符类型使用的是数组,默认大小是1024;poll的描述符类型是链表。 epoll:解决了select的三大不足,内核中保存一份文件描述符集合,可

qq_46045632的博客 450
上一篇: Volatile是什么?
下一篇: redis多线程是啥?
byteinit
博客等级 码龄17年 326粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值