2013-04-25 288 views
2

如果我有一個進程的所有線程都在不同的內核上運行,那麼sched_yield會在這種情況下執行什麼操作?放棄並立即發佈?因爲我看到的是sched_yield不會導致線程調用它,所以請等待任何循環,看起來這個調用甚至不會進入內核。sched_yield在這種情況下做什麼?

回答

3

手冊頁說:

如果調用線程處於當時的最高優先級 列表中唯一的線程,它會繼續呼叫後運行至SCHED_YIELD()。

所以,如果沒有什麼更重要的運行,該功能將基本上什麼都不做。

+0

「所以如果沒有什麼更重要的運行,功能基本上什麼都不會做。」但是它會做一個系統調用(然後從用戶空間切換到內核),甚至不是? – MetallicPriest 2013-04-25 14:03:32

+0

是的,它仍然會執行系統調用,檢查CPU調度程序的等待列表,並返回而不等待是否沒有其他正在等待的線程。 – zakinster 2013-04-25 14:07:45

+0

嗯,我現在沒有Linux來測試,所以也許你可以創建一個程序,在循環中調用sched_yield並對其進行配置? – 2013-04-25 14:08:02

3

就linux內核而言,一個核心就是一個CPU,所以sched_yield會導致調用線程放棄CPU,但如果線程是隊列中唯一的線程,它不會等待任何週期。

所以你的情況sched_yield將立刻返回立刻如果沒有線程等待當前的核心。

請注意,sched_yield而不是旨在控制如何在多個CPU上運行線程。

+0

但是我們會在這裏進行系統調用嗎?對? – MetallicPriest 2013-04-25 14:07:23

+0

sched_yield **是一個系統調用,C實現只不過是類似'_syscall0(int,sched_yield)'的東西' – zakinster 2013-04-25 14:12:39

相關問題