Frage

Was genau gespeichert wird und in einem Kontextwechsel zwischen zwei Threads wieder

  • im gleichen Prozess
  • zwischen zwei Prozessen
War es hilfreich?

Lösung

Dies ist eher eine komplexe Frage, da die Antwort (en) abhängig ist von vielen Dingen ab:

  1. Die CPU in Frage
    • Es kann erheblich variieren sogar innerhalb der gleichen Familie zum Beispiel der zusätzlichen Register hinzugefügt für SSE / MMX-Operationen.
  2. Das Betriebssystem, da es die Handler steuert, die auf einem Kontextschalter auslösen und entscheiden, ob die CPU-Hardware (sofern vorhanden) zu unterstützen, in einem Kontextschalter verwendet wird oder nicht.
    • Zum Beispiel Windows-verwendet nicht die Intel-Hardware, die für Sie viel von dem Kontextwechsel-Speicher tun kann, da sie nicht speichern, nicht-Point-Register schweben.
  3. Jede von einem Programm bewusst aktivierten Optimierungen von seinen eigenen Anforderungen und in der Lage, die OS darüber informiert
    • Vielleicht, um anzuzeigen, dass es nicht FP verwendet Register so nicht mit ihnen nicht der Mühe
    • In Architekturen mit umfangreichen Registerdateien wie die meisten RISC-Designs gibt es erheblichen Nutzen zu wissen, dass Sie nur eine kleinere Teilmenge dieser Register benötigen

Bei einem Minimum in der Verwendung Universalregister und Programmzählerregister müssen gespeichert werden (das gemeinsame Design der meisten aktuellen CISC / RISC-Stil Allzweck-CPUs vorausgesetzt).

Beachten Sie, dass nur die minimale Menge an Aufwand in Bezug auf einen Kontextwechsel zu tun versuchen, ist ein Thema einiger akademischem Interesse

Linux hat offensichtlich weitere Informationen in der Öffentlichkeit auf diese verfügbar obwohl meine Referenzen ein wenig veraltet sein können.

Es gibt ein ‚task_struct‘, die eine große Anzahl von Feldern enthalten, um den Task-Zustand in Bezug sowie den Prozess, der die Aufgabe ist.

Eine davon ist die ‚thread_struct‘

  

/ * CPU-spezifischen Zustand dieser Aufgabe * /
   - struct thread_struct Gewinde;
       Informationen über Cache-TLS-Deskriptoren hält, Debugging-Register,
       Fehler Info, Floating-Point, virtuellen 86-Modus oder IO-Berechtigungen.

Jede Architektur definiert seine eigene thread_struct, die auf einem Schalter die Register und andere Werte gespeichert identifiziert.

Dies wird weiterhin durch die Anwesenheit kompliziert Register umbenennen, die mehr in Fluganweisungen (entweder über superskalaren oder Pipeline im Zusammenhang architektonische Entwürfe) ermöglichen. Die Wiederherstellungsphase eines Kontext swicth wahrscheinlich auf der CPU-Pipeline verlassen wird in einem anfänglich leeren Zustand, die die Anweisungen gestellt werden, die noch in der Pipeline keine Wirkung zurückgezogen hatte nicht und somit ignoriert werden können. Dies macht das Design der CPU, die viel schwerer.

Der Unterschied zwischen einem Prozess und einem Faden ist, dass der Prozess-Schalter (der einen Threadwechsel in allen Hauptstrom-Betriebssystemen immer bedeutet) benötigt Speicher Übersetzungsinformationen, IO bezogenen Informationen und die Erlaubnis verwandte Strukturen aktualisieren.

Diese wird vor allem seines Zeiger auf die reicheren Datenstrukturen so wird keine signifikant Kosten in Bezug auf den Thread-Kontextschalter sein.

Andere Tipps

Wenn der Kontext-Umschaltung zwischen Threads desselben Prozesses ist, werden alle nichtflüchtigen Universalregister des aktuellen Threads werden gespeichert und die des neuen Fadens wiederhergestellt werden; flüchtige Register müssen nur die Ausführung, wenn die aktuelle Thread gespeichert werden muss durch einen Interrupt unterbrochen wird. Register jeder Koprozessor durch die Fäden (z.B. Punktprozessor floating), sollte ebenfalls gespeichert und wiederhergestellt werden, Wenn das Umschalten zwischen Threads von 2 Prozessen ist, zusätzlich zu dem, was für einen normalen Kontextwechsel erforderlich ist, Speicher und IO-Management bedingte Veränderungen sollten auch durchgeführt werden; für z.B. Speicherschutz durch Prozesse benötigt wird, unter Verwendung erreicht Seitentabellen und Seitenverzeichnis Tabellen und jeder Prozess hat eine eindeutige Seitenverzeichnistabelle Adresse, die geändert werden muss, wenn die Prozessänderungen.

Dies ist abhängig vom Betriebssystem Sie verwenden, aber sicher werden Sie den Inhalt aller Register (einschließlich der Befehlszähler) und laden Sie die Register des Fadens speichern müssen, um Sie wechseln.

Der einzige Unterschied, der auf dem gleichen Prozess zwischen zwei Threads meiner Meinung nach in Bezug auf den Schalter kommt, ist, dass Sie den Inhalt der L1 und MMU-Cache nicht verlieren.

Ich bin nicht sicher, aber wenn ich mich richtig auch der Arbeitsspeicher Satz erinnere schaltet ist.

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