「need_reschedフラグは、別のプロセスを実行する価値があるため、できるだけ早くスケジューラを呼び出す必要があるというカーネルへのメッセージです」と知っていますが、いくつかの点が欠けています:
このフラグのチェックは誰が担当していますか? カーネル プロセスのアドホックはありますか? 最後に、おそらく、私がしたい唯一の質問は、フラグが設定された後、カーネルができるだけ早く schedule() を呼び出すために何をするかということです。
はっきりしているといいのですが、
ステファノ
通常、このフラグは割り込みおよびシステムコールの戻りパスでチェックされます - 割り込みまたはシステムコールから戻るときにフラグが設定されていて、(割り込みの場合) カーネルがプリエンプティブルである場合、カーネルは戻る前に再スケジューリング関数の 1 つを呼び出します。 .
たとえば、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 のビット フラグであり、need_resched のビットを_TIF_WORK_MASK含むほとんどの TI_flags ビットを含むことに注意してください。他にも同様のチェックが多数あり、カーネルへの戻りパスにも明示的なチェックがあります。
カーネルコードは、安全に実行できる場合はいつでもこのフラグを明示的にチェックしschedule、フラグが設定されている場合は呼び出します。外部プロセスまたは非同期メカニズムによってチェックすることはできません。これは、プリエンプティブルではなく、自発的にのみ CPU を解放できるコードを処理することが全体の目的であるためです。