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

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

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

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

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

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

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

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

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

ベストアンサー1

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

すべてのコアで

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

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

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

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

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

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

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

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

ほとんど最初です。

おすすめ記事