0

コードレベルで関数を理解するのに多くの時間を費やしましたが、今では本当に混乱しています。

まず core.c で、関数__schedule()orschedule()が最も有望なようです。通常、タイマーと思われる__schedule()コードを見つけました。hrtick_clear(rq)また、では、スケジュールする次のタスクを見つけようとする__schedule()関数が呼び出されます。next = pick_next_task(rq)通常のタスクでは、CFS アルゴリズムが使用されます。そこで、fair.c ファイルを調べて、pick_next_task_fair 関数を確認しました。その関数を追跡することで、hrtick_start(rq, delta)が呼び出されたことがわかります。

したがって、スケジューリングアルゴリズムを定期的にアクティブにするために使用される hrtick に基づくタイマーがあるようです。しかし、奇妙なことに、core.c ファイルでは、定期的に__schedule()orを呼び出すようにタイマーがどのように構成されているかを実際に見つけることができません。schedule()この関数を呼び出すようにタイマーが構成されていることはわかりませんでした。

他の機能は使用されていますか?Linuxタスクスケジューラの専門家がヒントをくれますか:>

4

2 に答える 2

3

特別なことは何も必要ありません。タイマーは割り込みをトリガーするだけであり、割り込みロジックは、割り込みから戻ったときに実行するタスクを把握する必要があります。たとえば、割り込みからの戻りを処理する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)
 ...
 615    work_pending:
 616        testb $_TIF_NEED_RESCHED, %cl
 617        jz work_notifysig
 618     work_resched:
 619        call schedule
于 2012-06-19T21:51:00.663 に答える
1

Linux カーネルには、実際には 2 つのスケジューラ、つまり 2 つのスケジューリング コードがあります。__schedule() を呼び出す schedule() と呼ばれるコア スケジューラがあります。schedule() は、システム コールの後など、カーネル内の多くのポイントから呼び出され

ます。scheduler_tick() [これも core.c にあります] という名前の別のスケジューラ コードがあります。これは定期的なスケジューラであり、タイマーによって呼び出されます。コード (timer.c) は HZ の頻度で割り込みを介して実行されます。つまり、scheduler_tick() は 1 秒間に HZ 回呼び出されます。HZ はハードウェアに依存し、その値は 100 ~ 1024 の間で変化します。scheduler_tick() は、プロセッサ上の現在のタスクが属するスケジューリング クラスの task_tick() を呼び出します。

于 2013-02-19T10:44:39.347 に答える