Frage

Gibt es beim Starten eines Threads oder Prozesses in .NET oder Java eine Möglichkeit auszuwählen, auf welchem ​​Prozessor oder Kern er gestartet wird?Wie funktioniert das Shared-Memory-Modell in solchen Fällen?

War es hilfreich?

Lösung

Wenn Sie mehrere Threads verwenden, kümmert sich das Betriebssystem automatisch um die Verwendung mehrerer Kerne.

Andere Tipps

Gibt es eine Möglichkeit auszuwählen, auf welchem ​​Prozessor oder Kern es gestartet wird?

Mithilfe des Task-Managers können Sie Windows mitteilen, auf welchen CPU(s) Ihr Programm ausgeführt werden darf.Normalerweise ist dies nur zur Fehlerbehebung bei älteren Programmen nützlich, bei denen die Multithreading-Implementierung fehlerhaft ist.Um dies zu tun,

  • Führen Sie den Task-Manager aus
  • Finden Sie Ihren Prozess im Processes Fenster.
  • Klicken Sie mit der rechten Maustaste und wählen Sie Set Affinity...
  • Aktivieren Sie die Kontrollkästchen neben den CPUs, auf denen Ihre Anwendung ausgeführt werden soll.Windows plant dann nur Threads von diesem Prozess auf diese bestimmten CPUs

Wenn ich mich richtig erinnere, „merkt“ sich Windows diese Einstellungen für spätere Ausführungen Ihres Prozesses, aber bitte zitieren Sie mich dazu nicht – führen Sie selbst einige Tests durch :-)

Sie können dies auch programmgesteuert in .NET tun, nachdem Ihr Programm mit dem gestartet wurde System.Diagnostics.Process.ProcessorAffinity Eigenschaft, aber ich glaube nicht, dass sie sich die Einstellungen „merkt“, daher wird es immer einen kurzen Zeitraum geben, in dem Ihre App auf der CPU ausgeführt wird, die Windows für richtig hält.Ich weiß leider nicht, wie man das in Java macht.

Notiz:

Dies gilt auf der gesamten Prozessebene.Wenn Sie die Affinität nur für CPU0 festlegen und dann 50 Threads starten, werden alle 50 dieser Threads auf CPU0 ausgeführt und CPU1, 2, 3 usw. bleiben untätig.

Um es noch einmal zu betonen: Dies ist in erster Linie für die Fehlerbehebung bei defekter Legacy-Software nützlich.Wenn Ihre Software nicht kaputt ist, sollten Sie sich wirklich nicht mit diesen Einstellungen herumschlagen und Windows die Auswahl der besten CPU(s) für die Ausführung Ihres Programms überlassen, damit es die restliche Systemleistung berücksichtigen kann.


Das „Shared-Memory“-Modell funktioniert genauso, aber es gibt noch mehr Dinge, die auf subtile Weise schief gehen können, wenn Ihre App auf mehreren CPUs läuft und nicht nur in Zeitscheiben auf einer einzigen.

Ein aufschlussreiches Beispiel finden Sie hier dieser lächerliche Artikel über CPUs und Speicherbarrieren.

Es zielt auf die OSX-Entwicklung auf PowerPC ab, ist aber allgemein genug, dass es überall gelten sollte.Meiner Meinung nach ist es einer der zehn besten „Alle Entwickler sollten das lesen“-Artikel, die ich gelesen habe.

Das Betriebssystem kümmert sich um Multithreading, wenn die virtuelle Maschine native Threads (im Gegensatz zu Green-Threads) verwendet, und Sie können keine Details auf niedriger Ebene angeben, wie z. B. die Auswahl eines Prozessors für einen bestimmten Thread.Dies ist besser, da Sie in der Regel viel mehr Threads haben, als Prozessoren zur Verfügung stehen. Daher muss das Betriebssystem eine Zeitaufteilung durchführen, um allen Threads die Möglichkeit zu geben, ausgeführt zu werden.

Allerdings können Sie Thread-Prioritäten festlegen, wenn Sie eine kritische Aufgabe haben, und eine Threading-API bietet diese Möglichkeit normalerweise.Sehen Sie sich zum Beispiel die Java-API an: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PS:In der Parsing-Engine ist etwas kaputt ...Ich musste den obigen Link als Klartext hinzufügen

Ich würde mir die Parallel-Erweiterungen des .NET Frameworks ansehen.Es ist immer noch drin CTP, Es sollte jedoch Multi-Core-Prozessoren optimal nutzen.Der einfachste Ort, um mit .NET zu beginnen, ist auf Parallel-Teams-Blog.

Was Java betrifft, habe ich keine Ahnung.

Ich habe dies in einigen Programmen verwendet, weil mein Kern 0 irgendwie durcheinander war.

// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);

oder

// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);

Mehr dazu in „Process.ProcessorAffinity-Eigenschaft".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top