1

「need_reschedフラグは、別のプロセスを実行する価値があるため、できるだけ早くスケジューラを呼び出す必要があるというカーネルへのメッセージです」と知っていますが、いくつかの点が欠けています:

このフラグのチェックは誰が担当していますか? カーネル プロセスのアドホックはありますか? 最後に、おそらく、私がしたい唯一の質問は、フラグが設定された後、カーネルができるだけ早く schedule() を呼び出すために何をするかということです。

はっきりしているといいのですが、

ステファノ

4

2 に答える 2

1

通常、このフラグは割り込みおよびシステムコールの戻りパスでチェックされます - 割り込みまたはシステムコールから戻るときにフラグが設定されていて、(割り込みの場合) カーネルがプリエンプティブルである場合、カーネルは戻る前に再スケジューリング関数の 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 ビットを含むことに注意してください。他にも同様のチェックが多数あり、カーネルへの戻りパスにも明示的なチェックがあります。

于 2012-06-16T18:42:04.847 に答える
0

カーネルコードは、安全に実行できる場合はいつでもこのフラグを明示的にチェックしschedule、フラグが設定されている場合は呼び出します。外部プロセスまたは非同期メカニズムによってチェックすることはできません。これは、プリエンプティブルではなく、自発的にのみ CPU を解放できるコードを処理することが全体の目的であるためです。

于 2012-06-16T18:34:54.053 に答える