.NETまたはJavaでスレッドまたはプロセスを起動する場合、起動するプロセッサまたはコアを選択する方法はありますか?このような場合、共有メモリモデルはどのように機能しますか?
5 に答える
複数のスレッドを使用している場合、オペレーティングシステムが自動的に複数のコアの使用を処理します。
起動するプロセッサまたはコアを選択する方法はありますか?
タスクマネージャを使用して、プログラムの実行を許可するCPUをWindowsに指示できます。通常、これはマルチスレッドの実装が壊れているレガシープログラムのトラブルシューティングにのみ役立ちます。これをする、
- タスクマネージャーを実行する
- ウィンドウでプロセスを見つけます
Processes
。 - 右クリックして選択します
Set Affinity...
- アプリケーションの実行を許可するCPUの横にあるチェックボックスをオンにします。その場合、Windowsは、そのプロセスからそれらの特定のCPUへのスレッドのみをスケジュールします。
私が正しく思い出せば、Windowsはプロセスが実行される以降の時間のためにこれらの設定を「記憶」しますが、それについて私を引用しないでください-自分でいくつかのテストを実行してください:-)
System.Diagnostics.Process.ProcessorAffinityプロパティを使用してプログラムを起動した後、.NETでこれをプログラムで実行することもできますが、設定が「記憶」されるとは思わないため、常に短い期間があります。アプリは、適切と思われるCPUウィンドウで実行されます。申し訳ありませんが、Javaでこれを行う方法がわかりません。
ノート:
これは、プロセスレベル全体に適用されます。CPU0のみにアフィニティを設定してから、50のスレッドを起動すると、それらのスレッドの50はすべてCPU0で実行され、CPU1、2、3などは何もしません。
繰り返しになりますが、これは主に壊れたレガシーソフトウェアのトラブルシューティングに役立ちます。ソフトウェアが壊れていない場合は、これらの設定をいじってはいけません。プログラムを実行するのに最適なCPUをWindowsに決定させて、システムの残りのパフォーマンスを考慮に入れることができます。
「共有メモリ」モデルについても同じように機能しますが、アプリが複数のCPUで実行されている場合、単一のCPUでタイムスライスを実行するのではなく、微妙に問題が発生する可能性があります。
目を見張るような例については、CPUとメモリバリアに関するこのばかげた魚の記事を読んでください。
これはPowerPCでのOSX開発を目的としていますが、どこにでも適用できるほど一般的です。私見それはトップ10の1つです'すべての開発者はこれを読むべきです'私が読んだ記事。
仮想マシンが(グリーンスレッドではなく)ネイティブスレッドを使用している場合、オペレーティングシステムはマルチスレッドを処理します。特定のスレッドのプロセッサを選択するなど、低レベルの詳細を指定することはできません。通常、使用可能なプロセッサよりも多くのスレッドがあるため、オペレーティングシステムは、すべてのスレッドを実行する機会を与えるためにタイムスライスを実行する必要があるため、この方法の方が適しています。
そうは言っても、重要なタスクがある場合はスレッドの優先順位を設定できます。通常、スレッドAPIはこの可能性を提供します。たとえば、Java APIを参照してください。http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)
PS:解析エンジンに何かが壊れています...上記のリンクをプレーンテキストとして追加する必要がありました
コア0がめちゃくちゃだったので、これをいくつかのプログラムで使用しました。
// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();
// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);
また
// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);
詳細については、「Process.ProcessorAffinityプロパティ」を参照してください。