Sie sind nicht angemeldet.

Der MSTS bleibt immer wieder "hängen" - ein Fall für die Kernzuweisung

Karsten Pohl

German Railroads

  • »Karsten Pohl« ist der Autor dieses Themas

Beiträge: 1 748

Registrierungsdatum: 8. Juni 2003

Wohnort: Wedel bei Hamburg

  • Nachricht senden

1

Dienstag, 16. September 2014, 11:18

Der MSTS bleibt immer wieder "hängen" - ein Fall für die Kernzuweisung

Problem:

Während der Fahrt friert der MSTS ein und stürzt ab.


Ursache:

Das Problem tritt in der Regel auf, wenn ein KI-Zug in Sicht- und Hörweite kommt.

Als der MSTS entwickelt wurde, spielten Systeme, die mehr als eine CPU enthielten, im Privatbereich keine Rolle. Der MSTS geht also davon aus, auf einem System mit genau einer CPU zu laufen. Auf Grund der CPU-nahen Programmierung kommt es auf den heute üblichen Mehrkernprozessoren zu Schwierigkeiten.

Wird ein Programm, wie der MSTS ausgeführt, so läuft es nicht kontinuierlich. Das Programm muss sich ja mit allen anderen laufenden Programmen die CPU teilen. Dazu wird einem Programm eine gewisse CPU-Zeit eingeräumt. Ist diese abgelaufen, wird es in eine Warteschlange gestellt und das nächste Programm ist an der Reihe (Taxistand-Prinzip).

Stehen mehrere CPUs (wie in den heute üblichen Mehrkernprozessen vorhanden) zur Verfügung, wird dem "vorne in der Schlange" wartenden Programm der nächste freie CPU-Kern zugewiesen. Das ist wie bei einer gemeinsamen Warteschlange vor einer Reihe von Bank- oder Flughafenschaltern.

Da diese Vorgänge in sehr kurzen Zeitintervallen geschehen, sieht es so aus, als ob sich ein Programm auf mehrere CPU-Kerne gleichmäßig verteilt. Tatsächlich belegt es aber einen Kern zu 100%, geht dann in die Warteschlange und belegt dann zufällig den gleichen oder einen anderen Kern wieder zu 100%. Dann geht es wieder in die Warteschlange usw. usw.

Genaugenommen läuft ein Programm als sog. Prozess. Ein Prozess kann sich, wenn es der Programmierer des Programms so eingebaut hat, in mehrere Threads (Ausführungsstränge) aufteilen. Diese Threads können dann parallel und unabhängig voneinander auf mehreren Kernen gleichzeitig bearbeitet werden. Die Kunst des Programmierers besteht darin, die Threads auf die Reise zu schicken und die Ergebnisse, die zu völlig unterschiedlichen Zeiten und in unterschiedlicher Reihenfolge wieder eintreffen, wieder zusammenzuführen.

Der MSTS ist eine sog. Single-Thread-Anwendung, besitzt also nur einen Thread. Daher kann der MSTS nur einen einzigen Kern pro Zeiteinheit nutzen - Mehrkernprozessoren sind für ihn wertlos. Tatsächlich hat der MSTS Probleme damit, dass er während seines Ablaufs mal auf den einen und mal auf den anderen Kern geschickt wird.


Lösung:

Um das "Springen" über die CPU-Kerne zu verhindern, kann man unter Windows einem Prozess einen (oder mehrere) bestimmte Kerne zuweisen. Der Prozess läuft dann ausschließlich auf diesen zugewiesenen Kernen.

Es kursieren diverse Programme und Verfahren durch das Internet, wie man dies bewerkstelligen kann. Zusätzliche Programme belegen Resourcen. Warum also nicht mit Windows-Bordmitteln?

Ich empfehle hier folgendes, etwas versteckte Mittel:
  1. Klicke mit der rechten Maustaste auf die Verknüpfung zum MS Train Simulator
  2. Wähle im Kontextmenü den Punkt "Eigenschaften" aus
  3. In dem Dialogfeld bitte den Reiter "Verknüpfung" öffnen
  4. In der Zeile "Ziel:" steht etwas wie "X:\...\launcher.exe -rungame" oder "X:\...\train.exe" (X:\...\ steht hier stellvertretend für den Installationspfad)
  5. Ändere das "Ziel" wie folgt ab (ACHTUNG: Anführungszeichen bitte genau beachten und alles in eine Zeile!!!) und bestätige mit "OK"
