Was passiert mit dem Cache-Inhalt bei einem Kontextwechsel?

50

Was passiert in einem Multicore-Prozessor mit dem Inhalt des Cache eines Kerns (z. B. L1), wenn in diesem Cache ein Kontextwechsel stattfindet?

Ist das Verhalten von der Architektur abhängig oder ist es ein allgemeines Verhalten, das von allen Chipherstellern befolgt wird?

Ankit
quelle

Antworten:

42

Dies hängt sowohl vom Prozessor (nicht nur von der Prozessorserie, sondern von Modell zu Modell unterschiedlich) als auch von den Betriebssystemen ab, es gibt jedoch allgemeine Prinzipien. Ob ein Prozessor Multicore ist, hat keinen direkten Einfluss auf diesen Aspekt. Derselbe Prozess kann auf mehreren Kernen gleichzeitig ausgeführt werden (wenn es sich um einen Multithread handelt), und der Speicher kann von mehreren Prozessen gemeinsam genutzt werden, sodass die Cachesynchronisierung unvermeidbar ist, unabhängig davon, was bei einem Kontextwechsel passiert.

Wenn ein Prozessor eine Speicherstelle im Cache nachschlägt und eine MMU vorhanden ist , kann er entweder die physische oder die virtuelle Adresse dieser Stelle verwenden (manchmal sogar eine Kombination aus beiden, aber das ist hier nicht wirklich relevant).

Bei physischen Adressen spielt es keine Rolle, welcher Prozess auf die Adresse zugreift, der Inhalt kann freigegeben werden. Es ist also nicht erforderlich, den Cache-Inhalt während eines Kontextwechsels ungültig zu machen. Wenn die beiden Prozesse dieselbe physische Seite mit unterschiedlichen Attributen abbilden, wird dies von der MMU (die als MPU (Memory Protection Unit) fungiert) behandelt. Der Nachteil eines physisch adressierten Caches ist, dass die MMU zwischen dem Prozessor und dem Cache sitzen muss, sodass die Cache-Suche langsam ist. L1-Caches sind so gut wie nie physisch adressiert. Caches höherer Ebene können sein.

