I/O多路复用比较(select,poll,epoll)

讲述完了三种I/O多路复用模型,我们现在需要进行一下比较。

比较三种I/O多路复用

关于他们的优缺点呢,前面三篇博客我都有所提及,这里我主要为了再次总结一下。

  select和poll都只能工作在低效的LT(水平触发),这种方式下进行多次的循环处理时间的等待。而epoll是在高效的ET(边沿触发)模式下工作,这个模式下当有时间响应的时候,应用程序这个时候必须立即处理。并且epoll还支持EPOLLONESHOT时间,这个时间可以进一步的减少可读、可写和异常等事件被触发的次数。

  三个系统调用对待事件的控制方式也是不同的,select是用一个文件描述符的集合,所以需要提供3个参数来分别传入和输出可读、可写和异常等事件。这样select不能处理更多的其他的事件,另外在每一次调用select的时候,由于内核对fd_set的修改,所以必须要进行重置这三个fd_set集合。poll相对来说聪明一些,它通过统一的接口有一个pollfd,这样使得编程相对来说简单一些。poll当中每次内核去修改的是pollfd结构体的revents成员,而events成员保持不变,这样就不需要去对pollfd进行重置操作了。

  select和poll采用的都是轮询的方式,所以效率是O(n),而对于epoll采用的方式是回调的方式,说的就是当有就绪的文件描述符的时候,这个时候就会去触发回函数,回调函数就会将文件描述符对应的事件插入到内核就绪事件队列,内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间。所以epoll_wait的时间复杂度为O(1).epoll_wait有个缺点就是当活动连接多的时候,这个时候回调函数调用会被多次调用,这样效率也会下降,所以相对来说,epoll_wait适用于连接数多,但是活动连接少的情况下。

  另外,采取的访问方式上来说也有区别,select和poll需要多次的在用户空间和内核空间上进行交互,而对于epoll来说,使用了mmap的方式,使得内核空间和用户控件映射到一个文件,这样更加高效。
  
![enter description here][1]
![enter description here][2]
![enter description here][3]
![enter description here][4]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值