I/O复用函数的比较

select poll 和 epoll 三组I/O复用系统调用都能够同时监听多个文件描述符。它们将等到由timeout参数指定的超时时间,直到一个或者多个文件描述符上有时间发生时返回,返回值就是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集 最大支持文件描述符数和具体实现等四个方面进一步比较它们的异同,以明确在实际应用中应该选择哪个。

这三组函数都是通过某种结构体变量来告诉内核监听那些文件描述符上的那些事件,并使用该结构体类型的参数来获取内核处理的结果。

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

poll的参数类型pollfd则多少聪明一些。他把文件描述符和事件都定义其中,任何事件都统一处理,从而使得编程接口简洁得多。并且内核每次修改的是pollfd结构体的revent成员,而events成员保持不变,因此下次调用poll时应用程序无需重置pollfd类型的事件集参数。

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值