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.
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.
quelle