ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年12月19日 星期三

wait_event_xx, wake_up

以前在看 wait_event_xx 的時候就有一個疑問 wait_event(queue, condition)

這麼 cool,竟然可以任意寫 condition,而不是 function pointer。

後來看到,原來這是 macro (include/linux/wait.h) :
#define __wait_event(wq, condition) \ do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); \ if (condition) \ break; \ schedule(); \ } \ finish_wait(&wq, &__wait); \ } while (0)
所以可以寫 condition。

然後就忘了這個 macro。


幾年之後又看到後:這樣是一個 condition 的話,不就要一直檢查,不然 kernel 怎麼會知道這個 condition 相關的變數變更的時機。

後來又再看一次 macro,
才知道 prepare_to_wait( ) 後,就被掛起來了。
一定要有人叫起他,才有辦法再作 condition 檢查。

所以 誰叫醒他 (wq) ?
是 wake_up (wq...), wake_up(wq) 會叫醒所有 wq 裡面掛起的 task。

這樣 task 就會起來作 condition check。好決定是繼續睡,還是起來工作了。


所以 誰決定 那裡要 call wake_up( ) ?

--- 就是寫 wait_event_xx(wq,cond) 的人。

在 其他 task 中,讓 condition 變更時,就叫 wake_up,讓所有相關的 task 起來。

--- 所以這個 wait_event, wake_up 的同步機制,有點手動的感覺。

沒有留言:

標籤

網誌存檔