私は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のソースを見抜いたことがありますが、このタスクを達成するためにカーネルコードを呼び出すだけだと思います)。
このコメント – kumar
を無視するには、<<すべてのタイマ割り込み(毎秒〜1000年)で、スケジューラは、各CPU上で動作し、実行するプロセスを選択します。私はここで質問があります:スケジューラは、カーネルで実行されているコードの一部です。コードの一部は、いつでもシングルCPUで実行されます。だから、その平均スケジューラ(タイマ割り込みハンドラによって呼び出される)がCPUの間で切り替わるのですか?それは、私はより多くのCPUを持っているなら、それはすべてのCPU上でスケジューラを実行するオーバーヘッドです....ビットはここで混乱しています。 –
kumar
異なるCPUはスケジューラの異なるコピーを実行します。タイマー割込みは、すべてのCPUで個別に発生します。したがって、4つのCPUを使用している場合は、4つのスケジューラがあります。実際、スケジューラのコードは同じですが、データは異なります。 – osgx