Dieselbe virtuelle Adresse kann unterschiedliche Speicherorte in unterschiedlichen Prozessen bezeichnen. Daher müssen bei einem virtuell adressierten Cache der Prozessor und das Betriebssystem zusammenarbeiten, um sicherzustellen, dass ein Prozess den richtigen Speicher findet. Es gibt mehrere gängige Techniken. Der vom Betriebssystem bereitgestellte Kontextwechselcode kann den gesamten Cache ungültig machen. Das ist richtig, aber sehr teuer. Einige CPU-Architekturen haben in ihrer Cache-Zeile Platz für eine ASID (Adressraum-ID), die Hardwareversion einer Prozess-ID, die auch von der MMU verwendet wird. Dies trennt Cache-Einträge effektiv von verschiedenen Prozessen und bedeutet, dass zwei Prozesse, die dieselbe Seite abbilden, inkohärente Ansichten derselben physischen Seite haben (normalerweise gibt es einen speziellen ASID-Wert, der eine gemeinsam genutzte Seite anzeigt, Diese müssen jedoch gelöscht werden, wenn sie nicht in allen Prozessen, in denen sie zugeordnet sind, derselben Adresse zugeordnet sind. Wenn das Betriebssystem darauf achtet, dass verschiedene Prozesse nicht überlappende Adressräume verwenden (was einen Teil des Zwecks der Verwendung des virtuellen Speichers zunichte macht, aber manchmal möglich ist), bleiben die Cache-Zeilen gültig.

Die meisten Prozessoren mit einer MMU haben auch einen TLB . Der TLB ist ein Cache mit Zuordnungen von virtuellen Adressen zu physischen Adressen. Der TLB wird vor der Suche in physisch adressierten Caches konsultiert, um die physische Adresse schnell zu ermitteln, wenn dies möglich ist. Der Prozessor kann die Cache-Suche starten, bevor die TLB-Suche abgeschlossen ist, da häufig Kandidaten-Cache-Zeilen aus den mittleren Bits der Adresse zwischen den Bits, die den Versatz in einer Cache-Zeile bestimmen, und den Bits, die die Seite bestimmen, identifiziert werden können. Virtuell adressierte Caches umgehen den TLB, wenn ein Cache-Treffer vorliegt, obwohl der Prozessor die TLB-Suche im Falle eines Fehlschlags möglicherweise initiiert, während er den Cache abfragt.

Der TLB selbst muss während eines Kontextwechsels verwaltet werden. Wenn die TLB-Einträge eine ASID enthalten, können sie an Ort und Stelle bleiben. Das Betriebssystem muss TLB-Einträge nur leeren, wenn die ASID ihre Bedeutung geändert hat (z. B. weil ein Prozess beendet wurde). Wenn die TLB-Einträge global sind, müssen sie ungültig gemacht werden, wenn in einen anderen Kontext gewechselt wird.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Sehr informativ. Wenn Sie einige Beispiele hinzufügen könnten, wie dies in realen Architekturen geschieht, wäre dies sogar noch besser.
JohnTortugo
2
@JohnTortugo Was ich geschrieben habe, entspricht ziemlich genau dem, was Sie mit ARMv7 tun können (z. B. der CPU Ihres Smartphones) (die einzige Architektur, in der ich jemals MMU-Code geschrieben habe). Ich erwarte, dass andere Plattformen wie x86 ziemlich ähnlich sind, aber ich konnte nicht darüber schreiben. Wenn Sie konkrete Informationen zu einer realen Plattform suchen, ist Computer Science nicht die richtige Website. Sie können sich an Stack Overflow oder Electrical Engineering oder Embeddedd (vorgeschlagen) wenden .
Gilles 'SO- hör auf böse zu sein'
10

Der Cache merkt normalerweise nichts von einem Kontextwechsel. Nur die Reihenfolge der Speicheradressen, auf die zugegriffen wird, bestimmt, welche Cache-Zeilen ersetzt werden.

Die Ersetzungsrichtlinie ist in der Regel eine vom Hersteller und der jeweiligen Mikroarchitektur abhängige Heuristik. Das Problem ist, dass die Heuristik die Zukunft nicht vorhersagen kann, auf welche Adresse und damit auf welche Cache-Zeile als nächstes zugegriffen wird.

Die Heuristik kann eine einfache als LRU sein (am wenigsten verwendet). Bei modernen CPUs ist die Heuristik jedoch komplizierter.

Werfen Sie einen Blick auf das Softwareentwicklerhandbuch für Intel® 64- und IA-32-Architekturen, Band 3 In Kapitel 11 werden der Speichercache und die Cachesteuerungsmechanismen erläutert. AMD hat dies in Kapitel 7 des AMD64 Architecture Programmer's Manual Volume 2: System Programming beschrieben . Bei ARM-basierten CPUs scheinen die PDFs nur registrierten Kunden zur Verfügung zu stehen.

uli
quelle
Können Sie eine Referenz für den ersten Absatz geben? Oder beziehen sich die verknüpften Dokumente auf dieses Problem?
Raphael
Das Verhalten hängt stark davon ab, ob der Cache physisch oder virtuell adressiert ist. Die Ersetzungsrichtlinie ist hier nicht relevant. Für ARM gibt es Informationen in den technischen Handbüchern der Prozessoren, die öffentlich zugänglich sind, z. B. L1 für Cortex-A9 (was Sie in Mobiltelefonen der neuesten Generation erhalten), obwohl es ohne das Referenzhandbuch für die nichtöffentliche Architektur schwierig zu verstehen sein kann .
Gilles 'SO- hör auf böse zu sein'
1
@Raphael Ich habe „typisch“ geschrieben, weil der Cache bei den Prozessoren, auf die ich gestoßen bin, keine Kenntnisse über Threads, Prozesse, Kontexte usw. hat. Er reagiert nur auf die Speicherzugriffe. Wenn der Datencache bei einem Kontextwechsel geleert und der Anweisungscache ungültig gemacht wird, löst das Betriebssystem diese Aktion aus, nicht der Cache. Wenn Sie ein anderes Betriebssystem installieren, kann sich dieses Verhalten ändern.
uli
@Gilles Ich habe einmal versucht, eine kurze Antwort zu geben und mich entschieden, nicht über virtuellen Speicher zu schreiben, da dies sofort das Betriebssystem betrifft. Und es gibt auch eine Zeitskala, die berücksichtigt werden muss. "Nothing Changes" könnte eine Antwort auf die Zeit zwischen dem Kontextwechsel und dem nächsten Speicherzugriff sein, da der Cache-Inhalt möglicherweise ungültig wird, aber überhaupt nicht geändert wird.
uli