System.YieldProcessor

Aus RAD Studio API Documentation
Wechseln zu: Navigation, Suche

Delphi

procedure YieldProcessor;

Eigenschaften

Typ Sichtbarkeit Quelle Unit Übergeordnet
procedure public System.pas System System

Beschreibung

Stellt für den Prozessor einen Hinweis bereit, der anzeigt, dass sich der aktuelle Code in einer Spin-Schleife befindet.

Die Routine YieldProcessor verbessert die Ausführung von Spin-Schleifen, indem für den Prozessor ein Hinweis bereitgestellt wird, der angibt, dass sich der aktuelle Code in einer solchen Schleife befindet.

Eine Spin-Schleife ist eine Möglichkeit zur Verzögerung der Ausführung eines Threads ohne die Steuerung des Threads an das Betriebssystem abzugeben. Das Betriebssystem wird veranlasst, mittels des Scheduler einen anderen Thread zur Ausführung auszuwählen. Wenn das Betriebssystem seinen Scheduler verwendet, bedeutet dies einen Kontextwechsel, was Folgendes beinhaltet:

  • Speichern der Kontextes des Threads (Status der CPU-Register etc.)
  • Ein Kernel-Übergang vom Benutzer- in den Kernel-Modus
  • Auswählen eines neuen Threads, um dessen Kontext auszuführen und zu laden
  • Ein Kernel-Übergang vom Kernel- in den Benutzer-Modus
  • Jeder Status im CPU-Cache, Sprungvorhersagepuffer (auch Branch History Table genannt), Übersetzungspuffer (Translation Lookaside Buffers, TLB) zum Zwischenspeichern der virtuellen Speicherseiteneinblendungen usw., der den Code im aktuellen Thread unterstützt und zu dessen schnellerer Ausführung beigetragen hat, geht verloren, wenn der neue Thread aufgenommen wird, wo er verlassen wurde. Das könnte irgendwo sein, möglicherweise in einem völlig anderen Prozess.

Wenn die erwartete Verzögerung für den Thread klein ist, kleiner als ein Thread-Zeitabschnitt (wird in Millisekunden gemessen), dann kann es sinnvoll sein, einen Kontextwechsel zu vermeiden und mittels einer Spin-Schleife zu warten, anstatt die Thread-Steuerung abzugeben (wie z.B. durch Aufruf der Win32-Funktion Sleep() mit 0 als Argument).

Solche Fälle treten bei Verwendung von sogenannten nicht-blockierenden Techniken und von Synchronisierungsdienstelementen auf. Beispielsweise könnte ein Benutzermodus-Synchronisierungsdienstelement von einem einzelnen (atomaren) bedingten Test implementiert werden und Operationen wie InterlockedCompareExchange festlegen. Um den Status einer von mehreren Threads verwendeten Variable verlässlich und korrekt zu ändern, wobei der neue Status der Variable von seinem vorherigen Zustand abhängt, müssen Sie entweder ein vom Betriebssystem bereitgestelltes Synchronisierungsdienstelement oder eine atomare Test-and-Set-Anweisung in einer Schleife verwenden. Mit einem vom Betriebssystem bereitgestelltem Synchronisierungsdienstelement wird ein Kontextwechsel im Falle eines Konflikts (Contention) hervorgerufen. Eine atomare Test-and-Set-Anweisung in einer Schleife schlägt immer fehl, wenn ein Konflikt (Contention) auftritt; deswegen wird deren Ausführung in einer Schleife erneut versucht. Falls dieser erneute Versuch zu früh durchgeführt wird, könnte dasselbe Ergebnis erzielt werden, weil die anderen störenden Threads immer noch ausgeführt werden. Sie sollten daher lange genug warten, um die Wahrscheinlichkeit zu erhöhen, dass die anderen Threads abgeschlossen sind; daher ist eine Spin-Schleife sinnvoll.

Warnung:  Wenn Sie die Leistung mit Spin-Loops und nicht-blockierenden Techniken steigern möchten, erhöhen Sie das Fehlerrisiko bei einer eher geringeren Chance einer Leistungssteigerung.

Siehe auch