-
Die
vorliegende Erfindung bezieht sich auf das Gebiet der symmetrischen
Parallelverarbeitungssysteme und insbesondere auf ein symmetrisches
Parallelverarbeitungssystem mit einer hierarchischen Architektur.
-
Computersysteme
mit Parallelverarbeitung enthalten zwei oder mehrere Prozessoren,
die verwendet werden können,
um Berechnungsaufgaben durchzuführen.
Eine besondere Berechnungsaufgabe kann auf einem Prozessor durchgeführt werden, während andere
Prozessoren damit nicht zusammenhängende Berechnungsaufgaben
durchführen. Alternativ
können
Bestandteile einer bestimmten Berechnungsaufgabe auf mehrere Prozessoren
verteilt werden, um die Zeit, die benötigt wird, eine Berechnungsaufgabe
als Ganzes auszuführen,
zu verkürzen.
Allgemein gesprochen ist ein Prozessor eine Einrichtung, die dafür ausgelegt
ist, eine Operation auf einem oder mehreren Operanden auszuführen um
ein Ergebnis zu erzeugen. Die Operation wird durchgeführt als
Antwort auf einen Befehl der von dem Prozessor ausgeführt wird.
-
Eine
gängige
Architektur in handelsüblichen Computersystemen
mit Parallelverarbeitung ist die symmetrische Mehrprozessor-(SMP)Architektur.
Typischerweise weist ein SMP-Computersystem mehrere Prozessoren
auf, die über
eine Cache-Hierarchie an einen gemeinsam verwendeten Bus angeschlossen
sind. Zusätzlich
ist an den Bus ein Speicher angeschlossen, der von den Prozessoren
in dem System gemeinsam verwendet wird. Der Zugriff auf eine beliebige
bestimmte Speicherstelle innerhalb des Speichers erfolgt in einem ähnlichen
Zeitumfang wie der Zugriff auf eine andere beliebige Speicherstelle.
Da auf jede Stelle in dem Speicher auf die gleiche Weise zugegriffen
werden kann, wird diese Struktur häufig als eine gleichförmige Speicher-Architektur(UMA)
bezeichnet.
-
Prozessoren
sind häufig
mit internen Caches ausgestaltet und einer oder mehrere Caches sind üblicherweise
in der Cache-Hierarchie zwischen den Prozessoren und dem gemeinsam
verwendeten Bus in einem SMP-Computersystem enthalten. Mehrfache
Kopien von Daten, die auf einer bestimmten Hauptspeicheradresse
angesiedelt sind, können
in diesen Caches gespeichert werden. Um das Modell des gemeinsam
verwendeten Speichers aufrecht zu erhalten, in dem zu irgendeinem
gegebenen Zeitpunkt eine bestimmte Adresse genau einen Datenwert
speichert, verwenden Computersysteme mit gemeinsam verwendetem Bus
Cachekohärenz.
Allgemein gesprochen ist eine Operation kohärent, wenn die Auswirkungen
der Operation auf die an einer bestimmten Speicheradresse gespeicherten
Daten sich in jeder Kopie der Daten innerhalb der Cache-Hierarchie wieder
finden. Wenn beispielsweise Daten, die an einer bestimmten Speicheradresse
gespeichert sind, aktualisiert werden, kann die Aktualisierung den Caches,
die die Kopien der vorhergehenden Daten speichern, zugeführt werden.
Alternativ können
die Kopien der vorhergehenden Daten in den Caches ungültig gemacht
werden, so daß ein
nachträglicher
Zugriff auf bestimmte Speicheradressen bewirkt, daß die aktualisierte
Kopie von dem Hauptspeicher übertragen
wird. Für
Systeme mit gemeinsam verwendetem Bus wird üblicherweise ein Nachforschungs-Bus-Protokoll eingesetzt.
Jede kohärente Transaktion,
die über
einen gemeinsam verwendeten Bus ausgeführt wird, wird geprüft (oder „ausspioniert") gegenüber Daten
in den Caches. Wenn eine Kopie der betroffenen Datei gefunden wird,
kann der Status der Cachezeile, die die Daten enthält, als
Antwort auf die kohärente
Transaktion aktualisiert werden.
-
Unglücklicherweise
leiden Architekturen mit gemeinsam verwendetem Bus an verschiedenen Nachteilen,
die ihre Brauchbarkeit für
Computersysteme mit Parallelverarbeitung einschränken. Ein Bus ist ausgelegt
für eine
Spitzenbandbreite (zum Beispiel die Anzahl an Bytes/Sekunde, die über den
Bus übertragen
werden können).
Wenn zusätzliche
Prozessoren an dem Bus angeschlossen werden, kann die Bandbreite,
die benötigt
wird um die Prozessoren mit Daten und Befehlen zu versorgen, die
maximale Bandbreite des Busses überschreiten.
Da einige Prozessoren gezwungen sind auf eine verfügbare Busbandbreite
zu warten, leidet die Leistungsfähigkeit des
Computersystems, wenn der Bedarf der Prozessoren an Bandbreite die
verfügbare
Busbandbreite übersteigt.
-
Zusätzlich kann
das Anschließen
von mehreren Prozessoren an einen gemeinsam verwendeten Bus die
kapazitive Last erhöhen
und sogar dazu führen,
daß die
physikalische Länge
des Busses größer gemacht
werden muß.
Die erhöhte
kapazitive Last und die vergrößerte Länge des
Busses erhöhen
die Verzögerung
beim Durchlauf eines Signals über
den Bus. Aufgrund der erhöhten
Durchlaufverzögerung kann
es länger
dauern, die Transaktionen durchzuführen. Deswegen kann die maximale
Bandbreite des Busses abnehmen, wenn mehr Prozessoren angeschlossen
werden.
-
Diese
Probleme vergrößern sich
weiter bei der fortschreitenden Erhöhung der Betriebsfrequenz und
Leistung der Prozessoren. Die erhöhte Leistung, die durch die
höhere
Frequenz und weiter fortgeschrittene Prozessor-Mikroarchitekturen
ermöglicht wird,
resultieren in höheren
Bandbreitenanforderungen als bei früheren Prozessorgenerationen,
selbst bei der gleichen Anzahl an Prozessoren. Deswegen könnten Busse,
die früher
mit einer ausreichenden Bandbreite für Computersysteme mit Parallelverarbeitung
ausgestattet waren, für
ein vergleichbares Computersystem, das Hochleistungsprozessoren verwendet,
unzureichend sein.
-
Was
gewünscht
ist, ist ein Busaufbau, der die Bandbreitenanforderungen eines Multiprozessorensystems
mit vielen Hochleistungsprozessoren und einem relativ großem räumlichen
Abstand, der die mehreren Prozessoren trennt, unterstützt.
-
Ein
Artikel von Savo Savic et al. mit dem Titel „Improved RMS for the PC Environment", veröffentlicht
in Microprocessors and Microsystems, Bd. 19, Nr. 10, Dec 1995, Seiten
609–619,
beschreibt ein Computersystem mit reflective Memory (RM), in dem eine
Vielzahl von Knoten über
einen RM-Bus verbunden sind. Jeder Knoten enthält einen Prozessor, einen Cache
und eine RM-Platine
mit einem lokalen Speicher, der über
einen Systembus verbunden ist. Der lokale Speicher besteht aus 8-kbyte-Segmenten. Jedes
Segment kann auf einem reflektiven, gemeinsam verwendeten Raum abgebildet
sein oder nicht abgebildet sein (privat). Daten innerhalb gemeinsam verwendeter
Segmente eines lokalen Speichers eines gegebenen Knotens, werden
in einem gemeinsam verwendeten Segment eines lokalen Speichers anderer
Knoten reflektiert (das heißt
dupliziert). Bei Empfang eines Befehls zum Schreiben in reflektivem,
gemeinsam verwendetem Raum ist die RM- Platine so betreibbar, daß sie den
Schreibbefehl über den
RM-Bus verbreitet. Der RM-Bus ist zur Verbreitung von Aktualisierungen
auf die gemeinsam verwendeten Segmente bestimmt. Der RM-Bus ist ein nur-Schreibe
Bus und es gibt keine Lese-Anforderungen auf diesem Bus. Der Artikel
beschreibt nicht die Bereitstellung von Segmenten, die auf einem
nur lesbaren, entfernt liegendem Raum abgebildet sind.
-
Verschiedene
Aspekte der Erfindung werden in den beigefügten Ansprüchen definiert.
-
Die
oben aufgezeigten Probleme werden zum großen Teil durch eine Ausführungsform
der Erfindung gelöst,
die einen hierarchischen Bus mit einer Mehrzahl von Adreßpartitionen
bereitstellen kann. Jede physikalische Speicherstelle wird auf mehrere Adressen
abgebildet. Damit kann unter Verwendung von einer Vielzahl von Aliasadressen
auf jede physikalische Speicherstelle zugegriffen werden. Die Eigenschaften
jeder Adreßpartition
werden von der hierarchischen Busstruktur verwendet, um zu bestimmen,
welche Transaktionen global und welche Transaktionen lokal übertragen
werden. Auf diese Weise eliminiert die hierarchische Busstruktur
globale Übertragungen
von lokalen Transaktionen.
-
Eine
Ausführungsform
der Erfindung kann ein Multiprozessorenarchitektur bereitstellen,
die eine Mehrzahl von Verarbeitungsknoten, eine Mehrzahl von Bussen
einer niedrigen Ebene, wobei jeder Verarbeitungsknoten an einen
der Mehrzahl von Bussen der niedrigen Ebene gekoppelt ist, eine
Mehrzahl von Repeatern, wobei jeder Repeater an einen der Mehrzahl
von Bussen der niedrigen Ebene gekoppelt ist, einen Bus der höchsten Ebene
und einen Systemspeicher enthält.
Der Bus der höchsten
Ebene kann mit einer Mehrzahl von Repeatern verbunden sein und die
Repeater kontrollieren den Datentransfer zwischen den Bussen der
niedrigen Ebene und dem Bus der höchsten Ebene. Der Systemspeicher enthält eine
Mehrzahl von Speicherstellen. Jeder Prozessorknoten kann so ausgestaltet
sein, daß er auf
alle Speicherstellen zugreifen kann. Die Systemspeicherstellen können auf
eine Mehrzahl von Adreßpartitionen
abgebildet sein, wodurch die Systemspeicherstellen durch eine Mehrzahl
von Aliasadressen adressiert werden. Die Eigenschaften der Adreßpartitionen
schreiben die Steuerung des Datentransfers der Busse niedriger Ebene
und dem Bus höchster
Ebene durch den Repeater vor.
-
Eine
Ausführungsform
der Erfindung kann weiter ein gemeinsam verwendetes Speichersystem bereitstellen,
welches eine Mehrzahl von Speicherstellen enthält, wobei die Speicherstellen
einem aus der Mehrzahl von Verarbeitungsknoten zugeordnet sind.
Die Speicherstellen können
so ausgelegt sein, daß von
der Mehrzahl von Verarbeitungsknoten darauf zugegriffen wird. Die
Systemspeicherstellen können
auf eine Mehrzahl von Adreßpartitionen
abgebildet sein, wodurch die Systemspeicherstellen von einer Mehrzahl
von Aliasadressen adressiert werden, und die Eigenschaften der Adreßpartitionen
schreiben vor, welcher der Verarbeitungsknoten Zugriff auf eine
Datenanforderung hat.
-
Eine
Ausführungsform
der Erfindung kann weiterhin ein Verfahren für ortsspezifische Datentransfers
auf einen hierarchischen Bus bereitstellen. Das Verfahren kann folgende
Schritte beinhalten: Zuweisen eines virtuellen Adreßbereichs
für einen
Prozeß,
der auf einem Knoten des hierarchischen Busses abläuft, Ausführen einer
Datenanforderung an eine Adresse innerhalb des virtuellen Adreßbereichs, Übersetzen
der virtuellen Adresse in eine physikalische Adresse und Bestimmen,
ob die physikalische Adresse sich innerhalb eines Speicherbereichs
befindet, als global oder lokal bezeichnet ist. Wenn die physikalische
Adresse sich innerhalb eines Speicherbereichs befindet, der als
global bezeichnet ist, findet der Speicherzugriff unter Verwendung
einer globalen Adresse statt. Wenn die physikalische Adresse sich innerhalb
eines Abschnitts des Speichers befindet, der als lokal bezeichnet
ist, wird festgestellt, daß die physikalische
Adresse innerhalb des lokalen Speichers ist. Wenn die physikalische
Adresse sich innerhalb des lokalen Speichers befindet, findet der
Zugriff auf die physikalische Adresse unter Benutzung einer lokalen
Adreßpartition
statt. Wenn die physikalische Adresse sich nicht innerhalb des lokalen
Speichers befindet, findet ein Abfangvorgang in dem Betriebssystem
statt. Das Betriebssystem kann das Abfangen auf zahlreiche Arten
korrigieren. Zum Beispiel können
Daten von der physikalischen Adresse in den lokalen Speicher verschoben
werden. Alternativ kann die physikalische Adresse als globale Adresse
neu zugeordnet werden.
-
Im
Folgenden werden beispielhafte Ausführungsformen der Erfindung
beschrieben, und zwar nur als Beispiel und unter Bezug auf die beigefügten Zeichnungen,
wobei:
-
1 ein
Blockdiagramm eines Computersystems ist, daß einen hierarchischen Busaufbau
implementiert.
-
2 die
Aufteilung eines physikalischen Speichers auf die Knoten eines hierarchischen
Busses zeigt.
-
3 das
Abbilden eines physikalischen Speichers auf mehrere Adressenräume zeigt.
-
4 ein
Flußdiagramm
der Betriebsweise eines Betriebssystems gemäß einer Ausführungsform
der vorliegenden Erfindung ist.
-
5 ein
Flußdiagramm
der Betriebsweise eines Repeaters gemäß einer Ausführungsform
der vorliegenden Erfindung ist.
-
Ein
hierarchischer Bus enthält
eine Mehrzahl von Busebenen und Knoten. Eine Teilmenge der Gesamtanzahl
von Knoten ist jeweils an einen aus der Mehrzahl von Bussen niedriger
Ebene angeschlossen. Die Busse niedriger Ebene sind über Repeater an
Busse eines Levels um Eins höher
angeschlossen. Die Busse der höheren
Levels sind mit Bussen noch höheren
Levels über
noch mehr Repeater verbunden. Dieses Konzept erweitert sich natürlich selbst
auf so viele Ebenen der Bushierarchie wie nötig. Auf der höchsten Stufe
sind die Repeater über
einen Bus der höchsten
Ebene verbunden.
-
1 zeigt
eine Bushierarchie mit zwei Ebenen. 1 enthält die Knoten 130 bis 134 und
den Bus 128 der höchsten
Ebene. Der Knoten 130 enthält die Prozessoren 102 bis 106,
den Bus 116 niedriger Ebene, den Speicher 136 und
den Repeater 122. Die Prozessoren 102 bis 106,
der Repeater 122 und der Speicher 136 sind an
den Bus 116 niedriger Ebene angeschlossen. Die Prozessoren 102 bis 106 enthalten
einen Übersetzungs-Nachschlage-Puffer
(TLB) (auch als "Übersetzungsvorgriffs-Puffer" bezeichnet). Ein
TLB ist eine Einrichtung, die die zuletzt aufgerufenen Übersetzungen
virtueller in physikalischer Adressen speichert. Der Knoten 132 enthält die Prozessoren 108 bis 110,
den Bus 118 einer niedrigen Ebene, den Repeater 124 und
den Speicher 138. Die Pro zessoren 108 bis 110,
der Speicher 138 und der Repeater 124 sind an
den Bus 118 einer niedrigen Ebene angeschlossen. Die Prozessoren 108 bis 110 enthalten
einen Übersetzungs-Nachschlage-Puffer (TLB). Der
Knoten 134 enthält
die Prozessoren 112 bis 114, den Bus 120 einer
niedrigen Ebene, den Speicher 140 und den Repeater 126.
Die Prozessoren 112 bis 114, der Speicher 140 und
der Repeater 126 sind an den Bus 120 einer niedrigen
Ebene angeschlossen. Die Prozessoren 112 bis 114 enthalten einen Übersetzungs-Nachschlage-Puffer
(TLB).
-
Transaktionen
von jedem Prozessor werden auf dem Bus der niedrigen Ebene geleitet
und von den Repeatern über
den Bus der höchsten
Ebene zurück übertragen.
Die Repeater, die eine zurück übertragene
Transaktion empfangen, übertragen
die Transaktion weiter auf den angeschlossenen Bus der niedrigeren
Ebene, die von den angeschlossenen Prozessoren empfangen wird. Zum
Beispiel sendet Prozessor 102 eine Transaktion auf dem
Bus 116 niedriger Ebene. Der Repeater 122 überträgt die Transaktion
an die Repeater 124 und 126 zurück. Die Repeater 124 und 126 empfangen
die Transaktion über
den Bus 128 der höchsten
Ebene und übertragen
die Transaktion zurück
auf den Bussen 118 und 120 der niedrigen Ebene.
Die Prozessoren 108 bis 114 empfangen die Transaktion über die
Busse 118 und 120 der niedrigen Ebene.
-
In
einer Ausführungsform
wird eine lokale Transaktion zwischen zwei Einrichtungen in den
selben Knoten (zum Beispiel ein Prozessor und einem Speicher) nicht
global übertragen
(das heißt
nicht zu allen Knoten auf dem hierarchischen Bus). Die globale Übertragung
von lokalen Transaktionen reduziert unnötigerweise den Datendurchsatz
des Busses. Es ist offensichtlich, daß eine lokale Transaktion auf
andere Weise bestimmt werden kann als eine Transaktion zwischen
zwei Einrichtungen in dem selben Knoten. Beispielsweise können mehrere
Knoten zu einem Cluster zusammengefügt werden. Eine lokale Transaktion
in dieser Konfiguration würde
irgendeine Transaktion zwischen Knoten in dem selben Cluster von
Knoten sein. Eine globale Transaktion würde eine Transaktion zwischen
Clustern von Knoten sein. Die Cluster von Knoten bilden eine „lokale
Domäne", über die
lokale Transaktionen gesendet werden, während der Satz aus Clustern
eine "globale Domäne" bildet, über die
globale Transaktionen gesendet werden. Beispielsweise kann eine
Punkt zu Punkt-Verbindung zwischen den Repeatern 122 bis 126 und
einem höchsten
Repeater (nicht gezeigt) verwendet werden, um die Transaktion aus
dem höchsten
Repeater zu übertragen.
Der höchste
Repeater kann dann bestimmen, welcher Repeater 122 bis 126 die
Transaktion empfängt,
basierend auf der lokal/globalen Natur der Transaktion.
-
Indem
lokale Transaktionen nicht global versendet werden, können die
Transaktionen in einer effizienteren Weise abgeschlossen werden,
als wenn diese Transaktionen rundgesendet werden. Die lokalen Transaktionen
hängen
nur von den Reaktionen der anderen Prozessoren innerhalb der „lokalen
Domäne" ab, während globale
Transaktionen von allen Prozessoren innerhalb des Computersystems,
wie in 1 gezeigt, abhängig
sind. Beispielsweise können die
Busse 116 bis 129 niedriger Ebene Nachforschungsprotokolle
verwenden, um die Cachekohärenz
aufrecht zu erhalten. Das Rundsenden einer Transaktion an einen
nicht-lokalen Bus einer niedrigen Ebene, kann eine Transaktion auf
einem Bus 128 einer höheren
Ebene mit sich bringen, gefolgt von einem Rundsenden an Busse 115 bis 120 einer
niedrigen Ebene, gefolgt von einer anderen Transaktion auf dem Bus 128 einer
hohen Ebene um die Nachforschungsantwort auf einen auslösenden Bus
einer niedrigen Ebene weiterzuleiten. Auf der anderen Seite sammelt
eine lokale Transaktion einfach Antworten der Busse niedriger Ebenen,
an die sie gekoppelt ist. Weiterhin können lokale Transaktionen innerhalb der
mehrfachen lokalen Domänen
gleichzeitig ausgeführt
werden. Zusätzlich
bleibt Bandbreite auf dem Bus 128 einer hohen Ebene erhalten.
-
Gemäß 2 ist
ein Diagramm dargestellt, welches die Zuweisung des physikalischen
Speichers oder Systemspeichers entlang der Knoten des Systems mit
Parallelverarbeitung zeigt. In einer Ausführungsform wird der physikalische
Speicher gleichmäßig unter
den Prozessorenknoten aufgeteilt. Dadurch erhält jeder der n Prozessoren
den (1/n)ten Teil der gesamten physikalischen Speicherstellen. Wie
in 2 dargestellt, wird der physikalische Speicher 202 in
einem Mehrprozessorensystem mit drei Knoten in drei lokale Speicher
aufgeteilt. Der Speicher 136, ein Drittel des physikalischen
Speichers, ist dem Knoten 130 zugeordnet. Der Speicher 138,
ebenfalls ein Drittel des physikalischen Speichers 202,
ist dem Knoten 132 zugeordnet. Der Speicher 140 ist
dem Knoten 134 zugeordnet. Es ist offensichtlich, daß ein System
mit Parallelverarbeitung den Speicher in verschiedenen Größenverhältnissen
zwischen den Knoten zuweisen kann. Genauer gesagt könnte Knoten 130 einen
ersten Speicherumfang enthalten, der von einem zweiten Speicherumfang
in Knoten 132 und einem dritten Speicherumfang in Knoten 134 verschieden
ist, etc.
-
Gemäß 3 ist
jeder lokale Speicher (das heißt
der Speicher der einem Prozessorenknoten zugewiesen ist) auf mehrere
Stellen innerhalb des Adreßraums 302 abgebildet.
Der Adreßraum 302 besteht
aus mehreren Adreßpartitionen.
Auf jede physikalische Speicherstelle kann zugegriffen werden, indem
eine Vielzahl von Aliasadressen verwendet wird (das heißt eine
von jeder Partition). In einer Ausführungsform enthält der Adreßraum 302 vier
Adreßpartitionen:
den SMP-Raum 304 (SS), den lokalen Raum 306 (LS),
den lesbaren, entfernt gelegenen Raum 308 (RR) und den
entfernt gelegenen Raum 310 (RS). Jeder Adreßpartition
sind Eigenschaften zugewiesen, die die Repeater 122 bis 126 verwenden,
um den Datentransfer in dem hierarchischen Busaufbau zu steuern.
-
Die
Eigenschaften jeder Adreßpartition
werden nachstehend noch genauer erläutert. SS 304 ist der
globale Adreßraum,
oder die globale Partition. Die Aliasadressen in dieser Adreßpartition
werden global auf dem hierarchischen Bus versendet. Deswegen sollten
Zugriffe auf eine physikalische Speicherstelle, die nicht innerhalb
des lokalen Adreßraumes
eines Knotens liegt, eine SS-Aliasadresse
benutzten, um auf solche Speicherstellen zuzugreifen. Zusätzlich sollten
Zugriffe auf einen lokalen Speicherraum, ausgewiesen als globaler
Speicher, eine SS-Aliasadresse benutzten. Ein lokaler Speicher kann
als globaler Speicher ausgezeichnet sein, wenn ein Prozeß auf einem
anderen Knoten Zugriff auf diesen Speicher erfordert.
-
Die
Adreßpartition
LS 306 ist die lokale Adreßpartition. Die Knoten können nur
Aliasadressen von LS 306 verwenden, um auf den Abschnitt des
Speichers zuzugreifen, der diesem Knoten zugewiesen ist (das heißt den lokalen
Speicher). Im Allgemeinen kann die LS Adreßpartition benutzt werden, um
auf Adressen innerhalb der lokalen Domäne des Knotens, die andere
Knoten enthalten kann, zuzugreifen. Ein Zugriff auf eine physikalische
Speicherstelle, die nicht auf dem Knoten liegt und die eine Aliasadresse
verwendet, bewirkt ein Abfangen (trap), wenn eine Seitentabelle
durchge sehen wird oder ein TLB Zugriff ausgeführt wird. Das Abfangen kann
erreicht werden, wenn das System eine Struktur mit einer Seitentabelle
pro Prozessor oder einer Seitentabelle pro Knoten hat. LS-Adressen
werden für
eine Übersetzung
nur in den Seitentabellen für
den lokalen Knoten oder den lokalen Prozessoren bereitgestellt.
Deswegen gibt es keine Übersetzung
in der Übersetzungsstruktur
eines entfernt gelegenen Prozessors.
-
Die
Adreßpartition
RR 308 wird benutzt um Daten von einer entfernt gelegenen
Adresse zu lesen. In einer Ausführungsform
könnten
Prozesse, die auf einem Knoten laufen, RR 308 benutzen
um eine Lesestromtransaktion von einer entfernt gelegenen Adresse
auszuführen.
Der Lesestrom ist eine Transaktion, die als Antwort auf eine Anweisung
verarbeitet wird, die von der SPARC-Architektur definiert wird, um Daten
in den Prozessor zu übertragen,
ohne die Daten in den Cachespeicher aufzunehmen. In ähnlicher
Weise wird die Adreßpartition
RS 310 benutzt, um die Lesestrom- und Schreibstromanweisungen an
einen entlegenen Speicher auszuführen.
Der Schreibstrom ist eine Anweisung, die von der SPARC-Architektur
definiert wird um Daten von dem Prozessor zu übertragen ohne die Daten in
den Cachespeicher aufzunehmen.
-
Die
Adreßpartitionen
werden verwendet, um den Datenfluß in einem Computersystem mit
hierarchischem Bus zu beschränken
und zu kontrollieren. Die Repeater entscheiden, ob eine Transaktion
auf einen Bus einer höheren
Ebene gesendet wird oder ob er auf eine niedrige Ebene, basierend
auf der Adreßpartition
der Transaktion, beschränkt
wird. Wenn zum Beispiel Knoten 130 versuchen würde Daten,
die in einer Speicherstelle gespeichert sind, die dem Knoten 134 zugewiesen
ist, zu adressieren bzw. anzusprechen, sollte eine SS Aliasadresse
verwendet werden, um auf die Daten zuzugreifen. Wenn der Repeater 122 eine
Transaktion mit einer SS Aliasadresse empfängt, sendet er die Transaktion
auf den Bus 128 der höchsten
Ebene. Wenn Knoten 130 im Gegensatz dazu versucht auf eine
Speicherstelle zuzugreifen, die auf dem Knoten 130 angesiedelt
ist, der nicht mit anderen Knoten gemeinsam verwendet wird, sollte
eine LS Aliasadresse benutzt werden. Wenn der Repeater 122 eine
LS Aliasadresse empfängt,
sendet er die Daten nicht an den Bus 128 der höchsten Ebene.
Daher sind der Bus 128 der höchsten Ebene und die lokalen
Busse 118 und 120 frei, um andere Transaktionen
zu verarbeiten. Auf diese Weise wird der Datendurchfluß des hierarchischen Bus
gesteigert.
-
Ein
Problem ergibt sich, wenn ein Prozeß von einem Knoten in der Multiprozessorenarchitektur zu
einem anderen Knoten migriert. Prozeßmigration tritt auf, wenn
ein Prozeß,
der ursprünglich
einem Knoten zugewiesen ist, ausgesetzt und später einem anderen Knoten wieder
zugewiesen wird. Der Speicher, der für den Prozeß lokal war, als er ursprünglich zugewiesen
wurde, ist möglicherweise
kein lokaler Speicher mehr. Wenn zum Beispiel ein Prozeß ursprünglich dem
Knoten 130 zugewiesen wurde und später dem Knoten 134 wieder
zugewiesen wird, ist das, was ursprünglich der lokale Speicher
des Prozesses war, nunmehr entfernt gelegen (das heißt einem
anderen Knoten zugeordnet). Der Prozeß jedoch weiß nicht,
daß die
Speicherstelle nicht mehr lokal ist. Wenn der Prozeß versucht
auf eine lokale Speicherstelle auf Knoten 130 zuzugreifen,
indem er eine LS Aliasadresse benutzt, erfolgt ein Abfangen. Das
Abfangen wird bewirkt durch den Versuch, eine virtuelle Adresse
unter Verwendung der Seitentabellenstruktur des Knotens zu übersetzen, dem
der Prozeß nunmehr
zugeordnet ist. Die Seitentabellenstruktur enthält jedoch keine Übersetzungen,
die für Adressen
in dem LS Raum innerhalb eines anderen Knotens vorgesehen sind.
Ein Abfangen überträgt die Kontrolle
an das Betriebssystem. Das Betriebssystem verschiebt die Daten,
auf die ein Zugriff versucht wurde, von dem Knoten 130 auf
den Knoten 134, unter Verwendung der RR 308 Aliasadressen und
lokaler (LS) Schreibvorgänge.
Auf den Speicher kann dann unter der Verwendung einer LS Aliasadresse
zugegriffen werden. Die Verwendung eines hierarchischen Affinitätsplaners,
der die Migration von Prozessen von einem Knoten zu einem anderen verringert,
kann das Auftreten der Verschiebungen von Datenblöcken von
einem Knoten zu einem anderen minimieren.
-
Eine
Alternative zu dem Kopieren der Daten von einem Knoten zu einem
anderen besteht darin, die Übersetzung
der Adresse von lokal zu global zu ändern. Beispielsweise können die
folgenden Prozesse verwendet werden:
- (1) Ungültig machen
der lokalen Übersetzungen in
allen Übersetzungstabellen;
- (2) Ungültig
machen der Übersetzungen
in den TLBs (zum Beispiel Ausführen
eines TLB-Shootdowns);
- (3) Spülen
aller Cachezeilen innerhalb der Seite für alle Prozessoren in dem lokalen
Knoten; und
- (4) Erstellen einer neuen, globalen Übersetzung für die Seite.
-
Gemäß 4 ist
ein Flußdiagram
dargestellt, welches einen Teil der Betriebsweise des Betriebssystems
gemäß einer
Ausführungsform
der vorliegenden Erfindung zeigt. Der in 4 gezeigte Abschnitt
stellt die Aktivitäten
dar, die ausgeführt
werden, wenn eine Seite des Speichers einem Prozeß zugewiesen
wird. Eine Seite kann durch eine ausdrückliche Anforderung des ausgeführten Prozesses zugeordnet
werden. Alternativ kann eine bestimmte Anzahl von Seiten automatisch
durch die Initiation eines Prozesses zugeordnet werden.
-
Während eines
Schritts 400 wählt
das Betriebssystem eine Seite für
die Zuordnung zu dem Prozeß aus.
Allgemein führt
das Betriebssystem eine Liste von „freien" Seiten (das heißt solche Seiten, die aktuell
keinem Prozeß zugeordnet
sind). Eine der freien Seiten wird dem Prozeß zugeordnet. Wenn keine Seiten
frei sind, sucht das Betriebssystem eine aktuell zugeordnete Seite
aus, hebt die Zuordnung dieser Seite zu dem Prozeß auf, welchem
sie zugeordnet war (einschließlich
dem Speichern der Daten innerhalb der Seite auf das Laufwerk und
dem Ungültig
machen der Übersetzung
der Seite), und weist die Seite dem anforderndem Prozeß zu. Viele
Algorithmen sind wohlbekannt für
das Auswählen
der zugeordneten Seiten für
die Neuzuordnung zu einem neuen Prozeß, allgemein bekannt als Algorithmus
mit Seitenzuweisung nach Bedarf.
-
Nach
der Auswahl einer Seite, um sie dem Prozeß zuzuweisen, bestimmt das
Betriebssystem, ob die Seite als global oder lokal zugewiesen wird (Schritt 402).
Es kann eine Vielfalt an Algorithmen verwendet werden, um lokal
oder global auszuwählen.
Wie unten genauer beschrieben, bezieht ein Schema die zugewiesenen
Seiten als anfangs lokal mit ein und wechselt dann die Zuweisung
auf global, aufgrund des Auftauchens eines Abfangens während des
Versuchs, auf diese Seite zuzugreifen. Ein anderes Schema verwendet
die Zuordnung von Seiten anfänglich
als global und bestimmt später,
welche Seiten nach lokal zu ändern
sind, basierend auf der Verwendung der Seite in verschiedenen Knoten.
Es ist darauf hinzuweisen, daß jedes
passende bzw. geeignete Schema eingesetzt werden kann.
-
Wenn
eine Seite als global bestimmt ist, dann erzeugt (wie in Schritt 404 gezeigt)
das Betriebssystem eine globale Adreßübersetzung (das heißt eine Übersetzung
in eine Adresse innerhalb des SS Raums 304, des RR Raums 308 oder
des RS Raums 310). Wenn die Struktur der Seitentabelle,
die von dem Computersystem verwendet wird, derart ist, daß jeder
Prozessor oder jeder Knoten seine eigene Seitentabellenstruktur
hat, wird die Übersetzung
in alle Seitentabellenstrukturen plaziert. Alternativ kann das Betriebssystem
bestimmen, daß die
Seite lokal sein soll. Wie in Schritt 406 gezeigt, erzeugt
das Betriebssystem eine lokale Übersetzung
die nur innerhalb der lokalen Domäne verfügbar ist. In der beispielhaften
Seitentabellenstruktur die oben beschriebenen wurde, ist die Übersetzung
nur in der Seitentabellenstruktur des Knotens, der den Speicher
enthält,
angeordnet. Wenn die Prozessoren in anderen Knoten versuchen, auf
die Adresse zuzugreifen, wird in ihren Seitentabellenstrukturen
keine Übersetzung zu
finden sein und es wird ein Abfangen auftreten.
-
Gemäß 5 ist
ein Flußdiagram
dargestellt, daß die
Betriebsweise eines Repeaters 122 bis 126 gemäß einer
Ausführungsform
der vorliegenden Erfindung zeigt. Während eines Schritts 500 erfaßt der Repeater
eine Adresse einer Transaktion, die auf dem korrespondierenden Bus
einer niedrigen Ebene vorgelegt wird. Wie in Schritt 502 dargestellt,
bestimmt der Repeater ob die Adresse lokal oder global ist, indem
er feststellt, welche der in 3 gezeigten Adreßpartitionen
die Adresse enthält.
-
Wenn
die Adresse innerhalb einer lokalen Adreßpartition ist (zum Beispiel
der LS Adreßpartition 306 für den Adreßraum, der
in 3 gezeigt ist), dann überträgt der Repeater die Transaktion
nicht auf andere Repeater. Wie in Schritt 504 dargestellt schließt der Repeater
die Transaktion innerhalb des lokalen Knotens ab. Alternativ kann
die Adresse innerhalb einer globalen Adreßpartition liegen (z.B. der SS
Adreßpartition 304,
der RR Adreßpartition 308 oder
der RS Adreßpartition 310 für den Adreßraum, der
in 3 gezeigt ist). Wie in Schritt 506 dargestellt,
sendet der Repeater die Transaktion an andere Knoten. Die Transaktion
wird anschließend,
basierend auf den Antworten von allen Knoten, nicht nur von dem
lokalen Knoten, abgeschlossen (Schritt 508).
-
Ein
hierarchischer Bus, der die vorliegende Erfindung implementiert,
hat das Potential, einen höheren
Durchsatz zu erreichen, weil das Zugreifen auf die Daten unter Benutzung
einer LS Aliasadresse nur lokalen Busverkehr verursacht. Der hierarchische Bus
realisiert einen echten gemeinsam verwendeten Speicher und erhöht potentiell
den Datendurchsatz des Systems um einige Faktoren.
-
Es
ist von Vorteil, die Bestimmung des Speichers als global oder lokal
zu ändern.
Wenn zum Beispiel zwei Prozesse beide auf eine Seite von Daten zugreifen,
die als lokaler Speicher bezeichnet ist, wird die Seite unter Verwendung
einer RR Aliasadresse von einem Knoten auf einen anderen Knoten verschoben,
und zwar jedes Mal, wenn ein anderer Prozeß auf sie zugreift. In diesem
Fall wäre
es von Vorteil, diese Seite von Daten als global zu bezeichnen.
Zusätzlich
verschwendet eine Seite, auf die von einem Prozeß zugegriffen wird und die
nur als ein globaler Speicher ausgezeichnet ist, überflüssigerweise
Bandbreite. Da die Anzahl von Prozessen, die auf einen Speicherblock
zugreifen sich ändert,
ist ein Verfahren zum dynamischen Verändern der Bezeichnung von Speicherblöcken wünschenswert.
-
Verschiedene
Algorithmen können
für den dynamischen
Wechsel der Bezeichnung von Speichern benutzt werden. In einer Ausführungsform
sind alle Seiten ursprüngliche
als lokal bestimmt und ein Zähler
verfolgt, wie oft eine Seite verschoben wurde, aufgrund der ungeeigneten
Zugriffe unter Verwendung der LS Aliasadressen. Wenn ein Schwellwert erreicht
wurde, wird die Seite nach global konvertiert und es sind keine
Blockverschiebungen mehr erforderlich. In einer anderen Ausführungsform
startet jede Seite mit einer globalen Bestimmung. Die Seiten werden
nacheinander individuell auf lokal umgestellt. Die Seiten werden
dann zurück
nach global konvertiert, indem der oben beschriebene Algorithmus
verwendet wird. In einer anderen Alternative können die Seiten anfänglich auf
lokal gesetzt werden und in global geändert werden, wenn ein Abfangen
auftritt.
-
In
einer speziellen Ausführungsform
werden Adreßpartitionen
verwendet, um zu verhindern, daß ein
Software Bug in einem Knoten Daten in einem anderen Knoten beschädigt. In
dieser Ausführungsform werden
nur LS 306 und RR 308 Adreßpartitionen verwendet. Dies
wird umgesetzt in dem die Repeater 122 bis 124 so
konfiguriert werden, daß nur
RR Aliasadressen gesendet werden. Jeder Knoten betreibt seinen eigenen
Kernel des Betriebssystems. Ein Kernel ist ein Abschnitt des Betriebssystems
der einen Kern der grundlegenden Funktionen des Betriebssystems
umfaßt.
Jeder Kernel ist in dem lokalen Speicher des betreffenden Knotens
ansässig
und ist als ein lokaler Speicherraum bestimmt. Dadurch können Knoten
auf den Kernel eines anderen Knotens nur unter Verwendung von Nur-Lese-Befehlen
zugreifen. Wenn ein Prozeß auf
einem Knoten versucht auf den Kernel eines anderen Knotens zuzugreifen, sendet
der Repeater die Datenanforderung nicht. Auf den Kernel kann von
fern gelegenen Knoten nur unter Verwendung von RR(Nur-Lese-)Aliasadressen zugegriffen
werden. Auf diese Weise kann ein Software Bug, der auf einem Knoten
abläuft,
nicht den Kernel oder irgendwelche Anwendungen, die auf anderen
Knoten ablaufen, zerstören.
-
Jegliche
Kommunikation zwischen den Knoten wird in einer abfragegestützten Weise
ausgeführt. Jeder
Knoten benennt eine Speicherstelle, um Statusbits zu speichern,
die anzeigen, daß der
Knoten Daten für
einen Prozeß hat,
der auf einem anderen Knoten abläuft.
Die anderen Prozesse fragen diese Statusbits regelmäßig ab unter
der Verwendung von RR Aliasadressen, die nur gelesen werden. Wenn
ein Prozeß erkennt,
daß ein
anderer Knoten Daten für diesen
Prozeß hat,
werden die Daten unter Verwendung RR Aliasbezeichnungen gelesen.
Auf diese Weise werden die Daten zwischen den Knoten übertragen,
ohne daß ein
Knoten Schreibzugriff auf einen anderen Knoten hat. Dadurch ist
beschädigte
Software in einem Knoten nicht in der Lage, Daten in anderen Knoten
in dem hierarchischem Bus zu schreiben, und beschädigte Software
auf einem Knoten kann die Software in anderen Knoten nicht beschädigen. Alternativ
können,
anstelle des Schemas auf Abfragebasis, globale Interrupts zwischen
den Prozessoren unterstützt
werden.