关于多路转接select,poll,epoll的重要问题

多路转接使用场景

        多路转接select/poll/epoll适用于长连接。

        短连接:在一次通信周期才通信一次,就断开连接。使用多路转接,需要频繁将文件信息从用户拷贝到内核。

        select和poll不适用于监听海量文件,epoll适用于监听海量文件。

select的缺点

  • 可以监视的文件个数是有限的。fd_set位图的位数有限。
  • 需要用户来管理要监视的文件描述符。比如:需要定义一个数组来保存要监视的文件描述符。
  • 由于用户通知内核的需要监视的文件和内核通知用户就绪的文件事件是一个参数,即输入输出参数是一个,在编码调用select前需要重新设定需要监视的文件,重新设定fd_set。
  • 每次调用selcet,都需要将监视的文件信息从用户拷贝到内核,当监视文件数过多时,效率会降低。
  • select内核监视文件就绪的方式是轮询检测,当监视文件个数过多时,效率会降低。

poll的缺点

  • 需要用户来管理要监视的文件描述符。定义一个数组,来保存需要监视的文件。poll可以监视的文件数时无限的,但是,用户定义的数组大小决定了能够监视的文件数。
  • 每次调用poll,都需要将要监视的文件信息从用户拷贝到内核。当监视文件数量过多时,效率会降低。
  • poll内核监视文件就绪的方式是轮询检测,当监视文件个数过多时,效率会降低。

select和poll的不同点

        poll实际是是针对select的缺点进行了改进。

  • poll参数struct pollfd结构体中包含了event和revent两个变量,分别用来用户通知内核需要监视文件的事件和内核通知用户,文件事件是否就绪。相比较于select,输入输出参数分开了,不需要再调用poll前重新设定需要监视的文件。
  • poll可以等待的文件数量是无限的。select是有限的。

epoll的优点

  • 需要监视的文件交给了内核进行管理,具体一点是交给了epoll模型的红黑树。
  • 接口使用方便。将多路转接功能拆分成了3个接口,各司其职。不像select和poll用一个接口,更加复杂。
  • 数据拷贝轻量。不需要在调用epoll时重新将要监视的文件信息从用户拷贝到内核。而是在需要增加的时候才会调用epoll_ctl参数op选择EPOLL_CTL_ADD将文件信息拷贝到内核。
  • 事件回调机制。内核监视事件就绪不需要轮询检测。epoll模型中有回调机制,当事件就绪,内核会调用回调函数,形成一个就绪事件的节点连接到就绪队列中,判断是都就绪,只需要判断就绪队列不为空即可。时间复杂度为O(1)。
  • 监视的文件数量没有限制。

epoll为什么高效,相比较于select和poll

  • 有回调机制,内核检测是否有就绪文件,不需要轮询检测,只需要判断就绪队列是否为空。
  • 数据拷贝轻量,在调用epoll时不需要重新将所有需要监视的文件信息从用户拷贝到内核。只是在需要增加监视文件时才会将需要监视的文件信息从用户拷贝到内核。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值