Linux中select 、poll、epoll三者I/O复用的比较

 前面我们讨论了select、poll、epoll三组I/O复用系统调用,这三个系统调用都可以同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值就是就绪文件描述符的数量,返回0表示没有事件发生。

1、select系统调用

select的参数类型fd_set没有将文件描述符和事件绑定,它仅仅是一个文件描述符集合,因此select需要提供3个这种类型的参数来分别传入和输出可读、可写及异常等事件。这一方面使得select需要提供3个这种类型的事件,另一方面由于内核对fd_set集合的在线修改,应用程序下次调用select前不得不重置这3个fd_set集合。

2、poll系统调用

poll的参数类型pollfd多少要聪明一些。它把文件描述符和事件都定义其中,任何事件都被统一处理,从而使得编程接口简洁得多。并且内核每次修改的是pollfd结构体的revents成员,而events成员保持不变,因此下次调用poll时应用程序无须重置pollfd类型的事件集参数。由于每次select和poll调用都返回整个用户注册的事件集合(包括就就绪的和未就绪的),所以应用程序索引就绪文件描述符的时间复杂度O(n)。

3、epoll系统调用

epoll则采用与select和poll完全不同的方式来管理用户注册的事件。它在内核中维护一个事件表,并提供了一个独立的系统调用epoll_ctl来控制往其中添加、删除、修改事件。这样,每次epoll_wait调用都直接从该内核事件表中取得用户注册的事件,而无须反复从用户空间读入这些事件。epoll_wait系统调用的events参数仅用来返回就绪的事件,这使得应用程序索引就绪文件描述符的时间复杂度达到O(1)。

三者的区别:

1、poll和epoll_wait分别用nfds和maxevents参数指定最多监听多少个文件描述符和事件。这两个数值都达到系统允许打开的最大文件描述符数目,即65535(cat/proc/sys/fs/file-max)。而select允许监听的最大文件描述符数量通常有限制。

2、select和poll都只能工作在相对低效的LT模式,而epoll则可以工作在ET高效模式。

3、实现原理:select和poll采用的都是轮询的方式,即每次调用都要扫描整个注册文件描述符集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测到就绪的文件描述符时,将触发回调函数,回调函数就将该文件描述符上对应的事件插入内核事件就绪队列。内核最后在适当的时机将该就绪事件队列中的内容拷贝到用户空间。因此epoll_wait无须轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度是O(1)。

select和epoll的简单比较

select系统调用

1.每次调用都需要从用户空间拷贝数据 大小 fd_set1024

2.每次返回 都需要遍历所有描述符找到就绪描述符

3.内核实现:轮询的方式

4、能监听的文件描述符数目相比epoll少一些 事件类型少一些

epoll系统调用

1.每个文件描述符只需要从用户空间往内核空间拷贝一次 epoll_ctl直接添加到内核事件表

2.epoll_wait只返回就绪的文件描述符 不需要遍历所有文件描述符查找就绪的文件描述符

3.内核实现:在每个文件描述符上注册了回调函数 事件就绪后通过回调函数添加到就绪队列

4.文件描述符数目比select多 并且将文件描述符和事件表集放在一个结构体中



参考书《Linux高性能服务器编程》



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值