DE69726795T2 - Kodierungsverfahren des Verzeichnisstatus in einem gemeinsamen, verteilten Speichersystem mit koherenten Pufferspeichern - Google Patents

Kodierungsverfahren des Verzeichnisstatus in einem gemeinsamen, verteilten Speichersystem mit koherenten Pufferspeichern Download PDF

Info

Publication number
DE69726795T2
DE69726795T2 DE69726795T DE69726795T DE69726795T2 DE 69726795 T2 DE69726795 T2 DE 69726795T2 DE 69726795 T DE69726795 T DE 69726795T DE 69726795 T DE69726795 T DE 69726795T DE 69726795 T2 DE69726795 T2 DE 69726795T2
Authority
DE
Germany
Prior art keywords
cache line
status
shared
directory
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
DE69726795T
Other languages
English (en)
Other versions
DE69726795D1 (de
Inventor
Aleksandr Guzovskiy
Jr. Robert C. Zak
Mark Bromley
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Microsystems Inc
Original Assignee
Sun Microsystems Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Application granted granted Critical
Publication of DE69726795D1 publication Critical patent/DE69726795D1/de
Publication of DE69726795T2 publication Critical patent/DE69726795T2/de
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/0815Cache consistency protocols
    • G06F12/0817Cache consistency protocols using directory methods
    • G06F12/0826Limited pointers directories; State-only directories without pointers
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0806Multiuser, multiprocessor or multiprocessing cache systems
    • G06F12/084Multiuser, multiprocessor or multiprocessing cache systems with a shared cache
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/16Handling requests for interconnection or transfer for access to memory bus
    • G06F13/1605Handling requests for interconnection or transfer for access to memory bus based on arbitration
    • G06F13/1652Handling requests for interconnection or transfer for access to memory bus based on arbitration in a multiprocessor architecture
    • G06F13/1663Access to shared memory
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • G06F15/163Interprocessor communication
    • G06F15/167Interprocessor communication using a common memory, e.g. mailbox

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Software Systems (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Description

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

Claims (8)

  1. Vorrichtung für ein Verzeichnissystem zum Leiten von Anforderungen nach Cachezeilenzugriffen von Prozessoren (6, 7, 8, 9) in einem Mehrprozessorsystem mit einem gemeinsam verwendeten Speichersystem, wobei jeder der Prozessoren einen Cachespeicher (10, 11, 12, 13) hat und jeder der Caches Cachezeilen speichert, wobei jede Cachezeile sich im Besitz eines Prozessors befindet und für die gemeinsame Verwendung durch alle Prozessoren in dem Mehrprozessorsystem verfügbar ist, wobei die Vorrichtung für das Verzeichnissystem aufweist: ein Verzeichnis (14, 24, 30) der Zustände der Cachezeilen, welches dafür ausgelegt ist, einen Zustandswert zu speichern, der ein gemeinsam verwendetes Zustandswort einer Cachezeile kennzeichnet, eine Cachezeilentabelle (22, 36, 5), die dafür ausgelegt ist, eine Mehrzahl von Zustandsworten (CLSS) einer gemeinsamen Cachezeilenverwendung zu einer Cachezeile zu speichern sowie einen Zustandwert (SV), welcher jedem Zustandswort einer gemeinsamen Cachezeilenverwendung entspricht, wobei jedes der Zustandsworte einen besitzenden Prozessor (OWNER) sowie einen Zustand (S1 ... S8) des Zugriffs an einen oder mehrere zusätzliche Prozessoren anzeigt, und einen Zustandswertdecoder (32), der auf einen Zustandswert (SV) reagiert, welcher von dem Cachezeilenzustandsverzeichnis (14, 24, 30) empfangen wurde, wobei der Decoder dafür ausgelegt ist, ein Tabellennachschlagen in der Cachezeilentabelle (22, 36, 5) auf der Basis des empfangenen Zustandswertes (SV) durchzuführen, um den Zustandswert in das entsprechende Zustandswort der gemeinsamen Cachezeilenverwendung (CLSS) zu decodieren, und zwar für die Verwendung durch das Cachezeilenverzeichnissystem, um die Cachezeile in jedem der Caches zu identifizieren, dadurch gekennzeichnet, daß die Vorrichtung weiterhin aufweist: einen Zustandswertcodierer (34), der auf ein empfangenes Zustandswort (CLSS) der gemeinsamen Cachezeilenverwendung reagiert, wobei der Codierer dafür ausgelegt ist, den Tabellennachschlag in der Cachezeilentabelle (22, 36, 5) auf der Basis des empfangenen Zustandswortes (CLSS) der gemeinsamen Cachezeilenverwendung durchzuführen, um das Zustandswort der gemeinsamen Cachezeilenverwendung in einen entsprechenden Zustandswert (SV) zu codieren, und den entsprechenden Zustandswert in dem Cachezeilenzustandsverzeichnis zu speichern.
  2. Vorrichtung nach Anspruch 1, wobei jede Cachezeile ein in einem Cache gespeicherter Datenblock ist, der Zustandswert ein n-Bit Wort ist, und die Cachezeilentabelle eine Kapazität hat, um 2n-Einträge von Zustandsworten der gemeinsamen Cachezeilenverwendung mit ihrem entsprechenden Zustandswert zu speichern.
  3. Vorrichtung nach Anspruch 2, wobei die Cachezeilentabelle eine geordnete Liste von 2n–1 Zustandsworten der gemeinsamen Cachezeilenverwendung und ihre entsprechenden Zustandswerte speichert und ein Eintrag einen Zustandswert enthält, um einen Zustand des Entweichens für Zustandsworte der gemeinsamen Cachezeilenverwendung zu kennzeichnen bzw. zu identifizieren, die in der Liste nicht enthalten sind.
  4. Vorrichtung nach Anspruch 3, wobei die geordnete Liste eine Liste von Zustandsworten der gemeinsamen Cachezeilenverwendung ist, welche die höchste Signifikanz für das Mehrprozessorsystem haben.
  5. Verfahren zum Leiten von Zugriffsanforderungen auf Cachezeilen von Prozessoren (6, 7, 8, 9) in einem Mehrprozessorsystem mit einem gemeinsam verwendeten Speichersystem, wobei jeder der Prozessoren einen Cache (10, 11, 12, 13) hat, und jeder der Caches Cachezeilen speichert, jede Cachezeile im Besitz eines Prozessors ist und für die gemeinsame Verwendung durch andere Prozessoren in dem Mehrprozessorsystem verfügbar ist, wobei das Verfahren die computerimplementierten Schritte aufweist: Speichern einer Mehrzahl von Zustandsworten (CLSS) der gemeinsamen Cachezeilenverwendung in einer Cachezeilentabelle (22, 36, 5) und Speichern eines zugehörigen Zustandswertes (SV), welcher jedem Zustandswort der gemeinsamen Cachezeilenverwendung entspricht, das in der Tabelle gespeichert ist, wobei jedes der Zustandsworte dem einen oder den mehreren zusätzlichen Prozessoren einen besitzenden Prozessor (OWNER) und einen Zustand (S1 ... S8) des Zugriffs anzeigt, Codieren (34) eines empfangenen Zustandswortes (CLSS) der gemeinsamen Cachezeilenverwendung in einen entsprechenden Zustandswert (SV) durch Ausführen eines Tabellennachschlagens in der Cachezeilentabelle auf der Basis des empfangenen Zustandswortes (CLSS) der gemeinsamen Cachezeilenverwendung, um das Zustandswort der gemeinsamen Cachezeilenverwendung in einen Zustandswert (SV) zu codieren, wobei das Zustandswort der gemeinsamen Cachezeilenverwendung den Prozessor identifiziert bzw. kennzeichnet, welcher die Cachezeile besitzt, sowie die Prozessoren, die gemeinsam einen Zugriff auf die Cachezeile haben, Speichern des Zustandswertes (SV) in einem Cachezeilenverzeichnis, Decodieren (32) des Zustandswertes aus dem Cachezeilenverzeichnis in ein Zustandswort (CLSS) der gemeinsamen Cachezeilenverwendung, indem das Nachschlagen in einer Tabelle auf der Basis des Zustandswertes (SV) in der Cachezeilentabelle durchgeführt wird, um den Zustandswert zu einem Zustandswort (CLSS) der gemeinsamen Cachezeilenver wendung zu decodieren für die Verwendung durch das Cachezeilenverzeichnissystem beim Identifizieren der Cachezeile in jedem der Caches.
  6. Verfahren nach Anspruch 5, wobei der Zustandwert ein n-Bitwort ist und die Cachezeilentabelle eine Kapazität für Einträge hat, um 2n-Einträge Zustandsworten der gemeinsamen Cachezeilenverwendung mit ihrem zugehörigen Zustandswert zu speichern.
  7. Verfahren nach Anspruch 6, wobei die Cachezeilentabelle eine geordnete Liste von 2n–1 Zustandsworten der gemeinsamen Cachezeilenverwendung und deren zugehörige Zustandswerte speichert, sowie einen Eintrag, der einen Zustandswert enthält, um einen Vorgang des Entweichens für Zustandsworte der gemeinsamen Cachezeilenverwendung zu identifizieren, welche in der Liste nicht enthalten sind.
  8. Verfahren nach Anspruch 7, wobei die geordnete Liste eine Liste von Zustandsworten der gemeinsamen Cachezeilenverwendung ist, welche für das Mehrprozessorsystem die höchste Wertigkeit haben.
DE69726795T 1996-07-01 1997-06-23 Kodierungsverfahren des Verzeichnisstatus in einem gemeinsamen, verteilten Speichersystem mit koherenten Pufferspeichern Expired - Fee Related DE69726795T2 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US08/672,946 US5752258A (en) 1996-07-01 1996-07-01 Encoding method for directory state in cache coherent distributed shared memory system
US672946 1996-07-01

Publications (2)

Publication Number Publication Date
DE69726795D1 DE69726795D1 (de) 2004-01-29
DE69726795T2 true DE69726795T2 (de) 2004-11-04

Family

ID=24700678

Family Applications (1)

Application Number Title Priority Date Filing Date
DE69726795T Expired - Fee Related DE69726795T2 (de) 1996-07-01 1997-06-23 Kodierungsverfahren des Verzeichnisstatus in einem gemeinsamen, verteilten Speichersystem mit koherenten Pufferspeichern

Country Status (5)

Country Link
US (1) US5752258A (de)
EP (1) EP0817063B1 (de)
JP (1) JPH113278A (de)
KR (1) KR980010788A (de)
DE (1) DE69726795T2 (de)

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5991819A (en) * 1996-12-03 1999-11-23 Intel Corporation Dual-ported memory controller which maintains cache coherency using a memory line status table
US5860120A (en) * 1996-12-09 1999-01-12 Intel Corporation Directory-based coherency system using two bits to maintain coherency on a dual ported memory system
US6633958B1 (en) * 1997-11-17 2003-10-14 Silicon Graphics, Inc. Multiprocessor computer system and method for maintaining cache coherence utilizing a multi-dimensional cache coherence directory structure
US6826651B2 (en) * 1998-05-29 2004-11-30 International Business Machines Corporation State-based allocation and replacement for improved hit ratio in directory caches
US6751698B1 (en) * 1999-09-29 2004-06-15 Silicon Graphics, Inc. Multiprocessor node controller circuit and method
KR100700510B1 (ko) * 2000-01-04 2007-03-28 엘지전자 주식회사 공유 메모리 다중 프로세서 시스템 및 이를 위한 디렉토리압축방법
US6711662B2 (en) * 2001-03-29 2004-03-23 Intel Corporation Multiprocessor cache coherence management
US7082500B2 (en) * 2003-02-18 2006-07-25 Cray, Inc. Optimized high bandwidth cache coherence mechanism
US7757047B2 (en) * 2005-11-12 2010-07-13 Oracle America, Inc. Missing store operation accelerator
US7774551B2 (en) * 2006-10-06 2010-08-10 Hewlett-Packard Development Company, L.P. Hierarchical cache coherence directory structure
US8719500B2 (en) * 2009-12-07 2014-05-06 Intel Corporation Technique for tracking shared data in a multi-core processor or multi-processor system
WO2013101123A1 (en) * 2011-12-29 2013-07-04 Intel Corporation Recovering from errors using implicit redundancy
KR101446924B1 (ko) * 2013-02-12 2014-10-06 한국과학기술원 일관성 관리 방법, 일관성 관리 회로, 이를 포함하는 캐시 장치 및 반도체 장치
US9639474B2 (en) 2013-03-15 2017-05-02 Nvidia Corporation Migration of peer-mapped memory pages
WO2018063266A1 (en) * 2016-09-30 2018-04-05 Intel Corporation Object coherence in distributed shared memory systems
US11954034B2 (en) 2022-03-28 2024-04-09 Woven By Toyota, Inc. Cache coherency protocol for encoding a cache line with a domain shared state

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5230070A (en) * 1989-09-08 1993-07-20 International Business Machines Corporation Access authorization table for multi-processor caches
US5265232A (en) * 1991-04-03 1993-11-23 International Business Machines Corporation Coherence control by data invalidation in selected processor caches without broadcasting to processor caches not having the data
US5426754A (en) * 1992-05-26 1995-06-20 International Business Machines Corporation Cross-interrogate method and means for combined scaler and vector processing system

Also Published As

Publication number Publication date
EP0817063A3 (de) 1999-01-27
US5752258A (en) 1998-05-12
EP0817063B1 (de) 2003-12-17
DE69726795D1 (de) 2004-01-29
JPH113278A (ja) 1999-01-06
EP0817063A2 (de) 1998-01-07
KR980010788A (ko) 1998-04-30

Similar Documents

Publication Publication Date Title
DE69726795T2 (de) Kodierungsverfahren des Verzeichnisstatus in einem gemeinsamen, verteilten Speichersystem mit koherenten Pufferspeichern
DE2226382C3 (de) Datenverarbeitungsanlage mit mehreren Prozessoren und diesen zugeordneten Pufferspeichern
DE3586389T2 (de) Dynamisch zugeordnete lokale/globale speicheranordnung.
DE10232926B4 (de) Verfahren zum Aufrechterhalten der Kohärenz in einer hierarchischen Cacheanordnung eines Computersystems
DE3621321A1 (de) Cache-speicher- bzw. multiprozessor-system und betriebsverfahren
DE69828813T2 (de) Mehrdimensionale struktur eines cachekohärenzverzeichnisses
DE68924206T2 (de) Verfahren und Einrichtung zum Filtern von Ungültigkeitserklärungsanforderungen.
DE3782335T2 (de) Speichersteuersystem.
DE102007052853B4 (de) Zeilentauschschema zur Verringerung von Rückinvalidierungen in einem Snoopfilter
DE3805107A1 (de) Verfahren und vorrichtung zur steuerung virtueller adressraeume eines virtuellen speichers
DE10219623A1 (de) System und Verfahren zur Speicherentscheidung unter Verwendung von mehreren Warteschlangen
DE68928454T2 (de) Multiprozessorsystem mit hierarchischer cachespeicheranordnung
DE102007048601A1 (de) Datenspeicherung in einem Schaltsystem, das mehrere Prozessoren eines Computersystems koppelt
DE69806855T2 (de) Ersetzungszähler für Maschine mit nichtuniformen Speicherzugriffen
DE69721641T2 (de) Verfahren und Vorrichtung für ein verzeichnisloses Speicherzugriffsprotokoll in einem Rechnersystem mit verteiltem gemeinsamen Speicher
DE69724879T2 (de) Verfahren und Vorrichtung für einen Kohärenzumwandler zur Verbindung von Rechnersystemkohärenzdomänen
DE102006030879A1 (de) System zum Reduzieren der Latenzzeit von exklusiven Leseanforderungen in einem symmetrischen Multiprozessorsystem
DE2758829A1 (de) Multiprozessor-datenverarbeitungssystem
DE2117581C3 (de) Einrichtung zur Adressenprüfung
DE112019000627T5 (de) Speicherstrukturbasiertes Coherency Directory Cache
DE3887843T2 (de) Verfahren zur Bedienung einer Mehrprozessoranordnung zur Datenübertragung zwischen Prozessoreinheiten.
DE69808628T2 (de) Mikroprozessorcachespeicherübereinstimmung
DE69724533T2 (de) Durchschreiboperation mit Stufenumgehung in einem mehrstufigen Speicher eines Rechnersystems
DE69810098T2 (de) Leseoperationen in einem multiprozessorrechnersystem
DE2311503A1 (de) Datenverarbeitungsanlage mit mehreren zentraleinheiten

Legal Events

Date Code Title Description
8364 No opposition during term of opposition
8339 Ceased/non-payment of the annual fee