スケジューラはタイムアウト後に常に呼び出されますか?

スケジューラはタイムアウト後に常に呼び出されますか?

タイマ割り込みが発生すると、ISR が呼び出され、割り込みを処理します。

すべてのタイマー割り込みがスケジューラ呼び出しで終了し、次のプロセスを実行し続ける必要があると仮定できますか?

すべての割り込みがスケジューラ呼び出しで終わらなければならないと一般化できますか?

ベストアンサー1

タイマーISRは直接呼び出されませんschedule()。最後に、update_process_times()スケジューラプロセスの会計情報が最新の状態になるように呼び出されます。

スケジューラは最終的にユーザ空間に戻ると呼び出されます。カーネルがプリエンプティブの場合、タイマー割り込みからカーネル空間に戻るときにも呼び出されます。

たとえば、プロセスAがデバイス生成割り込みとタイマ割り込みによって中断されるシステムコールを実行するとします。

   プロセスAユーザースペース→プロセスAカーネルスペース→デバイスISR→タイマーISR
                    システムコールデバイスIRQタイマーIRQ

タイマーISRが終了すると、別のISRに戻り、カーネル空間に戻り、カーネル空間はユーザー空間に戻ります。プリエンプティブカーネルは、戻るたびにプロセスを再スケジュールする必要があることを確認します。非プリエンプティブカーネルは、ユーザースペースに戻るときにのみこのチェックを実行します。

ARMの世界では、コードパスはおおよそ次のようになります。

  • ユーザー空間で受信したIRQは通話を終了し__irq_usr、SVCモードで受信したIRQは通話を終了します__irq_svc。 IRQは他のプロセッサモードで受信しないでください。
  • __irq_svcIRQを処理した後、カーネルがプリエンプティブの場合プリエンプションは無効にされず、スケジュールを変更する必要があり、カーネルは呼び出しにジャンプsvc_preemptします。それ以外の場合、スケジュール変更は発生しません。preempt_schedule_irqschedule
  • 最後に、CPUはIRQハンドラ(__irq_usrret_to_user_from_irq)またはシステムコール(vector_swi→)を介してret_fast_syscallユーザースペースに戻ります。ここで、カーネルは何をすべきかを確認し、スケジュールをschedule再調整する必要があるかどうかを呼び出します。

おすすめ記事