2013-05-27 28 views
0

在閱讀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

感謝您的回答。看起來,等待隊列是雙鏈表,因爲我的版本2.6.11。 – wilsonwen

+0

@wilsonwen:它可能只是在訂單不重要的情況下,看起來更多的默認版本。 –