Linuxカーネルのスケジュールプロセスが実際にどのように機能するかを理解しようとしています. 私の質問は、スケジューリング アルゴリズムに関するものではありません。その機能schedule()
とswitch_to()
働きについてです。
説明してみます。私はそれを観た:
プロセスがタイム スライスを使い果たすと、フラグneed_resched
が によって設定されscheduler_tick()
ます。カーネルはフラグをチェックし、フラグが設定されていることを確認し、schedule()
(質問 1 に関連する) 新しいプロセスに切り替えるように呼び出します。このフラグは、別のプロセスを実行する必要があるため、できるだけ早くスケジュールを呼び出す必要があるというメッセージです。ユーザー空間に戻るか、割り込みから戻ると、need_resched
フラグがチェックされます。設定されている場合、カーネルは続行する前にスケジューラを呼び出します。
カーネル ソース (linux-2.6.10 - 本「Linux Kernel Development, second edition」の基になっているバージョン) を調べると、一部のコードがschedule()
自発的に関数を呼び出して、別のプロセスに実行権を与えることができることもわかりました。この関数switch_to()
は、実際にコンテキスト スイッチを実行する関数であることがわかりました。switch_to()
実際に何が行われているかを理解しようと、いくつかのアーキテクチャに依存するコードを調べました。
その行動は、私が答えを見つけることができなかったいくつかの質問を提起しました:
終了したら
switch_to()
、現在実行中のプロセスは何ですか?schedule()
?を呼び出したプロセス それとも、実行するために選択された次のプロセスですか?割り込みによって呼び出されると、実行するように選択されたプロセスは、割り込み処理が終了したとき
schedule()
に実行を開始します (ある種の RTE の後)。それともその前?schedule()
関数が割り込みから呼び出すことができない場合、いつフラグがneed_resched
設定されますか?タイマー割り込みハンドラが動作しているとき、どのスタックが使用されていますか?
私は自分自身を明確にすることができるかどうかわかりません。できなかった場合は、いくつかの回答(または質問)の後にできることを願っています。そのプロセスを理解しようとして、すでにいくつかの情報源を見てきました。私は「Linux Kernel Development, sec ed」という本を持っていて、それも使っています。説明に役立つ場合は、MIP と H8300 アーキテクチャについて少し知っています。