マルチコアLinuxスケジューラ

マルチコアLinuxスケジューラ

Linuxカーネルはプリエンプティブなので:

  1. スケジューラはどのコアで実行されますか?

  2. カーネルスペースが別のコアで実行されている場合、他のコアでどのように予約(コンテキスト切り替え)されますか?

  3. ユーザースペースが別のコアで実行されている場合、他のコアでどのように予約(コンテキスト切り替え)されますか?

  4. カーネルがすべてのコアで実行できる場合は、分散アルゴリズムと同じです(各カーネルスレッドは他のカーネルモジュールとは独立しており、カーネルデータ構造にロックがあります)。それとも、すべてのカーネルスレッドを調整する1つの主要なエンティティがありますか?

  5. したがって、スケジューラは予約のために各コアの待機リストを変更し(これは集中型のデータ構造ですか?)、各コアの各コアはこのデータを表示して実行中の同じコアから次のプロセスを選択しますか?

  6. スケジューラ割り込みが発生した場合、どのスケジューラプロセスが実行されていますか?それとも、各コアに割り込みを持つスケジューラプロセスがあり、各コアの各スケジューラプロセスが実行キューからスケジュールをスケジュールするか、移行スレッドを使用してプロセスを別の実行キューに移動しますか?

答え1

スケジューラはどのコアで実行されますか?

すべてのコアで

カーネルスペースが別のコアで実行されている場合、他のコアでどのように予約(コンテキスト切り替え)されますか?

ここに問題があります。コンテキスト切り替えは、コアでローカルに発生するものです。したがって、「他のコアで実行」される状況はありません。

「コンテキスト切り替え」の正しい意味を実際に理解しているかどうかはわかりません。 「他のコアでタスクを並べ替える」という意味かもしれません。

また、ヒント:物事が「実行中」であるとは思わないでください。理解しようとするメカニズムは、物事が素晴らしく抽象化されるまで、コンピュータが実際に機能する方法ではありません。

「今このCPUコアが実行されているコードは何ですか?」と考えてみてください。基本的に、これらすべてが実行されていることがわかります。積極的に実行されたコードまたは一部のハードウェア割り込みによって実行されます。

ユーザースペースが別のコアで実行されている場合、他のコアでどのように予約(コンテキスト切り替え)されますか?

プロセスが実行されていない場合は待機リストにあり、プロセッサコアで実行されているカーネルコードがアイドル時間であると判断した場合(たとえば、できるだけ多くのシステムコールを処理して)、待機リストを照会します。そのコア自体でコードを実行します(論理的)。 「ああ、この待機プロセスが私が経験していることです」この決定が行われる方法には、次のものがあります。場所(つまり、私たちは前回それを実行したのと同じコアですか?)しかし、正解ではありません。

分散アルゴリズムと同じです(各カーネルスレッドは他のカーネルモジュールとは独立しており、カーネルデータ構造にロックがあります)。それとも、すべてのカーネルスレッドを調整する1つの主要なエンティティがありますか?

ほとんど最初です。

答え2

あなたが呼ぶものスケジューラこれは実際には、特定のイベント、割り込み、またはユーザースペースプロセスの呼び出し後に実行できるカーネルルーチンの集まりです。

スケジューラが使用する最も基本的なデータは実行キューです。 CFSでは、各プロセッサには独自のジョブ実行キューがあり、同時に複数の実行キューでジョブは発生しません。

結論はそうです。 CFSはどのプロセッサでも実行できると言えます。 5番目の質問ではありませんが、集中型のデータ構造ではありません。

レム。私はいくつかの誤解に対するMarcus Müllerの答えに同意します。コンテキストスイッチ。もしそうなら、あなたの質問はスレッドに関するものであると仮定します。移住者: あるコアから別のコアへのスレッドの移行は、次のように実行されます。[migration/x] カーネルスレッド(コアごとに1つ)

ロック関連:はい、カーネルスレッドは時々ロックされます(スピンロックとミューテックスを使用)。しかし、もちろんです。少ないほど良い

関連情報