千家信息网

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

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。IO多路复用适
千家信息网最后更新 2025年01月20日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安全错误 数据库的锁怎样保障安全 梨树租房软件开发 秦川机床软件开发 天涯明月刀端游无法连接到服务器 网络安全工作视频讲解 非关系数据库的er图 软件开发招标评审 服务器能安装两个路由器吗 羿龙(北京)网络技术 应用程序和服务器区别 数据库x锁是几级 软件开发咨询公司 为什么数据库需要定义事务 1.17服务器 java 四川网络技术分类五星服务 台州溺水网络安全教育直播 查询数据库中列数据一样的行 数目数据库英文简写 一款软件开发到商业卖的过程 江苏服务器管理软件 中小学生网络安全张莉家庭教育 浙江虚拟服务器管理软件云服务器 湖北康创软件开发有限公司招聘 网页用户和数据库交互的界面是 机械与嵌入式软件开发 中国移动互联网科技有限公司 云服务器是阿里好还是华为好 游戏软件开发专业代码 智慧电梯软件开发解决方案 网络安全是我们的责任 网易版mc服务器历史加入
0