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多路复用技术,是现代网络编程中常用的选择。
YOLOv11模型改进:利用注意力机制实现小目标检测精度跃升 如果你在实操中遇到精度提升不明显或速度下降过多的问题,不妨尝试调整注意力模块的类型(如替换为CA)或插入层级,或针对性优化小目标的数据集增强策略。记住,小目标检测的核心是“特征强化与空间定位”,只要结合业务场景灵活调整注意力模块的组合,你也能让YOLOv11在小目标识别任务中脱颖而出。接下来,我们从模块选型到代码落地,一步步带你打造“小目标检测专精版”YOLOv11,真正帮你解决工业场景中(如安防、质检)的小目标识别痛点。在城市安防场景中,改进后的YOLOv11对远处行人、车辆(小目标)的识别准确率提升。 阅读详情

相关推荐

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5005

epoll 为什么能提高网络性能

epoll 提高网络性能的原因

一叶知秋的博客 491

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1579

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

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

刘皇叔说Java的博客 1132

YOLOv8实战:用Labelme标注自定义数据集并训练分割模型(附完整代码)

本文详细介绍了使用Labelme标注自定义数据集并训练YOLOv8实例分割模型的完整流程。从环境搭建、数据标注与格式转换,到模型训练、调优、验证及部署,提供了实战代码和调优建议。文章还探讨了如何结合追踪目标技术,实现视频流中的实例分割与目标追踪,为计算机视觉应用提供了一套可复制的解决方案。

552

LBS之五:时空索引--空间邻域搜索的高效实践

时空索引的原理及最佳实践

whascj的博客 1365

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

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

weixin_42510813的博客 200

实战分享:如何用Jetson Nano+HM30图传搭建低空YOLOv5检测系统(附VNC避坑指南)

本文详细介绍了如何利用Jetson Nano和HM30图传搭建低空YOLOv5检测系统,重点解决了无人机应用中的硬件连接和VNC延迟优化问题。通过对比WiFi直连与图传方案的优劣,提供了网络配置、VNC优化及YOLOv5模型加速的实战技巧,帮助开发者实现高效稳定的低空目标检测系统。

weixin_29174385的博客 110

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

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

qq_62821433的博客 1238

基于近场动力学的二维疲劳裂纹扩展模型_近场动力学数值模拟的程序实现(1)——引言...

参考书目W. H. Gerstle. 2015. Introduction to Practical Peridynamic: Computational Solid Mechanics Without Stress and Strain.E.Madenci, A.Barut, M.Dorduncu. Peridynamic Differential Operator for Numerical ...

weixin_39764603的博客 1202

单片机OTA升级:Bootloader如何多重校验保障APP完整性?

本文详细介绍了单片机OTA升级中Bootloader如何通过CRC校验、数字签名、版本比对和存储位置检查等多重校验机制保障APP完整性。CRC校验作为快速检测数据完整性的核心手段,结合其他安全措施有效防止设备变砖和安全漏洞,确保远程升级的可靠性。

l3m4n的博客 981

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

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

melonbo的专栏 711

芒果YOLO11改进81:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块

芒果YOLO11改进81:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块

包括YOLOv5、YOLOv7、YOLOv8等模型改进 736

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

文章目录

Lebron 1464

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

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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、付费专栏及课程。

余额充值