C:\Windows\System32\cmd.exe /c start /high /affinity 0x01 "MSTS auf CPU-0" "X:\...\train.exe" -mem:2048

Bitte X:\...\ durch den Installationspfad ersetzen, der schon vorher dort stand!

Sollte Windows nicht in C:\Windows\ installiert sein, bitte den Pfad entsprechend ändern.

Hinter -mem2048 können bei Bedarf noch weitere Parameter ergänzt werden. Mit Zeitbeschleunigung sähe dies dann so aus: -mem2048 -timeacceleration

Der Parameter /high sorgt übrigens dafür, dass der Train Simulator mit hoher Priorität läuft. Dies kann Performanz-Gewinne auf nicht ganz so leistungsstarken Systemen bringen.

Wird der MSTS künftig über diese Verknüpfung gestartet, läuft er ausschließlich auf dem ersten Kern, auf dem sich der MSTS "heimisch" fühlt. Überprüfen kann man den Erfolg sehr gut im Resourcenmonitor (Reiter CPU) von Windows.


Train Store:

Für den Start aus dem Train Store heraus, muss die obige Befehlszeile zweigeteilt werden. Dazu muss im Train Store über das Menü Tools --> Optionen --> MSTS Starteinstellungen... der Dialog zum Setzen der Startparameter aufgerufen werden.

Über diesen Dialog wird dem Train Store nun die cmd.exe als MSTS "untergeschoben" und die Parameter der cmd.exe als MSTS-Parameter:


(Als Parameter bitte den kompletten rechten Teil der obigen Befehlszeile ab /c (einschließlich) eingeben!)
Viele Grüße aus Wedel bei Hamburg
Karsten




Menschen hören nicht auf zu spielen, weil sie alt werden - sie werden alt, weil sie aufhören zu spielen. (Oliver Wendell Holmes)

Zeichensetzung kann Leben retten! Dem Henker wird eine Notiz des Königs überreicht: "Tötet ihn nicht begnadigt!"

Karsten Pohl

German Railroads

  • »Karsten Pohl« ist der Autor dieses Themas

Beiträge: 1 748

Registrierungsdatum: 8. Juni 2003

Wohnort: Wedel bei Hamburg

  • Nachricht senden

2

Mittwoch, 17. September 2014, 10:14

Der MSTS bleibt immer wieder "hängen" - ein Fall für die Kernzuweisung

Noch eine kleine Ergänzung:

 

Die Angabe "MSTS auf CPU-0" ist frei gewählt. Hier wird der Titel das sich öffnende Programmfenster festgelegt, der aber durch dem MSTS sofort mit "Train Simulator" überschrieben wird. Wichtig ist lediglich, dass dort überhaupt etwas steht. Die Syntax des start-Kommandos sieht den Titel zwar als optionale Angabe vor, allerdings würde bei fehlendem Titel der in Anführungsstriche einzukleidende Pfad und Aufruf der train.exe als Titel und -mem:2048 als zu startendes Programm interpretiert werden. Das würde nicht funktionieren.

 

Kernzuweisung:

 

Die angegebene Kommandozeile weißt dem MSTS den ersten Kern fest zu. Theoretisch sollte es egal sein, welcher Kern für den MSTS abgestellt wird. Ich fahre mit aktiver Kernzuweisung absturzfrei - egal auf welchem Kern. Es gibt jedoch auch eine Theorie, die besagt, dass der MSTS am sichersten auf der CPU-0, also dem ersten Kern, läuft, da er damit die Situation während seiner Entwicklungs- und Veröffentlichungszeit vorfindet. Das will ich weder bestätigen noch dementieren.

 

Wer den MSTS gerne auf einen anderen Kern setzen möchte, muss die Angabe hinter /affinity wie folgt ändern:

 

CPU-Nr. Kern Angabe für /affinity
CPU-0 1 0x01
CPU-1 2 0x02
CPU-2 3 0x04
CPU-3 4 0x08
CPU-4 5 0x10
CPU-5 6 0x20
CPU-6 7 0x40
CPU-7 8 0x80

 

