12

Linux syscall sched_setaffinity() の仕組みを理解しようとしています。これは私の質問hereの続きです。

私はこのガイドを持っています。これは、syscall の使用方法を説明し、かなりきちんとした (動作する!) 例を示しています。

そこで、Linux 2.6.27.19カーネル ソースをダウンロードしました。

そのシステムコールを含む行に対して「grep」を実行したところ、91 件の結果が得られました。有望ではありません。

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

シングルコア、シングルスレッドのプログラムがどのように機能するかはよく知っています。「jmp foo」命令を発行すると、基本的に IP が「foo」ラベルのメモリ アドレスに設定されます。しかし、複数のコアがある場合、「メモリアドレス foo で次の命令をフェッチし、コア番号 2の命令ポインタを設定して、そこで実行を開始する」と言わなければなりません。

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

カーネル コードに戻ります。ここで何が重要なのでしょうか? ファイル 'kernel/sched.c' には sched_setaffinity() と呼ばれる関数がありますが、タイプ "long" を返します。これはマニュアル ページと矛盾しています。では、ここで重要なことは何ですか?これらのモジュールのうち、発行された組み立て手順を示しているのはどれですか? 「task_struct」を読み取り、「cpus_allowed」メンバーを見て、それを命令に変換しているモジュールはどれですか? (glibc のソースも調べてみましたが、このタスクを実行するためにカーネル コードを呼び出すだけだと思います。)

4

4 に答える 4

9

sched_setaffinity()プロセス/スレッドの実行が許可されているCPUをスケジューラーに伝えるだけで、再スケジュールを呼び出します。

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

他の CPU で実際にコードを呼び出す方法に興味がある場合は、 を参照することをお勧めしますsmp_call_function_single()。別の CPU で何かを呼び出したい場合、これは を呼び出しますgeneric_exec_single()。後者は単に関数をターゲット CPU の呼び出しキューに追加し、いくつかのIPIを介して再スケジュールを強制します (キューが空の場合)。

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

于 2009-04-20T00:22:51.393 に答える
4

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

于 2009-04-20T00:40:15.907 に答える
1

Where, in the assembly code, are we specifying which core performs that operation?

There is no assembly involved here. Every task (thread) is assigned to a single CPU (or core in your terms) at a time. To stop running on a given CPU and resume on another, the task has to "migrate" (also this). When a task migrates from one CPU to another, the scheduler picks the CPU which is more idle among the CPUs allowed by sched_setaffinity().

There is no magic assembly instructions issued. The kernel has a more low-level view of the hardware, each CPU is a separate object, very different than how it looks like for user-space processes (in user-space, CPUs are almost invisible).

于 2009-04-20T00:29:16.123 に答える
-1

これをチェックしてください: B オペレーティング システム プログラミング ガイドライン

于 2009-12-03T15:24:26.060 に答える