千家信息网

IO多路复用--select、 poll、 epoll的区别

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。IO多路复用适
千家信息网最后更新 2026年10月31日IO多路复用--select、 poll、 epoll的区别

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

IO多路复用适用如下场合:

(1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。

(2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。

(3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。

(4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。

(5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

select:

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:

1 单个进程可监视的fd数量被限制

2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大

3 对socket进行扫描时是线性扫描

poll

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。

poll还有一个特点是"水平触发",如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll

epoll既然是对select和poll的改进,避免了上述的三个缺点。

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。

在前面说到的复制问题上,epoll使用mmap减少复制开销。

还有一个特点是,epoll使用"事件"的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知


区别:


Selectpollepoll
支持最大连接数1024(x86) or 2048(x64)无上限无上限
IO效率每次调用进行线性遍历,时间复杂度为O(N)每次调用进行线性遍历,时间复杂度为O(N)使用"事件"通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面,这样epoll_wait返回的时候我们就拿到了就绪的fd。时间发复杂度O(1)
fd拷贝每次select都拷贝每次poll都拷贝调用epoll_ctl时拷贝进内核并由内核保存,之后每次epoll_wait不拷贝

总结:

(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在"醒着"的时候要遍历整个fd集合,而epoll在"醒着"的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。


设备 处理 复用 拷贝 内核 进程 队列 多个 开销 多路 最大 时间 机制 用户 空间 系统 服务 睡眠 复杂 复杂度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州百单互联网科技有限公司 互联网电商科技 重庆互联网络科技 互联网 的科技创新 深圳卡尔迅互联网科技有限公司怎么样 互联网科技公司的市场部门 西藏七维空间互联网科技有限公司 中国科技互联网公司收入 温州喔噻互联网科技有限公司 互联网教育科技公司vipkid 互联网科技实习生岗位职责 互联网科技项目计划书材料类 武汉健翔互联网络科技有限公司 湖南一路畅行互联网科技 互联网媒体平台算高科技产业 翼展科技 首家互联网医院 卓翼科技产业互联网合作 张家口科技产业互联网平台 北京天晋互联网科技有限公司 承德科技产业互联网平台 互联网黑科技 科技赋能下的互联网金融 互联网科技未来 互联网 科技公司 互联网科技小额贷款 安控科技rtu产品工业互联网 移动互联网科技公司 科技互联网的核心竞争力 互联网领先科技宣传片 瑞安市蟠桃会互联网科技有限公司
0