我知道「need_resched標誌是內核的消息,應該儘快調用調度程序,因爲另一個進程值得運行」,但我錯過了一些要點:need_resched infos(linux kernel 2.6.30)
誰負責檢查此標誌?有一個特殊的內核進程?最後,我想提出的唯一問題是:內核在標誌設置後儘快調用schedule()是什麼?
我希望我已經清楚,
斯特凡諾
我知道「need_resched標誌是內核的消息,應該儘快調用調度程序,因爲另一個進程值得運行」,但我錯過了一些要點:need_resched infos(linux kernel 2.6.30)
誰負責檢查此標誌?有一個特殊的內核進程?最後,我想提出的唯一問題是:內核在標誌設置後儘快調用schedule()是什麼?
我希望我已經清楚,
斯特凡諾
通常在中斷和syscall返回路徑中檢查該標誌 - 如果從中斷或系統調用返回時設置,並且(在中斷情況下)內核是可搶佔的,則內核將調用其中一個重新調度函數返回之前。
例如,在arch/x86/kernel/entry_32.S:
358 ENTRY(resume_userspace)
359 LOCKDEP_SYS_EXIT
360 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt
361 # setting need_resched or sigpending
362 # between sampling and the iret
363 TRACE_IRQS_OFF
364 movl TI_flags(%ebp), %ecx
365 andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
366 # int/exception return?
367 jne work_pending
368 jmp restore_all
369 END(ret_from_exception)
注意need_resched是在TI_flags的位標記,並_TIF_WORK_MASK
包括最TI_flags比特,包括一個用於need_resched。還有其他一些類似的檢查,返回內核路徑也有明確的檢查。
內核代碼明確檢查此標誌時,它是安全的時候,如果設置了標誌調用schedule
。它不能被任何外部進程或異步機制檢查,因爲它的全部目的是處理不可搶佔的代碼,並且只能自動產生CPU。