英語

CPU 排程器架構特定程式碼實現提示

Nick Piggin, 2005

上下文切換

1. 執行佇列鎖:預設情況下,`switch_to` 架構函式在持有執行佇列鎖的情況下被呼叫。 通常這不是問題,除非 `switch_to` 可能需要獲取執行佇列鎖。這通常是由於上下文切換中的喚醒操作引起的。

要請求排程器在不持有執行佇列鎖的情況下呼叫 `switch_to`,您必須在一個頭檔案中 `#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是在定義 `switch_to` 的標頭檔案中)。

在 CONFIG_SMP 的情況下,解鎖的上下文切換隻會給核心排程器實現帶來非常小的效能損失。

CPU 空閒

您的 cpu_idle 例程需要遵守以下規則

  1. 應該在空閒例程中停用搶佔。 應該只啟用它來呼叫 schedule(),然後再次停用。

  2. need_resched/TIF_NEED_RESCHED 只能被設定,直到執行的任務呼叫 schedule() 之前不會被清除。 空閒執行緒只需要查詢 need_resched,永遠不能設定或清除它。

  3. 當 cpu_idle 發現 (need_resched() == 'true') 時,它應該呼叫 schedule()。 否則,它不應該呼叫 schedule()。

  4. 只有當我們即將睡眠處理器直到下一次中斷時,才需要在檢查 need_resched 時停用中斷(這不會對 need_resched 提供任何保護,它會阻止丟失中斷)

    4a. 這種型別的睡眠的常見問題似乎是

    local_irq_disable();
    if (!need_resched()) {
            local_irq_enable();
            *** resched interrupt arrives here ***
            __asm__("sleep until next interrupt");
    }
    
  5. 當 need_resched 變為高電平時,不需要中斷來喚醒它們的空閒例程可以設定 TIF_POLLING_NRFLAG。 換句話說,它們必須定期輪詢 need_resched,儘管做一些後臺工作或進入低 CPU 優先順序是合理的。

    • 5a. 如果設定了 TIF_POLLING_NRFLAG,並且我們確實決定進入中斷睡眠,則需要清除它,然後發出記憶體屏障(然後停用中斷測試 need_resched,如 3 中所述)。

arch/x86/kernel/process.c 包含輪詢和睡眠空閒函式的示例。

可能的 arch/ 問題

我發現的可能的 arch 問題(並嘗試修復或沒有修復)

sparc - 此時啟用 IRQ(?),將 local_irq_save 更改為 _disable。
  • 待辦事項:需要輔助 CPU 來停用搶佔(參見 #1)