非独占等待队列添加进程,而独占尾部,为什么?

时间:2013-05-27 07:30:40

标签: linux kernel

在阅读linux源代码时,我已阅读以下代码:

void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; wait->flags &= ~WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&q->lock, flags); __add_wait_queue(q, wait); spin_unlock_irqrestore(&q->lock, flags); } EXPORT_SYMBOL(add_wait_queue); void fastcall add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; wait->flags |= WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&q->lock, flags); __add_wait_queue_tail(q, wait); spin_unlock_irqrestore(&q->lock, flags); } EXPORT_SYMBOL(add_wait_queue_exclusive);


区别在于__add_wait_queue()和__add_wait_queue_tail()。
为什么实施步骤不同?

1 个答案:

答案 0 :(得分:1)

在独有的情况下,只有第一个进程会被唤醒,所以它必须是等待时间最长的进程。

在非排他性的过程中,所有进程都会被唤醒,因此顺序无关紧要,单个链表更容易插入。