3

I know that the kernel scheduler is run periodically. This period is determined by a timer. However, I have been unable to find where the IRQ for the timer interrupt is and the entire flow from beginning to end of the scheduler code.

I understand that the schedule() function may potentially have several entry and exit points.. but could someone point me towards where to look for these?

カーネル ソースから、__schedule() が schedule().. から呼び出されるように見えるメインのスケジュール関数であることがわかりましたが、schedule().. を呼び出すものと、schedule を呼び出す関数を呼び出すもの.. ..

4

1 に答える 1

2

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

  1. セマフォ、ミューテックスなどの場合のように、明示的なブロッキング。
  2. フラグ TIF_NEED_RESCHED は、割り込み時およびユーザー空間への復帰時にチェックされます。設定されている場合は、スケジュールが呼び出されます。
  3. プロセスが起動します。

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

于 2013-03-28T12:27:49.180 に答える