-
Die
vorliegende Erfindung bezieht sich auf ein Verfahren und eine Vorrichtung
für das
Leiten von Cachezugriffsanforderungen in einem System mit gemeinsam
verwendeten (geteiltem) Speicher.
-
Ein
System mit gemeinsamer Speicherverwendung für das Steuern des gemeinsamen
Verwendens von Speicherraum durch mehrere Prozessoren ist schon
seit vielen Jahren verwendet worden, um eine effiziente Verwendung
von Speicherraum zu verbessern. Die Verarbeitungsgeschwindigkeit
jedes der Prozessoren ist wesentlich höher als die Speicherverarbeitungsgeschwindigkeit
des Speichersystems. Demnach sind über die Jahre hinweg verschiedene
Techniken entwickelt worden, die Datenverarbeitungsgeschwindigkeit
in dem Prozessor und die Datenzugriffsgeschwindigkeit auf Daten,
welche in einem Speichersystem gespeichert sind, einanderbesseranzupassen.
-
Eine
Technik für
das bessere Anpassen der Datenverarbeitungsgeschwindigkeit des Prozessors
an die Datenzugriffsgeschwindigkeit in dem Speichersystem besteht
darin, dem Prozessor Cachespeichersysteme hinzuzufügen. Die
Datenzugriffsgeschwindigkeit des Cachesystems ist wesentlich höher als
die Datenzugriffsgeschwindigkeit des von allen Prozessoren gemeinsam
verwendeten Speichers. Jeder Prozessor hat seinen eigenen Cache
getrennt von dem gemeinsam verwendeten Speicher. Dementsprechend
werden Daten, die aktuell von einem Prozessor bearbeitet werden,
in seinem Cache gespeichert. Dies ruft Cache-Kohärenzprobleme hervor.
-
Das
Programmiermodell für
gemeinsam verwendeten Speicher, welches als die Basis für die meisten Betriebssysteme
für mehrere
Prozessoren (UNIX, WindowsNT, etc.) und Anwendungen dient, erfordert,
daß jeder
der Prozessoren, welcher auf das System zugreift, dieselben Daten
im Speicher sehen muß.
Eine andere Grundregel besteht darin, daß, wenn Daten in dem gemeinsam
verwendeten Speicher abgelegt werden, der Vorgang des Ablegens für alle Prozessoren,
welche den Speicher gemeinsam verwenden, sichtbar sein muß.
-
Wenn
in einem Cachesystem ein erster Prozessor mit einem Datenblock arbeitet,
der im folgenden als eine Cachezeile bezeichnet wird, und ein zweiter
Prozessor auf dieselben Daten oder auf Daten derselben Cachezeile
zugreifen möchte,
so muß sich
der zweite Prozessor über
die Tatsache bewußt
sein, daß die
aktuellen Daten, die er sucht, sich in dem Cache des ersten Prozessors
befinden. Demnach muß das
Speichersystem, welches den gemeinsam verwende ten Speicher für alle Prozessoren
verwaltet, die Kohärenz
bzw. Übereinstimmung
der Cachezeilen zwischen den mehreren Prozessoren aufrechterhalten.
-
Eine
Technik, um dieses zu realisieren, besteht darin, Prozessorzustände von
Cachezeilen für
jede in dem System mit mehreren Prozessoren in Gebrauch befindliche
Cachezeile zu identifizieren. Zum Beispiel sind die Cachezeilenzustände M, O,
S, I und E. Der Zustand M bedeutet, daß die Cachezeile durch den
zu diesem Zustand gehörenden
Prozessor modifiziert worden ist. Zustand O bedeutet, daß die Cachezeile
im Besitz des Prozessor ist und Zustand S bedeutet, daß die Cachezeile
von dem Prozessor gemeinsam (mit eventuell weiteren Prozessoren)
verwendet wird. Zustand I bedeutet, daß die Cachezeile für den Prozessor
ungültig ist
und E bedeutet, daß die
Cachezeile für
den Prozessor exklusiv vorhanden ist.
-
In
einem symmetrischen Mehrprozessorsystem (SMP) auf Busbasis sieht
ein Protokoll, welches als das „Snoopy Bus Protocol" (Nachforschungsprotokoll)
bekannt ist, für
die Kommunikation dieser Zustandsinformation für eine Cachezeile vor, daß diese
verschiedenen Prozessorzustände
der Cachezeile entlang des Systembusses zwischen den mehreren Prozessoren
kommuniziert werden. Jedesmal, wenn es eine Veränderung des Zustandes einer
Cachezeile in einem der Prozessorcaches gibt, so wird diese Veränderung
des Zustands auf dem Systembus an alle anderen Prozessoren ausgesendet.
Das Problem mit diesem Ansatz liegt darin, daß dann, wenn die Anzahl der
mehreren Prozessoren und Cachesysteme groß wird, der Systembus sehr
bald mit nichts anderem gefüllt
ist als Information über
die Änderung
des Cachezustands, oder dem Nachforschungsverkehr (Snoop Traffic).
Die Skalierbarkeit des SMP-Systems bezüglich der Prozessoren wird
demnach durch die Menge an Nachforschungsverkehr begrenzt, die durch
den Systembus unterstützt
wird, bevor in die Sättigung
kommt.
-
Um
dieses Problem abzumildern, wurde ein Verzeichnis von Cachezeileneinträgen entwickelt.
Der Verzeichniseintrag kennzeichnet den Besitz einer Cachezeile
und den Zustand dieser Cachezeile relativ zu jedem anderen Prozessor
in dem Mehrprozessorsystem, welche den gemeinsamen Speicher verwenden.
Wenn sich die Anzahl der Prozessoren in dem Mehrprozessorsystem
großen
Zahlen, wie zum Beispiel 100 Prozessoren, nähert, werden diese Cachezeileneinträge ziemlich
groß und
die Anzahl von Cachezeilen wird ebenfalls ziemlich groß. Im Ergebnis
verbraucht dieser Verzeichniseintrag einen großen Teil von Speicher nur zum
Speichern des Verzeichnisses.
-
Um
die Menge an Speicherraum, welche durch das Verzeichnis verbracht
wird, zu reduzieren, verwendet das neueste Modell teilweise zugeordnete
bzw. abgebildete Verzeichnisse. Jede Cachezeile in den verschiedenen
Caches von mehreren Prozessoren hat einen Eintrag in dem Verzeichnis,
jedoch ist jedes Verzeichnis viel kleiner. In einem teilweise zugeordneten
bzw. abgebildeten Verzeichnis kennzeichnet der Eintrag den Besitz
der Cachezeile und die erste „m"-Zahl der gemeinsamen Verwender (Prozessoren,
die Informationen in der Cachezeile gemeinsam verwenden). Typischerweise
ist „m" gleich 2, 3 oder
4.
-
Das
Begrenzen der Anzahl der gemeinsamen Verwender, welche in dem Verzeichniseintrag
angegeben werden, vermindert stark die Größe des Verzeichnisses, ruft
jedoch ein anderes Problem hervor. Wenn mehr als vier Prozessoren
die Cachezeile gemeinsam verwenden, muß das gemeinsam verwendete
Speichersystem etwas unternehmen, um die zusätzliche Identifizierung von
Prozessoren, welche die Cachezeile gemeinsam verwenden, aufzunehmen.
Dies wurde durch Zuordnen von mehr Speicherraum für das Verzeichnis gemacht,
indem ein Zusatzverzeichnis erzeugt wurde oder indem ein Sendevorgang
für den
Fall einer unvollständigen
Verzeichnisinformation ausgelöst
wurde. Die ersten beiden Optionen erfordern zusätzlichen Speicherraum für das Verzeichnis.
Die dritte Option erfordert mehr Systembandbreite und benötigt daher
mehr Zeit.
-
Ein
Artikel mit dem Titel „Probleme
bei Cachemodellen mit mehreren Levels von L. Liu. veröffentlicht in
den Proceedings of the International Conference on Computer Design:
VLSI in Computers and Processors, Cambridge MA, Oktober 10–12, 1994
auf Seiten 46–52" beschreibt Modelle
für Multilevel-Caches.
Dieser Artikel beschreibt das Auslagern von Einträgen von
einem Level 2-Cache (L2) auf eine zusätzliche Speicherstruktur RD
(„RES
Verzeichnis"). Ein
Ansatz, der als „Vorwärtsverkettung" bezeichnet wird,
hält explizite
Zeiger auf das RD in dem L2.
-
Aspekte
der Erfindung sind in den beigefügten
unabhängigen
und abhängigen
Ansprüchen
dargelegt.
-
Eine
Ausführungsform
der vorliegenden Erfindung ermöglicht
eine maximale effiziente Verwendung von Speicher, der als voll zugeordnetes
bzw. abgebildetes oder partiell zugeordnetes bzw. abgebildetes Verzeichnis
dient.
-
Die
vorstehenden und weitere Merkmale, Verwendungsmöglichkeiten und Vorteile der
Erfindung werden offensichtlich aus der folgenden genaueren Beschreibung
einer bevorzugten Ausführungsform
der Erfindung, wie sie in den beigefügten Zeichnungen dargestellt
wird. Beispielhafte Ausführungsformen
der Erfindung werden nachfolgend nur anhand eines Beispiels unter
Bezug auf die beigefügten
Zeichnungen beschrieben, von denen:
-
1 ein gemeinsam verwendetes
Speichersystem in einer bevorzugten Ausführungsform der Erfindung zeigt,
in welchem ein Verzeichnissystem für Cachezeilenzustände vorliegt,
-
2 ein Datenflußdiagramm
ist, welches den Informationsstrom in dem Verzeichnissystem nach 1 zeigt,
-
3 eine bevorzugte Ausführungsform
des Verzeichnissystems der Cacheleitungszustände nach 1 zeigt,
-
4 den Vorgang des Aufbauens
von Einträgen
in einer Cachezeilentabelle zeigt,
-
5 ein Beispiel für den Inhalt
einer Cachezeilentabelle ist.
-
In
der bevorzugten Ausführungsform
der Erfindung, welche in 1 dargestellt
ist, verwendet ein von mehreren Prozessoren gemeinsam verwendetes
Speichersystem ein Verzeichnissystem 14 für Cachezeilenzustände, um
Zustandsinformation über
gemeinsam verwendete Cachezeilen für die mehreren Prozessoren 6, 7, 8 und 9 bereitzustellen.
Jeder der Prozessoren P0 bis Pm hat sein eigenes Cachesystem 10, 11, 12 bzw. 13.
Während
eines Lese- oder Schreibvorgangs greift jeder der Prozessoren auf
das Verzeichnissystem für
die Cachezeilenzustände
zu, um entweder den Status der Cachezeile zu ermitteln oder um den
Status der Cachezeile zu aktualisieren. Im allgemeinen können sowohl
Lese- als auch Schreibvorgänge
ein Lesen und ein Schreiben des Verzeichniseintrags erfordern. Ein
Lesevorgang erfordert nur das Aufnehmen der Information aus einem
Verzeichniseintrag für
die Cachezeile, d. h. der Besitz und der gemeinsam verwendeten Zustände der
Cachezeile. In einem Schreibvorgang können die Zustände von
gemeinsam verwendeten Cachezeilen aktualisiert werden und demnach
kann der Verzeichniseintrag für
die Cachezeile aktualisiert werden.
-
Das
Wiedergewinnen von Information aus dem Cachezeilenverzeichnis oder
das Aktualisieren des Cachezeilenverzeichnisses sind Vorgänge, die
durch das Verzeichnissystem 14 für die Cachezeilenzustände ausgeführt werden.
In dem Verzeichnissystem 14 für die Cachezeilenzustände enthält das Verzeichnis
einen Zustandswert für
die Zustandsinformation über
die gemeinsam verwendete Cachezeile anstatt der eigentlichen Zustandsinformation über die
gemeinsam verwendete Cachezeile. Dieser Zustandswert ist ein codiertes n-Bitwort,
welches einen Zustand identifiziert, der einem eindeutigen Zustandswort
der gemeinsam verwendeten Cachezeile entspricht. Beispielsweise
könnte
ein Zustandswort einer gemeinsam verwendeten Cachezeile den Prozessor
P1 als den Besitzer der Cachezeile kennzeichnen und den gemeinsamen
Verwendungszustand mit den Prozessoren P2 und P9 für die Cachezeile
anzeigen.
-
In 2 ist der Strom der gemeinsam
verwendeten Zustandsinformation für eine Cachezeile veranschaulicht.
Ein gemeinsam verwendetes Zustandswort 20 einer Cachezeile
kennzeichnet den Prozessor, welcher die Cachezeile besitzt und die
gemeinsam verwendeten Zustände
für Prozessoren,
die ebenfalls die Cachezeile verwenden. In dem Beispiel nach 2 ist der Besitzer der Cachezeile
der Prozessor P2 und die Prozessoren P1, P3 und P4 verwenden die
Cachezeile gemeinsam. Die Zustände
der gemeinsamen Verwendung sind beispielsweise MODIFIED (modifiziert),
SHARED (gemeinsam verwendet) oder INVALID (ungültig).
-
Das
Verzeichnissystem 14 (1)
enthält
eine Cachezeilentabelle 22 für jede Cachezeile und ein Verzeichnis 24 der
Cachezeilenzustandswerte. Die Cachezeilentabelle wird verwendet,
um das gemeinsam verwendete Zustandswort der Cachezeile (CLSS) in
einen Zustandswert (SV) für
jedes gemeinsam verwendete Cachezeilenzustandswort umzuwandeln.
Im Ergebnis kennzeichnet der Zustandswert das Zustandswort der gemeinsam
verwendeten Cachezeile für
diese Cachezeile. Die Zustandswerte für die Cachezeile werden dann in
dem Verzeichnis 24 gespeichert und auf sie kann über eine
Cachezeilenadresse von einem Prozessor P1–PX zu dem Verzeichnis 24 zugegriffen
werden.
-
Ein
Prozessor, welcher Zugriff auf die Cachezeilen anfordert, um die
Zustandsinformation über
die gemeinsam verwendete Cachezeile zu erhalten, würde eine
Cachezeilenadresse an das Verzeichnis 24 aussenden. Wenn
der Zugriff sich auf ein Lesen der Cachezeile bezieht, so wird der
Zustandswert auf der Cachezeilenadresse in dem Verzeichnis 24 gelesen.
Dieser Zustandswert zeigt auf den Zustandswert in der Cachezeilentabelle 22,
was durch den in gestrichelten Linien dargestellten Pfeil 25 angezeigt
wird. Aus der Tabelle 22 wird der Zustandwert umgewandelt oder decodiert
in den Zustands- bzw. Statuseintrag der gemeinsam verwendeten Cachezeile,
und dieser Eintrag wird als Wort 20 in 2 an den Prozessor zurückgeliefert.
Wenn der Prozessor dann die Cachezeile neu beschreiben oder modifizieren
möchte,
werden die Zustände
des Zustandswortes der gemeinsam verwendeten Cachezeile durch den
Prozessor aktualisiert. Der Prozessor gibt das aktualisierte Zustandswort
der gemeinsam verwendeten Cachezeile an die Cachezeilentabelle zurück, wie es
durch den durchgezogenen Pfeil 21 angezeigt wird. Der Zustandseintrag
der gemeinsam verwendeten Cachezeile in Tabelle 22 wird mit einem
Zustandswert durch die Cachezeilentabelle 22 codiert. Wenn
die Codierung des Zustandswerts abgeschlossen ist, wird der Zustandswert,
wie es durch den massiven Pfeil 23 angezeigt wird, unter
der Cachezeilenadresse für
die Cachezeile in dem Verzeichnis in das Verzeichnis 24 geladen.
-
Die
Implementierung des Verzeichnissystems für die Cachezeilenzustände in 1 ist in 3 wiedergegeben. In 3 wird das Verzeichnissystem implementiert
durch das Verzeichnis 30, welches die Zustandswerte für Zustandseinträge gemeinsam
verwendeter Cachezeilen speichert. Diese Zustandswerte werden durch
den Decoder 32 in Zustandsworte gemeinsam verwendeter Cachezeilen
codiert. Wenn Zustandswerte in dem Verzeichnis 30 gespeichert
werden, wird das Zustandswort der gemeinsam verwendeten Cachezeile
durch den Codierer 34 codiert und in dem Verzeichnis 30 gespeichert.
In der bevorzugten Ausführungsform
verwenden der Decodierer 32 und der Codierer 32 eine
Cachezeilentabelle für
jede Cachezeile, um den Decodier- und Codiervorgang als Tabellenachschlagevorgang
durchzuführen.
-
Dementsprechend
kann, wenn ein Prozessor in dem Mehrprozessorsystem für das Verzeichnis 30 eine
Verzeichnisadresse für
eine Cachezeile liefert, unter dieser Adresse ein Zustandswert in
das Verzeichnis geschrieben oder bei der Adresse aus dem Verzeichnis
ausgelesen werden, je nachdem ob ein Zustandwort einer gemeinsam
verwendeten Cachezeile decodiert oder in einen Zustandswert codiert
werden soll. Nicht alle Zustandsworte gemeinsam verwendeter Cachezeilen
werden in einen Zustandswert codiert. Die Cachezeilentabellen 36 sind
größenmäßig begrenzt
und nur die signifikantesten Zustandsworte gemeinsam verwendeter Cachezeilen
für das
Modell des Mehrprozessorsystems werden in der Cachezeilentabelle
mit Zustandswerten versehen.
-
In
der bevorzugten Ausführungsform
der vorliegenden Erfindung enthält
das teilweise zugeordnete Verzeichnis 30 n-Bit-Worte, die
Zustandswerte oder Zeilen zu dem eigentlichen Zustandswert einer
gemeinsam verwendeten Cachezeile sind. Die tatsächlichen Zustandsworte der
gemeinsam verwendeten Cachezeile werden als Einträge in Cachezeilentabellen 36,
wie zum Beispiel der Tabelle 22 in 2 gespeichert.
-
Der
Vorgang für
das Aufbauen jeder Cachezeilentabelle ist in 4 veranschaulicht. Für eine gegebene Cachezeile
beginnt der Prozeß mit
dem Vorgang 40, in dem alle möglichen Zustandseinträge oder
-worte gemeinsam verwendeter Cachezeilen für die Cachezeile aufgelistet
werden. Nachdem dieses Zustandsworte gemeinsam verwendeter Cachezeilen
numeriert worden sind, werden sie sodann hinsichtlich ihrer Bedeutung entsprechend
dem Modell bzw. der Auslegung des Mehrprozessorsystems geordnet.
Die Kriterien für
die Erzeugung dieser geordneten Liste werden nachstehend kurz beschrieben.
-
Nachdem
der Vorgang 42 die CLSS-Einträge geordnet hat, lädt der Vorgang 44 die
Anzahl von 2n – 1 von CLSS-Einträgen höchster Ordnung
in die Cachezeilentabelle. Die Variable n entspricht der Anzahl
von Bits in dem Zustandswertwort, das in dem Verzeichnis 30 gespeichert
ist (3). Mit anderen
Worten, das Zustandswertwort der Cachezeile hat n Bits.
-
Nachdem
der Vorgang 44 die 2n – 1 Einträge höchster Ordnung
in die Cachezeilentabelle geladen hat, ordnet der Vorgang 46 jedem
CLSS-Eintrag in der Tabelle Zustandswerte zu. Da es 2n – 1 Einträge und n-Bits gibt,
bleibt ein Zustandswert unbenutzt. Dieser Zustandswert wird dem
Zustand zugeordnet, in welchem das Zustandswort der gemeinsam verwendeten
Cachezeile mit keinem Zustandseintrag der gemeinsam verwendeten
Cachezeile in der Cachezeilentabelle übereinstimmt. Mit anderen Worten,
dieser Zustandswert würde die
Notwendigkeit anzeigen, in einen zusätzlichen Zustand oder in ein
zusätzliches
Verzeichnis für
das Zustandwort der gemeinsam verwendeten Cachezeile „zu entfliehen".
-
Ein
Beispiel einer Cachezeilentabelle ist in
5 wiedergegeben. Die Cachezeilentabelle
beinhaltet eine Spalte für
Zustandswerte und eine Spalte für
Zustandseinträge
der gemeinsam verwendeten Cachezeile. Wie zuvor schon in Verbindung
mit
2 erläutert wurde,
identifizieren die Zustandsworte einer gemeinsam verwendeten Cachezeile
im allgemeinen einen Besitz, gefolgt von der Anzeige eines gemeinsam
verwendeten Zustands, welcher jeden der Prozessoren kennzeichnet,
welche die Cachezeile gemeinsam verwenden und welche den Zustand
dieser gemeinsamen Verwendung identifiziert. Demnach zeigt in der
Tabelle nach
5 der Zustand
der gemeinsam verwendeten Cachezeile für einen Zustandswert „1" an, daß der Besitzer
der Prozessor
1 ist und er enthält Zustandsflags der gemeinsamen
Verwendung für
die Prozessoren
2,
4,
6 und
8.
Für den
gemeinsam verwendeten Zustandswert „30" ist der Besitzer der Cachezeile der
Prozessor
8 und nur Prozessor
1 verwendet die
Cachezeile gemeinsam. Der Zustandswert
31 der gemeinsamen
Verwendung ist für die
Bedingung einer fehlenden Übereinstimmung
für Einträge gemeinsam
verwendeter Cachezeilen vorgesehen und zeigt das Erfordernis an,
in einen zusätzlichen
Vorgang oder ein zusätzliches
Verzeichnis „zu
entfliehen". Die
Kriterien für
das Aufbauen einer Cachezeilentabelle und ein weiteres Beispiel
von Einträgen
in einer solchen Cachezeilentabelle werden nunmehr beschrieben.
In diesem Beispiel beträgt
die Gesamtzahl von Knoten (oder Cachedomänen) acht. Wenn in dem n-Bit-Zustandswert
in dem Verzeichnis n = 8 ist und wenn drei Bits verwendet werden,
um den Besitzer zu kennzeichnen, verbleiben fünf Bits, um gemeinsam verwendete
Zustände
zu kennzeichnen. Mit diesen fünf
Bits kann man
32 Zustandswerte codieren. Wenn man noch einige
allgemeine Zustände
zuläßt, so bleiben
genügend
Zustandswerte übrig,
um alle möglichen
Zustände gemeinsamer
Verwendung zwischen den Knoten 0–3 zu codieren und mit einigen
Abstrichen möglicherweise auch
zwischen Knoten 0–4. Beispielsweise
| Senden | 1 |
| keine
gemeinsame Verwendung | 1 |
| irgendein
einzelner, gemeinsamer Verwender | 8 |
| alle
Paare gemeinsamer Verwender der Knoten 0–3 C(4,2) | 6 |
| alle
Tripel gemeinsamer Verwender der Knoten 0–3 C(4,3) | 4 |
| | 20 |
-
Dies
reicht aus, um alle allgemeinen Zustände ebenso wie alle möglichen
gemeinsamen Verwendungszustände
zwischen den ersten vier Knoten zu kennzeichnen. Wenn es tatsächlich nicht
mehr als vier Knoten gibt, so müssen
einige Knoten bei der Codierung mehr bevorzugt bzw. privilegierter
sein als andere. Um dies zu implementieren, wird das folgende benötigt: eine Übertragungsfunktion,
einen Addierer für
gemeinsame Verwender (add-sharer), der den neuen Zustand ausgibt,
wenn er einen Zustand und einen neuen Verwender erhält, eine
Funktion, bekannte Verwender, welche einen Bitvektor der bekannten
Verwender liefert, wenn sie einen Zustand erhält, und eine Funktion möglicher
Verwender, welche, wenn sie einen Zustand erhält, einen Bitvektor der möglichen
Verwender liefert. Die letzten beiden unterscheiden sich nur darin,
wie sie den Sendezustand handhaben, die erstere liefert einen Bitvektor
mit lauter Nullen, während
die letztere nur Einsen liefert.
-
Es
gibt hier eine gewisse Redundanz, da für n Knoten höchstens
n – 1
gemeinsame Verwender vorliegen können.
Um dies vollständig
auszunutzen, ist jedoch die Zuordnung von Etiketten gemeinsamer
Verwender, die in den Zuständen
codiert sind, zu tatsächlichen
Knotenziffern erforderlich, um je nach dem aktuellen Besitzer dynamisch
zu sein (wenn beispielsweise der aktuelle Besitzer 0 ist, so ist
der gemeinsame Verwender 0 der Knoten 1, der gemeinsame Verwender
1 Knoten 2, usw. Wenn der aktuelle Besitzer 1 ist, so ist der gemeinsame
Verwender 0 der Knoten 0, der gemeinsame Verwender 1 ist der Knoten
2, etc). Eine mögliche
Art damit umzugehen, besteht darin, den aktuellen Besitzer zu einem
Parameter für
mögliche
gemeinsame Verwender und bekannte Verwender zu machen und eine Funktion
Knoten-zu-gemeinsamer
Verwender hinzuzufügen,
welche, wenn sie den aktuellen Besitzer und eine Codezahl erhält, den
Index der gemeinsamen Verwender ausgibt. Wenn man dieses hat, so
ist es möglich,
alle möglichen
Zustände
der gemeinsamen Verwendung für
vier gemeinsame Verwender zu codieren:
| Senden | 1 |
| keine
gemeinsamen Verwender | 1 |
| irgendein
einzelner gemeinsamer Verwender | 7 |
| alle
Paare gemeinsamer Verwender 0–3
C(4,2) | 6 |
| alle
Tripel gemeinsamer Verwender 0–3
C(4,3) | 4 |
| 0–3 verwenden
alle gemeinsam | 1 |
| | 20 |
-
Bei
diesem Verfahren besteht die Komplikation, daß eine Veränderung des Besitzes eine Übersetzung des
Zustandsetiketts (Zustands-Labels) erfordert. Das einzige Mal, daß dies geschieht,
wenn es irgendwelche gemeinsamen Verwender gibt, liegt bei einem
NUMA-(nicht gleichförmiger
Speicherzugriff)-Zurückschreiben vor.
-
Man
betrachte zusätzlich
das Aufrechterhalten des vorherigen Besitzzustandes im Fall ohne
gemeinsame Verwender für
konkurrierende Algorithmen, dann gilt:
| Senden | 1 |
| keine
gemeinsamen Verwender – vorheriger
Besitzer | 8 |
| Irgendein
einzelner gemeinsamer Verwender | 7 |
| alle
Paare gemeinsamer Verwender 0–3
C(4, 2) | 6 |
| alle
Tripel von gemeinsamen Verwendern 0 –3 C(4,3) | 4 |
| 0–3 verwenden
alle gemeinsam | 1 |
| | 27 |
-
Für ein System
mit 5 oder weniger Knoten könnte
man auch den Verzeichniseintrag für den obigen Fall optimieren.
-
Wenn
man beispielsweise n = 8 hat mit einem Besitzerfeld von 3 Bit, so
kennzeichnen die übrigen
5 Bit, wenn sie gesetzt sind, die gemeinsamen Verwender. Die Position
eines Bits der gemeinsamen Verwendung bestimmt die Knotenidentität eines
gemeinsamen Verwenders. Einige Bits der gemeinsamen Verwendung können 2 Knoten
bezeichnen. Dann gilt:
| Bits | Verwendung |
| 7–5 | Besitzer |
| 4 | wenn
1 Knoten #0 ein gemeinsamer Verwender ist |
| 3 | wenn
1 Knoten #1 ein gemeinsamer Verwender ist |
| 2 | wenn
1 Knoten #2 und Knoten #5 gemeinsamer Verwender sein können |
| 1 | wenn
1 Knoten #3 und Knoten #6 gemeinsamer Verwender sein können |
| 0 | wenn
Knoten #4 und #7 gemeinsame Verwender sein können. |
-
Nicht
existierende Knoten werden mit einer Maske aktiver Knoten ausgefiltert.
-
Wenn
das System 5 oder weniger Knoten hat, die in derartiger Weise numeriert
sind, daß keine
2 Knoten existieren, deren Zustand der gemeinsamen Verwendung mit
demselben Bit bezeichnet wird, so bestimmt das Verzeichnis immer
alle gemeinsamen Verwender exakt. Ein Fünfkno tensystem mit Knoten,
die mit 0, 1, 2, 3 und 4 numeriert sind, ist ein Beispiel für ein solches
System.
-
Es
ist offensichtlich, daß es
vielfache Algorithmen gibt, die verwendet werden können, um
die Kriterien für
das Aufbauen der Cachezeilentabellen zu setzen. Diese Kriterien
hängen
von der Systemauslegung ab und können
während
der Entwicklung des Systemmodells eingestellt werden.
-
Das
obige Beispiel veranschaulicht eine alternative Ausführungsform,
in welcher ein einzelner Zustandswert mehr als ein mögliches
Zustandswort einer gemeinsam verwendeten Cachezeile codiert. Der
Vorteil dieser Ausführungsform
besteht darin, daß,
wenn ein System weniger als die maximale Anzahl von Knoten oder
Cachedomänen
hat, es keine Mehrdeutigkeit in der Codierung des Zustandswertes
gibt. Auf diese Weise kann Speicherraum für das Verzeichnis eingespart
werden, indem die Größe des Speicherraums
für Zustandswerte
begrenzt wird. Für
maximal konfigurierte Systeme könnte
die Mehrdeutigkeit in dem Zustandswert dadurch aufgelöst werden
durch Aussenden an alle möglichen
Knoten, die durch die mehrfache Codierung bzw. mehrdeutige Codierung
zugelassen bzw. möglich
sind.
-
Um
das obige zu veranschaulichen, betrachte man eine Systemarchitektur
mit einer maximalen Anzahl von acht Knoten. Der Zustandwert X möge bedeuten,
daß einer
der Knoten 0 und 4 oder beide gemeinsame Verwender sein können. In
dem Beispiel des Systems mit nur vier Knoten (0 ... 3) ist der Zustandswert X
nicht zweideutig, da es keinen Knoten 4 gibt. In einer solchen Situation
zeigt der Zustandswert X eindeutig an, daß der Knoten 0 ein gemeinsamer
Verwender ist. In einem Beispiel des Systems mit fünf oder
mehr Knoten entspricht der Zustandswert X einer Situation, die ein
begrenztes Aussenden an den Knoten 0 und den Knoten 4 erfordert,
da einer von ihnen oder beide gemeinsame Verwender sein könnten.
-
In
einer anderen Ausführungsform
der Erfindung können
die Prozessoren in dem Mehrprozessorsystem in einer Domäne gruppiert
bzw. zusammengefaßt
sein. Wiederum gemäß 1 repräsentieren die Prozessoren P0,
P1 und P2 eine Domäne 18 von
drei Prozessoren. Diese Domäne
kann als ein einzelner Knoten oder ein einzelnes Verarbeitungssystem
bezüglich
des Verzeichnissystems 14 der Cachezeilenzustände behandelt
werden. Demnach könnten
die Prozessoren in der Domäne 18 ein „Schnüffelprotokoll" oder Nachforschungsprotokoll
(Snoopy Protocol) verwenden, um die wechselseitigen Cachesysteme
zu verfolgen. Wenn man mit Cachesystemen außerhalb der Domäne arbeitet,
würde die
Domäne
das Verzeichnissystem 14 der Cachezeilenzustände verwenden,
wie es oben beschrieben wurde.
-
In
einer weiteren Ausführungsform
der Erfindung ist das Verzeichnis der Cachezeilenzustände ein
voll zu geordnetes bzw. voll abgebildetes (fully mapped) Verzeichnis.
In dieser Ausführungsform
sind die Zustandsworte gemeinsam verwendeter Cachezeilen in einen
Zustandswert codiert. Wenn ein voll zugeordnetes Verzeichnis verwendet
wird, benötigen
die CLSS-Eintragstabelle
oder Cachezeilentabelle keinen „Entfliehens"- oder Zusatzeintrag.