epoll()在O(1)中完成它的工作吗?

时间:2011-06-24 23:05:22

标签: linux network-programming epoll

维基百科说

  

与旧的系统调用不同   在O(n)运营,epoll运营于   O(1)[2])。

http://en.wikipedia.org/wiki/Epoll

然而,Linux-2.6.38上fs / eventpoll.c的源代码, 似乎用RB树实现搜索,它有O(logN)

/*
 * Search the file inside the eventpoll tree. The RB tree operations
 * are protected by the "mtx" mutex, and ep_find() must be called with
 * "mtx" held.
 */
static struct epitem *ep_find(struct eventpoll *ep, struct file *file, int fd)
{

事实上,我看不到任何手册页说epoll()的复杂性是O(1)。 为什么称为O(1)?

1 个答案:

答案 0 :(得分:24)

一旦你找到ep_find,这是有道理的。我只花了几分钟时间,我看到ep_find仅由epoll_ctl调用。

确实,当您添加描述符(EPOLL_CTL_ADD)时,执行昂贵的操作。但是当做实际工作epoll_wait)时却不然。您只需在开头添加描述符。

总之,仅仅询问epoll的复杂性是不够的,因为没有epoll系统调用。您需要epoll_ctlepoll_wait等个别复杂性。

其他东西

还有其他原因可以避免select并使用epoll。使用select时,您不知道需要注意多少描述符。所以你必须跟踪最大的并循环到它。

rc = select(...);
/* check rc */
for (s = 0; s <= maxfd; s++) {
    if (FD_ISSET(s)) {
        /* ... */
    }
}

现在epoll更清洁:

nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
/* check nfds */
for (n = 0; n < nfds; ++n) {
    /* events[n].data.fd needs attention */
}