I/O多路复用,进程Poll、ePoll和Select的区别、触发方式和性能对比

1. 什么是I/O多路复用?

多路就是多个TCP连接(或多个Channel),复用就是指复用一个或少量进程/线程,理解起来就是多个网路I/O复用一个或少量进程/线程来处理这些连接。

2. I/O多路复用的使用场景

  1. 客户端需要同时处理多个socket请求
  2. 客户端程序需要同时处理用户输入和网络连接
  3. 服务器需要同时处理监听socket和连接socket

3. 实现和原理

3.1 select

定义
select是内核提供的系统调用,它支持一次查询多个系统调用的可用状态,当任意一个结果状态可用时就会返回,用户进程再发起依次系统调用进行数据读取。
缺点
1.单个进程所打开的文件描述符(fd)有限制;
2.每次调用select,都需要把fd集合从用户态拷贝到内核态,cpu的开销很大;
3.Select函数只能监视文件描述符是否可读和可写,无法监视文件描述符的其他状态。
4.select扫描是线性扫描,采用轮询的方法,效率较低(高并发时)。
在这里插入图片描述

3.2 poll

定义
调用系统函数poll函数来监听多个文件描述符,当有文件描述符准备就绪时,poll函数就会返回就绪的文件描述符。
优点
1.能够监听到的文件描述符数量没有上限;
2.每次调用poll函数时,应用程序不需要将文件描述符从用户态拷贝到内核态。
缺点
1.每次调用poll函数仍需要遍历全部文件描述符,浪费资源。
2.当有很多文件描述符时,pollfd结构体数组会变得非常大,占用内存空间。

3.3 epoll

定义
基于事件驱动实现,epoll相较于select/poll多了两次系统调用,其中epoll_create建立与内核的连接,epoll_ctl注册事件,epoll_wait阻塞用户进程,等待IO事件。
优点
1.高性能,在高并发情况下,epoll的性能更高,由于运用了事件驱动机制,只处理需要处理的事件,而不是遍历一切文件描述符。
2.扩展性强,epoll支撑的文件描述符数量比select和poll更大,能够处理数十万甚至上百万的文件描述符。
3.内核空间和用户空间的数据拷贝次数更少。
缺点:只能在Linux下工作。
在这里插入图片描述

4. 区别

Select:
a) 时间复杂度O(n),需要无差别轮询所有流,找到对应的流进行操作。
b) 有最大连接数限制,默认是1024,使用位图来表示fdset
c) 内核需要将消息传递到用户空间,都需要内核拷贝动作
Poll:
a) 时间复杂度O(n),需要轮询所有流,查询每个fd对应的设备状态
b) 没有最大连接数限制,定义了一个结构体来存储相关事件的信息,基于链表来存储。
c) 内核需要将消息传递到用户空间,都需要内核拷贝动作
ePoll(event poll):
a) 时间复杂度O(1),事件驱动,每个事件关联上fd,根据每个fd上的callback函数来实现的,不需要轮询即可知道流发生的操作。
b) 有最大连接数限制,但是上限很大,1G内存可以打开10万左右连接。
c) epoll通过内核和用户空间共享一块内存来实现的。

5. 触发方式

边缘触发(ET):当监视的文件描述符上有事件发生,只会从 epoll_wait()中苏醒一次,即使内核缓缓冲区中还有数据没读完,也只会苏醒一次。
水平触发(LT):当监视的文件描述符上有事件发生,会不断的从 epoll_wait()中苏醒,直到内核缓冲区的数据被读完。

select/poll 只有水平触发模式,epoll 默认的触发模式是水平触发。

6. 性能对比

ePoll性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值