2009-04-19 12 views
11

私はLinuxのシステムコールsched_setaffinity()がどのように動作するかを理解しようとしています。これは私の質問hereからのフォローオンです。sched_setaffinity()はどのように機能しますか?

私はthis guideを持っています。これはsyscallの使い方を説明していて、とてもうまくいっています(動作しています)。

私はLinux 2.6.27.19 kernel sourcesをダウンロードしました。

私はそのシステムコールを含む行に「grep」を実行しました。私は91個の結果を得ました。有望ではない。

最終的に、私はカーネルが特定のコアのための命令ポインタを設定することができる方法を理解しようとしている(またはプロセッサ)

私はどのようにシングルコア・シングルスレッドのプログラムに精通しています作業。 'jmp foo'命令を出すかもしれません。これは基本的にIPを 'foo'ラベルのメモリアドレスに設定します。しかし、複数のコアがある場合は、「メモリアドレスfooで次の命令をフェッチし、コア番号2の命令ポインタをに設定してそこで実行を開始する必要があります。

ここで、アセンブリコードで、どのコアがその操作を実行するか指定していますか?

カーネルコードに戻る:ここで重要なことは何ですか?ファイル 'kernel/sched.c'はsched_setaffinity()と呼ばれる関数を持ちますが、タイプ "long"を返します。これはmanual pageと矛盾しています。ここで重要なのは何ですか?これらのモジュールのうち、アセンブリ命令が発行されたものを示します。どのモジュールが 'task_struct'を読み込み、 'cpus_allowed'メンバーを見て、それを命令に変換していますか? (私はglibcのソースを見抜いたことがありますが、このタスクを達成するためにカーネルコードを呼び出すだけだと思います)。

答えて

9

sched_setaffinity()は、どのCPUが実行可能なプロセス/スレッドであるかを、その後、再スケジュールを要求する。

スケジューラは実際には各CPU上で実行されるため、その特定のCPUで次に実行するタスクを決定する機会を得ます。

他のCPUで実際にコードを呼び出す方法について興味があれば、smp_call_function_single()をご覧ください。別のCPUで何かを呼びたい場合は、generic_exec_single()を呼び出します。後者は単にターゲットCPUの呼び出しキューに関数を追加し、何らかのIPIのもの(キューが空の場合)を通して再スケジュールを強制します。

ボトムラインは_jmp_命令の実際のSMPバリアントはありません。その代わりに、他のCPU上で実行されているコードが協調してタスクを実行します。

1

ここでアセンブリコードで、どのコアがその操作を実行するかを指定していますか?

ここにはアセンブリは含まれていません。すべてのタスク(スレッド)は、一度に1つのCPU(またはあなたの条件ではコア)に割り当てられます。特定のCPU上で実行を停止し、別のCPU上で再開するには、タスクが "migrate"(またthis)でなければなりません。タスクがあるCPUから別のCPUに移行するとき、スケジューラpicksは、sched_setaffinity()によって許可されたCPUのうち、よりアイドル状態のCPUを示します。

マジックアセンブリの説明は発行されていません。カーネルはハードウェアの低レベルのビューを持っており、各CPUは別々のオブジェクトであり、ユーザー空間プロセス(ユーザー空間ではCPUはほとんど見えません)とは大きく異なります。

4

あなたが理解していないことは、カーネルがすべて CPUコアで実行されていることです。すべてのタイマ割り込み(毎秒〜1000)で、スケジューラは各CPU上で実行され、実行するプロセスを選択します。何らかの方法で他のプロセスにプロセスを起動するよう指示するCPUはありません。 sched_setaffinity()は、プロセスにフラグを設定するだけで動作します。スケジューラーはこれらのフラグを読み取り、そうでない場合にCPU上でそのプロセスを実行しません。このうち

+0

このコメント – kumar

+0

を無視するには、<<すべてのタイマ割り込み(毎秒〜1000年)で、スケジューラは、各CPU上で動作し、実行するプロセスを選択します。 私はここで質問があります:スケジューラは、カーネルで実行されているコードの一部です。コードの一部は、いつでもシングルCPUで実行されます。だから、その平均スケジューラ(タイマ割り込みハンドラによって呼び出される)がCPUの間で切り替わるのですか?それは、私はより多くのCPUを持っているなら、それはすべてのCPU上でスケジューラを実行するオーバーヘッドです....ビットはここで混乱しています。 – kumar

+0

異なるCPUはスケジューラの異なるコピーを実行します。タイマー割込みは、すべてのCPUで個別に発生します。したがって、4つのCPUを使用している場合は、4つのスケジューラがあります。実際、スケジューラのコードは同じですが、データは異なります。 – osgx

関連する問題