2013-04-24 249 views
2

我下面的Linux Device Drivers 3rd Edition書中的例子:目的在Linux內核中wake_up_sync/wake_up_interruptible_sync的

if (temp = = 0) 
    wake_up_interruptible_sync(&scull_w_wait); /* awake other uid's */ 
return 0; 

筆者指出:

這裏是哪裏調用wake_up_interruptible_sync有意義的例子。當我們做 喚醒時,我們正要返回到用戶空間,這是系統自然調度點 。在我們進行喚醒時,我們可能不會重新安排時間,而只需調用「同步」版本並完成我們的工作,就可以達到 。

我不明白爲什麼在這種情況下使用wake_up_interruptible_sync更好。作者暗示,這個調用將阻止重新調度 - 它在調用中阻止 - 但是在wake_up_interruptible_sync返回後,在return 0行之前,其他線程是否無法控制CPU?

那麼,如果一個線程在每次調用之後都可以控制CPU,那麼調用wake_up_interruptible_sync與典型的wake_up_interruptible有什麼區別?

回答

3

使用_sync的原因是我們知道調度程序將在短時間內運行,所以我們不需要再次運行它。 但是,這只是一個優化;如果調度程序確實再次運行,則不會發生任何錯誤。

定時器中斷確實可以在任何時候發生,但只有當調度器由於某些其他原因而最近未運行時才需要定時器中斷。

+0

因此''reschedule'在'wake_up'函數中被調用,並且它在函數返回後也被調用? – 2013-04-25 13:08:53

+0

沒有任何函數返回後,返回到用戶空間時。 – 2013-04-25 14:03:05

+1

我明白了,所以我們不想在'wake_up'函數中調用'reschedule',因爲它在返回用戶空間時會被調用。通過在'wake_up_sync'中延遲它,我們有機會在睡覺前完成線程,從而釋放該線程所擁有的資源;即使線程仍然可以結束睡眠,但我們增加了延遲「重新計劃」調用的機會。我現在的推理是否正確? – 2013-04-25 14:18:13