首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Linux kernel [select poll epoll]差别

2012-09-10 
Linux kernel [select poll epoll]区别??? ?Linux中异步IO等待无非就三个系统调用:select, poll和epoll。很

Linux kernel [select poll epoll]区别

?

?? ?Linux中异步IO等待无非就三个系统调用:select, poll和epoll。很多人无法理解三种调用的区别,或不够了解,今天就结合Linux kernel code详细描述三个的区别!

?

?? ?select:

?? ?select 的限制就是最大1024个fd,可以查看kernel中的posix_types.h,里面定义了fdset数据结构,显然select不适合poll大量fd的场景(如webserver)。?

?

?? ?include/linux/posix_types.h :

?

?

static int ep_send_events(struct eventpoll *ep,                          struct epoll_event __user *events, int maxevents){        struct ep_send_events_data esed;        esed.maxevents = maxevents;        esed.events = events;        return ep_scan_ready_list(ep, ep_send_events_proc, &esed);}
?

?? ?现在大家应该明白select, poll和epoll的区别了吧!有人问既然select和poll有这么明显的缺陷,为什么不改掉kernel中的实现呢? 原因很简单,后向ABI兼容,select和poll的ABI无法返回ready list,只能返回整个fd数组,所以用户只得再次遍历整个fd数组以找到哪些fd是有数据的。

?? ?epoll还包括 “Level-Triggered” 和 “Edge-Triggered”,这两个概念在这里就不多赘述了,因为"man epoll"里面解释的非常详细,还有使用epoll的example。

?

?

?

?

?

?

热点排行