ACHTUNG: Erfolgt die Zuweisung auf einen nicht vorhandenen Kern, so wird die Zuweisung ignoriert, d.h. der MSTS würde wieder auf alle Kerne verteilt laufen!

 

Für einen Zwei-Kern-Prozessor (z.B. Intel Core i3) wäre also 0x02 das Maximum, für einen Vier-Kern-Prozessor (z.B. Intel Core i5) 0x08 und für einen "Acht-Kern"-Prozessor (z.B. Intel Core i7) wäre 0x80 das Maximum.

Viele Grüße aus Wedel bei Hamburg
Karsten




Menschen hören nicht auf zu spielen, weil sie alt werden - sie werden alt, weil sie aufhören zu spielen. (Oliver Wendell Holmes)

Zeichensetzung kann Leben retten! Dem Henker wird eine Notiz des Königs überreicht: "Tötet ihn nicht begnadigt!"

Karsten Pohl

German Railroads

  • »Karsten Pohl« ist der Autor dieses Themas

Beiträge: 1 748

Registrierungsdatum: 8. Juni 2003

Wohnort: Wedel bei Hamburg

  • Nachricht senden

3

Samstag, 14. Januar 2017, 00:11

Der MSTS bleibt immer wieder "hängen" - ein Fall für die Kernzuweisung

Für alle, die gerne wissen möchten, was die o.g. Zeile

C:\Windows\System32\cmd.exe /c start /high /affinity 0x01 "MSTS auf CPU-0" "X:\...\train.exe" -mem:2048

bedeutet, schlüssele ich die Zeile einmal auf. Verwirrend ist hier sicherlich, dass hier drei unterschiedliche Programme mit jeweils eigenen Parametern Schritt für Schritt gestartet werden.

C:\Windows\System32\cmd.exe
Hier wird zunächst die Windows-Eingabeaufforderung (cmd.exe) gestartet.

/c
Der Windows-Eingabeaufforderung wird der Parameter /c übergeben. Dieser bewirkt, dass sie nach dem Start ein Kommando ausführen soll.

start
Dies ist das von der Windows-Eingabeaufforderung auszuführende Programm. Mittels start lassen sich in der Windows-Eingabeaufforderung Programme starten.

/high
Der Parameter /high ist ein Parameter von start und nicht von cmd.exe. Er bewirkt, dass das zu startende Programm mit hoher Priorität ausgeführt wird.

/affinity 0x01
Der Parameter /affinity von start legt fest, welchen Prozessor-Kernen das Programm zugeordnet werden soll. Die Angabe 0x01 ist eine Zahl in hexadezimaler Schreibweise und ist übersetzt in das übliche Dezimalsystem einfach 1. Das Programm soll also auf dem ersten Kern laufen, der üblicherweise CPU-0 genannt wird.

"MSTS auf CPU-0"
Hierbei handelt es sich um einen weiteren Parameter, der von start erwartet wird. Es handelt sich hierbei um den Namen des Fensters, in dem das Programm ausgeführt werden soll. Für den MSTS ist das ziemlich egal, da er den Fenstertitel später selbst setzen wird. Trotzdem muss hier etwas stehen. Man hätte auch "Ich finde den MSTS super" schreiben können...

"X:\....\train.exe"
Dies ist das Programm, dass von start gestartet werden soll. In unserem Fall natürlich der MSTS inkl. vollständigem Pfad.

-mem:2048
Dieser Parameter (und alle weiteren Parameter) gehört nicht mehr zu start, sondern bereits zur train.exe.


Somit ergibt sich folgende Kette:
  1. die Verknüpfung startet die cmd.exe
  2. cmd.exe startet start
  3. start startet train.exe -mem:2048 mit hoher Priorität und weist den ersten Kern zu
Viele Grüße aus Wedel bei Hamburg
Karsten




Menschen hören nicht auf zu spielen, weil sie alt werden - sie werden alt, weil sie aufhören zu spielen. (Oliver Wendell Holmes)

Zeichensetzung kann Leben retten! Dem Henker wird eine Notiz des Königs überreicht: "Tötet ihn nicht begnadigt!"

Persönlicher Bereich