新Linux内核的epoll中是否仍存在雷鸣般的群体问题?

时间:2014-06-16 08:12:43

标签: c linux concurrency

我看到内核源代码中的fs/eventpoll.c是这样编写的:

static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
           int maxevents, long timeout)
{
....
        init_waitqueue_entry(&wait, current);
        __add_wait_queue_exclusive(&ep->wq, &wait);    // *** NB
....
}

那"排他性"是否只会唤醒一个等待项(用户空间中的进程或线程)?

但是当我写了一些测试代码时,我发现thundering herd problem仍然存在。

为什么不能解决?谢谢!

2 个答案:

答案 0 :(得分:3)

在内核代码中,我们可以在include/linux/wait.h中看到__add_wait_queue_exclusive()将条目添加到列表的开头:

 __add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait)
{
        wait->flags |= WQ_FLAG_EXCLUSIVE;
        __add_wait_queue(q, wait);
}

__wake_up_common()中唤醒静态空sched/wait.c时,只会唤醒非独占的第一个任务和第一个独占的任务。 通常只有一个任务被唤醒。

答案 1 :(得分:1)

这取决于您是否使用相同的epfd。标志WQ_FLAG_EXCLUSIVE仅适用于等待相同eventpoll的TASK。

如果您的测试代码在同一个套接字上使用不同的epfd监视器,那么问题就存在。