-
Hintergrund
-
Techniken zur Datenreduzierung können angewandt werden, um die Menge der in einem Speichersystem gespeicherten Daten zu verringern. Ein Beispiel für ein Datenreduktionsverfahren ist die Datendeduplizierung. Bei der Datendeduplizierung werden doppelte Dateneinheiten identifiziert, und es wird versucht, die Anzahl der im Speichersystem gespeicherten doppelten Dateneinheiten zu reduzieren oder zu eliminieren.
-
Figurenliste
-
Einige Ausführungsformen werden anhand der folgenden Abbildungen beschrieben.
- ist ein schematisches Diagramm eines beispielhaften Speichersystems gemäß einigen Ausführungsformen.
- ist eine Darstellung von Beispiel-Datenstrukturen in Übereinstimmung mit einigen Implementierungen.
- ist eine Darstellung von Beispiel-Datenstrukturen in Übereinstimmung mit einigen Implementierungen.
- ist eine Illustration eines Beispielprozesses in Übereinstimmung mit einigen Implementierungen.
- sind Abbildungen von Beispiel-Datenstrukturen gemäß einigen Implementierungen.
- ist ein Diagramm eines maschinenlesbaren Mediums, das Befehle in Übereinstimmung mit einigen Implementierungen speichert.
- ist ein schematisches Diagramm eines Beispiel-Computergeräts gemäß einigen Implementierungen.
- ist eine Illustration eines Beispielprozesses in Übereinstimmung mit einigen Implementierungen.
-
In den Zeichnungen bezeichnen identische Referenznummern ähnliche, aber nicht unbedingt identische Elemente. Die Abbildungen sind nicht unbedingt maßstabsgetreu, und die Größe einiger Teile kann übertrieben sein, um das gezeigte Beispiel deutlicher zu machen. Darüber hinaus enthalten die Zeichnungen Beispiele und/oder Ausführungsformen, die mit der Beschreibung übereinstimmen; die Beschreibung ist jedoch nicht auf die in den Zeichnungen dargestellten Beispiele und/oder Ausführungsformen beschränkt.
-
Ausführliche Beschreibung
-
In der vorliegenden Offenlegung schließt die Verwendung des Begriffs „ein“, „ein“ oder „die“ auch die Pluralformen ein, sofern aus dem Kontext nicht eindeutig etwas anderes hervorgeht. Auch der Begriff „umfasst“, „einschließlich“, „umfasst“, „umfasst“, „haben“ oder „haben“, wenn er in dieser Offenlegung verwendet wird, spezifiziert das Vorhandensein der angegebenen Elemente, schließt aber das Vorhandensein oder die Zugabe anderer Elemente nicht aus.
-
In einigen Beispielen kann ein Speichersystem Daten deduplizieren, um den für die Speicherung der Daten erforderlichen Speicherplatz zu reduzieren. Das Speichersystem kann einen Deduplizierungsprozess durchführen, bei dem ein Datenstrom in diskrete Dateneinheiten oder „Chunks“ unterteilt wird. "Darüber hinaus kann das Speichersystem Identifikatoren oder „Fingerabdrücke“ eingehender Dateneinheiten ermitteln und feststellen, welche eingehenden Dateneinheiten Duplikate von zuvor gespeicherten Dateneinheiten sind. Im Falle von Dateneinheiten, bei denen es sich um Duplikate handelt, kann das Speichersystem Verweise auf die vorherigen Dateneinheiten speichern, anstatt die doppelten eingehenden Dateneinheiten zu speichern.
-
Wie hier verwendet, bezieht sich der Begriff „Fingerabdruck“ auf einen Wert, der durch Anwendung einer Funktion auf den Inhalt der Dateneinheit abgeleitet wird (wobei der „Inhalt“ die Gesamtheit oder eine Teilmenge des Inhalts der Dateneinheit umfassen kann). Ein Beispiel für eine Funktion, die angewendet werden kann, ist eine Hash-Funktion, die einen Hash-Wert auf der Grundlage der eingehenden Dateneinheit erzeugt. Beispiele für Hash-Funktionen sind kryptografische Hash-Funktionen wie die Hash-Funktionen des Secure Hash Algorithm 2 (SHA-2), z. B. SHA-224, SHA-256, SHA-384, usw. In anderen Beispielen können auch andere Arten von Hash-Funktionen oder andere Arten von Fingerprint-Funktionen verwendet werden.
-
Ein „Speichersystem“ kann ein Speichergerät oder eine Anordnung von Speichergeräten umfassen. Ein Speichersystem kann auch einen oder mehrere Speicher-Controller enthalten, die den Zugriff auf das/die Speichergerät(e) verwalten. Eine „Dateneinheit“ kann sich auf jeden Teil der Daten beziehen, der im Speichersystem separat identifiziert werden kann. In einigen Fällen kann sich eine Dateneinheit auf einen Chunk, eine Sammlung von Chunks oder einen anderen Teil von Daten beziehen. In einigen Beispielen kann ein Speichersystem Dateneinheiten in einem persistenten Speicher speichern. Die dauerhafte Speicherung kann mit einem oder mehreren dauerhaften (z. B. nichtflüchtigen) Speichergeräten, wie plattenbasierten Speichergeräten (z. B. Festplattenlaufwerken (HDDs)), Solid-State-Geräten (SSDs), wie Flash-Speichergeräten oder Ähnlichem, oder einer Kombination davon erfolgen.
-
Ein „Steuergerät“ kann sich auf einen Hardware-Verarbeitungsschaltkreis beziehen, der eine beliebige oder eine Kombination aus einem Mikroprozessor, einem Kern eines Multi-Core-Mikroprozessors, einem Mikrocontroller, einem programmierbaren integrierten Schaltkreis, einem programmierbaren Gate-Array, einem digitalen Signalprozessor oder einem anderen Hardware-Verarbeitungsschaltkreis umfassen kann. Alternativ kann sich ein „Steuergerät“ auf eine Kombination aus einer Hardware-Verarbeitungsschaltung und maschinenlesbaren Anweisungen (Software und/oder Firmware) beziehen, die auf der Hardware-Verarbeitungsschaltung ausführbar sind.
-
In einigen Beispielen kann ein Deduplizierungsspeichersystem Metadaten für die Verarbeitung eines oder mehrerer eingehender Datenströme (z. B. mehrerer gleichzeitiger eingehender Datenströme) verwenden. Solche Metadaten können zum Beispiel Datenrezepte (hier auch als „Manifeste“ bezeichnet) enthalten, die die Reihenfolge angeben, in der bestimmte Dateneinheiten (z. B. in einem Datenstrom) empfangen werden. Anschließend kann das Deduplizierungssystem als Reaktion auf eine Leseanforderung einen Satz von Manifesten (hier auch als „Element-Metadaten“ bezeichnet) verwenden, um die Reihenfolge der empfangenen Dateneinheiten zu bestimmen, und so den ursprünglichen Datenstrom wiederherstellen. Dementsprechend kann der Satz von Manifesten eine Darstellung des ursprünglichen Datenstroms sein. Die Manifeste können eine Folge von Datensätzen enthalten, wobei jeder Datensatz einen bestimmten Satz von Dateneinheiten darstellt. Die Datensätze des Manifests können ein oder mehrere Felder (hier auch als „Zeigerinformationen“ bezeichnet) enthalten, die Indizes identifizieren, die Speicherinformationen für die Dateneinheiten enthalten. So kann ein Index beispielsweise ein oder mehrere Felder enthalten, die Standortinformationen (z. B. Container, Offsets usw.) für die gespeicherten Dateneinheiten, Komprimierungs- und/oder Verschlüsselungsmerkmale der gespeicherten Dateneinheiten usw. angeben. Ferner kann der Index Verweiszahlen enthalten, die die Anzahl der Manifeste angeben, die auf jede Dateneinheit verweisen.
-
In einigen Beispielen kann das Deduplizierungsspeichersystem Housekeeping-Prozesse durchführen, um die Genauigkeit der enthaltenen Metadaten zu erhalten. Wenn beispielsweise eine Dateneinheit aus einem bestimmten Manifest gelöscht wird (z. B. aufgrund einer Änderung des Datenstroms oder des durch das Manifest repräsentierten Elements), kann die Referenzanzahl für diese Dateneinheit um eins verringert werden (d. h., es wird angezeigt, dass die Dateneinheit von einem Manifest weniger referenziert wird). In einigen Beispielen können solche „Housekeeping“-Operationen das Laden eines Index in den Speicher beinhalten, um die im Index enthaltenen Referenzzahlen zu dekrementieren. Nachdem die Referenzzahlen dekrementiert wurden, kann der Index in einen dauerhaften Speicher geschrieben werden (z. B. während einer Speicherbereinigung). In einigen Beispielen muss der gesamte Index als Einheit in einen dauerhaften Speicher geschrieben werden, um die Verschlüsselung und/oder Komprimierung des Index zu erhalten, um die Kompatibilität mit einem Speichersystem zu wahren usw. In einigen Beispielen kann es jedoch vorkommen, dass die Änderungen der Referenzzahl nur einen relativ kleinen Teil des Indexes betreffen (z. B. einen von zehntausend Datensätzen im Index), während der Index in den Speicher geladen wurde. Daher wird in solchen Beispielen das Schreiben des gesamten Index in den permanenten Speicher viel mehr Systemverarbeitungszeit und Bandbreite verbrauchen, als wenn nur der geänderte Teil in den permanenten Speicher geschrieben würde. Dementsprechend können in einigen Beispielen die Änderungen an den Referenzzahlen in einem mit dem Index verbundenen Journal und nicht im Index selbst gespeichert werden. Da sich das Journal auf die Aufzeichnung der Änderungen am Index (und nicht der vollständigen Daten des Index) beschränkt, verbraucht das Schreiben des Journals in den permanenten Speicher relativ weniger Verarbeitungszeit und Bandbreite, als wenn der gesamte Index in den permanenten Speicher geschrieben wird.
-
In einigen Beispielen kann eine Journalgruppe aus mehreren Journalen gebildet werden, wobei jedes der Journale in der Journalgruppe mit einem entsprechenden Index verknüpft ist, der Metadaten speichert, die mit einem einzelnen im Deduplizierungssystem gespeicherten Objekt (z. B. einer Datei, einer Tabelle usw.) verknüpft sind. So kann eine Journalgruppe ausschließlich Journale enthalten, die mit einem einzigen gespeicherten Objekt verbunden sind. In einigen Beispielen kann es wahrscheinlicher sein, dass Metadatenänderungen an den Dateneinheiten eines einzelnen gespeicherten Objekts in zeitlicher Nähe zueinander stattfinden (d.h. zeitnah). Dementsprechend kann die Gesamtzahl der Schreibvorgänge in den persistenten Speicher reduziert werden, indem ganze Journalgruppen (z. B. ein oder mehrere Journale, die zeitnah zueinander geschrieben werden) in den persistenten Speicher geschrieben werden, anstatt einzelne Journale stückweise zu schreiben.
-
In einigen Beispielen kann ein Housekeeping-Prozess die Verarbeitung von Manifesten in Stapeln beinhalten, wobei jeder Stapel eine Vielzahl von Manifesten umfasst, die zusammen einen kontinuierlichen Bereich von Benutzerdaten darstellen, die dem System zur Verfügung gestellt werden. Eine solche Stapelverarbeitung kann die Anzahl der für denselben Index durchgeführten Lade- und Schreibvorgänge verringern. In einigen Beispielen kann die Stapelverarbeitung das Laden aller Manifeste für einen Stapel in den Speicher, das Identifizieren des Satzes von Indizes, die von den Änderungen an den Manifesten betroffen sind, das Laden der identifizierten Indizes in den Speicher, das Laden der zugehörigen Journalgruppen (d. h. einschließlich der mit den identifizierten Indizes verbundenen Journale) in den Speicher, das Aktualisieren der Journale und das Schreiben der Journalgruppen in den Speicher umfassen. In einigen Beispielen kann die Verarbeitung eines einzigen Stapels jedoch mehrere Lade- und Schreibvorgänge (d. h. Lesen aus dem Speicher in den Speicher und Schreiben aus dem Speicher in den Speicher) für jede Journalgruppe umfassen. Bei der Verarbeitung einer Gruppe von Indizes, die einer bestimmten Journalgruppe zugeordnet sind, kann die Verarbeitung beispielsweise in einer Reihenfolge erfolgen, die diese Journalgruppe zu verschiedenen Zeitpunkten aktualisiert. So kann die Journalgruppe aus dem Speicher entfernt werden (z. B. um Speicherplatz für andere Journalgruppen zu schaffen) und später für weitere Aktualisierungen wieder in den Speicher geladen werden. Daher können in solchen Beispielen die mehrfachen Lade- und Schreibvorgänge für dieselbe Journalgruppe mehr Systemverarbeitungszeit und Bandbreite verbrauchen, als wenn die Journalgruppe nur einmal während des Batch-Prozesses in den Speicher geladen (und in den Speicher geschrieben) würde.
-
In Übereinstimmung mit einigen Implementierungen der vorliegenden Offenlegung kann ein Deduplizierungsspeichersystem eine Housekeeping-Operation durchführen, die das Ordnen eines Satzes von Indizes entsprechend ihrer zugehörigen Journalgruppen und das anschließende Laden der Indizes in den Speicher entsprechend ihrer sortierten Reihenfolge umfasst. Jede Journalgruppe kann während der Verarbeitung der mit dieser Journalgruppe verbundenen Indizes im Speicher gehalten (oder hier „angeheftet“) werden. Die angeheftete Journalgruppe kann Änderungen an den in den zugehörigen Indizes enthaltenen Referenzzahlen speichern. In einigen Implementierungen kann ein Countdown-Zähler mit der Anzahl der zugehörigen Indizes initialisiert werden, die Änderungen an ihren Referenzzählungen aufweisen. Wenn jeder Index abgeschlossen ist, kann der Countdown-Zähler um eins dekrementiert werden. Wenn also der Countdown-Zähler gleich Null ist, wurde die Journalgruppe aktualisiert, um alle Referenzzählungsänderungen für die zugehörigen Indizes zu berücksichtigen, und als Reaktion darauf wird die Journalgruppe aus dem Speicher entfernt und in den Speicher geschrieben. Auf diese Weise kann die beschriebene Technik die Anzahl der Ladevorgänge einer Joumalgruppe in den Speicher (und das Schreiben der Journalgruppe in den Speicher) reduzieren und dadurch die Leistung des Deduplizierungsspeichersystems verbessern.
-
ABB. 1 - Beispiel für ein Speichersystem
-
zeigt ein Beispiel für ein Speichersystem 100, das einen Speicher-Controller 110, einen Speicher 115 und einen dauerhaften Speicher 140 gemäß einigen Implementierungen umfasst. Wie dargestellt, kann der dauerhafte Speicher 140 eine beliebige Anzahl von Manifesten 150, Indizes 160 und Datencontainern 170 enthalten. Der dauerhafte Speicher 140 kann ein oder mehrere nicht transitorische Speichermedien wie Festplattenlaufwerke (HDDs), Solid-State-Laufwerke (SSDs), optische Festplatten usw. oder eine Kombination davon umfassen. Der Speicher 115 kann in einem Halbleiterspeicher wie z. B. einem Direktzugriffsspeicher (RAM) implementiert sein. In einigen Beispielen kann die Speichersteuerung 110 durch Hardware (z. B. elektronische Schaltungen) oder eine Kombination aus Hardware und Programmierung (z. B. mit mindestens einem Prozessor und Anweisungen, die von dem mindestens einen Prozessor ausgeführt werden können und auf mindestens einem maschinenlesbaren Speichermedium gespeichert sind) implementiert werden.
-
In einigen Implementierungen kann das Speichersystem 100 eine Deduplizierung der gespeicherten Daten durchfiihren. Beispielsweise kann die Speichersteuerung 110 einen Strom von Eingabedaten in Dateneinheiten unterteilen und mindestens eine Kopie jeder Dateneinheit in einem Datencontainer 170 speichern (z. B. durch Anhängen der Dateneinheiten an das Ende des Containers 170). In einigen Beispielen kann jeder Datencontainer 170 in Teile unterteilt sein (hier auch als „Einheiten“ bezeichnet).
-
In einer oder mehreren Implementierungen kann die Speichersteuerung 110 einen Fingerabdruck für jede Dateneinheit erzeugen. Der Fingerabdruck kann zum Beispiel einen vollständigen oder teilweisen Hash-Wert für die Dateneinheit enthalten. Um festzustellen, ob eine eingehende Dateneinheit ein Duplikat einer gespeicherten Dateneinheit ist, kann die Speichersteuerung 110 den für die eingehende Dateneinheit erzeugten Fingerabdruck mit den Fingerabdrücken der gespeicherten Dateneinheiten vergleichen. Ergibt dieser Vergleich eine Übereinstimmung, so kann die Speichersteuerung 110 feststellen, dass ein Duplikat der eingehenden Dateneinheit bereits im Speichersystem 100 gespeichert ist.
-
Wie in dargestellt, kann der dauerhafte Speicher 140 Manifeste 150, Indizes 160, Datencontainer 170 und Journalgruppen 120 speichern. In einigen Implementierungen kann die Speichersteuerung 110 ein Manifest 150 erzeugen, um die Reihenfolge aufzuzeichnen, in der die Dateneinheiten empfangen wurden. Außerdem kann das Manifest 150 einen Zeiger oder andere Informationen enthalten, die den Index 160 angeben, der jeder Dateneinheit zugeordnet ist. In einigen Implementierungen kann der zugehörige Index 160 den Ort angeben, an dem die Dateneinheit gespeichert ist. Zum Beispiel kann der zugehörige Index 160 Informationen enthalten, die angeben, dass die Dateneinheit an einem bestimmten Offset in einer Entität gespeichert ist und dass die Entität an einem bestimmten Offset in einem Datencontainer 170 gespeichert ist. Ferner kann der Index 160 Verweiszahlen enthalten, die die Anzahl der Manifeste 150 angeben, die auf jede Dateneinheit verweisen.
-
In einigen Implementierungen kann der Speicher-Controller 110 eine Leseanforderung für den Zugriff auf die gespeicherten Daten erhalten und daraufhin auf das Manifest 150 zugreifen, um die Reihenfolge der Dateneinheiten zu bestimmen, aus denen die ursprünglichen Daten bestanden. Die Speichersteuerung 110 kann dann die im Manifest 150 enthaltenen Zeigerdaten verwenden, um die mit den Dateneinheiten verbundenen Indizes 160 zu identifizieren. Ferner kann die Speichersteuerung 110 die in den identifizierten Indizes 160 (und die im Manifest 150 enthaltenen Informationen) enthaltenen Informationen verwenden, um die Speicherorte der Dateneinheiten zu bestimmen (z. B. Datencontainer 170, Entität, Offsets usw.), und kann dann die Dateneinheiten aus den bestimmten Speicherorten lesen.
-
In einigen Implementierungen kann jedem Index 160 ein Journal 130 zugeordnet sein. Jedes Journal 130 kann Informationen enthalten, die Änderungen an den Daten anzeigen, die in dem mit diesem Journal 130 verbundenen Index 160 gespeichert sind. Wenn beispielsweise eine Kopie des Index 160 im Speicher 115 geändert wird, um eine Änderung der Metadaten widerzuspiegeln, kann diese Änderung auch als Eintrag in dem zugehörigen Journal 130 aufgezeichnet werden. In einigen Implementierungen können mehrere Journale 130 in einer Journalgruppe 120 gruppiert werden, die mit einer einzelnen Datei oder einem einzelnen Objekt, das im Deduplizierungssystem gespeichert ist, verbunden ist. Beispielsweise können die mehreren Journale Indizes entsprechen, die Metadaten zu einer einzigen Datei speichern.
-
In einigen Implementierungen kann der Speicher-Controller 110 eine Housekeeping-Operation für einen Stapel von Manifesten 150 durchführen (z. B. als Reaktion auf einen Befehl oder eine Anforderung, basierend auf einem periodischen Zeitplan oder Ähnlichem). Die Housekeeping-Operation kann die Aktualisierung von Referenzzählungen (z. B. in den Indizes 160) beinhalten, um die Löschung von Dateneinheiten aus den Manifesten 150 zu berücksichtigen (z. B. aufgrund einer Änderung des Datenstroms oder des durch die Manifeste 150 repräsentierten Elements). In einigen Implementierungen kann die Speichersteuerung 110 einen Satz von Indizes 160 identifizieren, die von den Manifesten 150 des Stapels der Housekeeping-Operation referenziert werden, und kann eine Work Map 180 erzeugen, die die Referenzzählungsänderungen in jedem Index 160 anzeigt, der von einem Manifest 150 des Stapels referenziert wird. Ferner kann die Speichersteuerung 110 eine gespeicherte Nachschlagetabelle 186 verwenden, um die Journalgruppen 120 zu identifizieren, die mit diesen Indizes 160 verbunden sind, und kann die Indizes 160 nach ihren zugehörigen Journalgruppen 120 sortieren (z. B. nach den Kennungen der Journalgruppen 120).
-
In einigen Implementierungen kann die Speichersteuerung 110 eine Journalgruppe 120 in den Speicher 115 laden und einen Countdown-Zähler 182 („CD-Zähler“) auf die Anzahl der Indizes 160 setzen, die mit dieser Journalgruppe 120 verbunden sind. Die Speichersteuerung 110 kann dann die Indizes 160 gemäß der sortierten Reihenfolge verarbeiten, einschließlich, für jeden der Indizes 160, der Aktualisierung der Journalgruppe 120, um die Referenzzählungsänderungen für diesen Index 160 gemäß der Arbeitsübersicht 180 aufzunehmen. Für jeden Index 160, der abgeschlossen ist, kann die Speichersteuerung 110 den Countdown-Zähler 182 um eins dekrementieren. Wenn der Countdown-Zähler 182 Null erreicht (d.h., die Journalgruppe 120 wurde aktualisiert, um alle Referenzzählungsänderungen für ihre zugehörigen Indizes 160 einzuschließen), schreibt die Speichersteuerung 110 die Journalgruppe 120 in den permanenten Speicher 140 und entfernt die Journalgruppe 120 aus dem Speicher 115. Auf diese Weise kann die Speichersteuerung 110 die Anzahl der Ladevorgänge einzelner Journale 130 (und Journalgruppen 120) in den Speicher 115 und das Schreiben in den permanenten Speicher 140 während des Housekeeping-Prozesses reduzieren. Die offengelegte Housekeeping-Technik wird weiter unten unter Bezugnahme auf die erörtert.
-
ABB. 2 - Beispielhafte Datenstrukturen
-
zeigt ein Beispiel für Datenstrukturen 200, die bei der Deduplizierung in Übereinstimmung mit einigen Implementierungen verwendet werden. Wie dargestellt, können die Datenstrukturen 200 Element-Metadaten 202, einen Manifest-Datensatz 210, einen Container-Index 220 und einen Container 250 enthalten. In einigen Implementierungen können die Element-Metadaten 202 mehrere Manifesteinträge 210 und eine Nachschlagetabelle 205 enthalten. In einigen Beispielen können der Manifestdatensatz 210, der Containerindex 220, der Container 250 und die Nachschlagetabelle 205 im Allgemeinen den Beispielimplementierungen eines Manifests 150, eines Index 160, eines Datencontainers 170 bzw. der Nachschlagetabelle 186 (wie in dargestellt) entsprechen. In einigen Beispielen können die Datenstrukturen 200 von der Speichersteuerung 110 (in dargestellt) erzeugt und/oder verwaltet werden.
-
Wie in dargestellt, kann der Manifestdatensatz 210 in einigen Beispielen verschiedene Felder enthalten, z. B. Offset, Länge, Containerindex und Einheitsadresse oder Fingerabdruck. In einigen Ausführungsformen kann jeder Containerindex 220 eine beliebige Anzahl von Dateneinheitendatensätzen 230 und Entitätsdatensätzen 240 enthalten. Jeder Datensatz 230 kann verschiedene Felder enthalten, wie z. B. einen Fingerabdruck (z. B. einen Hash der Dateneinheit), eine Einheitsadresse, einen Entitätsidentifikator, einen Einheitsoffset (d. h. einen Offset der Dateneinheit innerhalb der Entität), einen Referenzzählwert, eine Einheitslänge oder Ähnliches oder eine Kombination davon. In einigen Beispielen kann der Referenzzählwert die Anzahl der Manifestdatensätze 210 angeben, die auf den Dateneinheitssatz 230 verweisen. Darüber hinaus kann jeder Entitätsdatensatz 240 verschiedene Felder enthalten, wie z. B. einen Entitätsidentifikator, einen Entitätsoffset (d. h. einen Offset der Entität innerhalb des Containers), eine gespeicherte Länge (d. h. eine Länge der Dateneinheit innerhalb der Entität), eine dekomprimierte Länge, einen Prüfsummenwert und Komprimierungs-/Verschlüsselungsinformationen (z. B. Art der Komprimierung, Art der Verschlüsselung usw.). In einigen Ausführungsformen kann jeder Container 250 eine beliebige Anzahl von Einheiten 260 enthalten, und jede Einheit 260 kann eine beliebige Anzahl von gespeicherten Dateneinheiten enthalten.
-
In einer oder mehreren Implementierungen können die Datenstrukturen 200 verwendet werden, um gespeicherte deduplizierte Daten abzurufen. Beispielsweise kann eine Leseanforderung einen Versatz und eine Länge von Daten in einer bestimmten Datei angeben. Diese Anforderungsparameter können mit den Offset- und Längenfeldern eines bestimmten Manifestdatensatzes 210 abgeglichen werden. Der Containerindex und die Einheitsadresse des bestimmten Manifestdatensatzes 210 können dann mit einem bestimmten Dateneinheitsdatensatz 230 abgeglichen werden, der in einem Containerindex 220 enthalten ist. Ferner kann die Entitätskennung des bestimmten Datensatzes 230 mit der Entitätskennung eines bestimmten Entitätsdatensatzes 240 abgeglichen werden. Darüber hinaus können ein oder mehrere andere Felder des bestimmten Entitätsdatensatzes 240 (z. B. der Entitätsoffset, die gespeicherte Länge, die Prüfsumme usw.) zur Identifizierung des Behälters 250 und der Entität 260 verwendet werden, und die Dateneinheit kann dann aus dem identifizierten Behälter 250 und der Entität 260 gelesen werden.
-
In einigen Implementierungen kann die Nachschlagetabelle 205 eine gespeicherte Struktur sein, die Indizes und ihre zugehörigen Journalgruppen identifiziert. Die Nachschlagetabelle 205 kann beispielsweise mehrere Einträge enthalten, wobei jeder Eintrag einen bestimmten Index angibt und auch die bestimmte Journalgruppe angibt, die das Journal zum Speichern von Metadatenänderungen für diesen bestimmten Index enthält. In einigen Implementierungen kann jeder Eintrag der Nachschlagetabelle 205 zu dem Zeitpunkt hinzugefügt werden, zu dem die Journalgruppe dem Index erstmals zugewiesen wird (z. B. zum Zeitpunkt der Erstellung des Index). Ein Beispiel für die Nachschlagetabelle 205 wird im Folgenden unter Bezugnahme auf erörtert. Obwohl in der Einfachheit halber nur eine von ihnen dargestellt ist, können die Datenstrukturen 200 eine Vielzahl von Instanzen von Element-Metadaten 202 enthalten, die jeweils einen oder mehrere Manifestdatensätze 210 enthalten oder auf diese verweisen. In solchen Beispielen können die Datenstrukturen 200 eine Vielzahl von Manifestsätzen 210 enthalten. Die Manifesteinträge 210 können auf eine Vielzahl von Containerindizes 220 verweisen, die jeweils einem von mehreren Containern 250 entsprechen. Jeder Containerindex 220 kann einen oder mehrere Datensätze 230 und einen oder mehrere Entitätsdatensätze 240 umfassen.
-
ABB. 3 - Beispielhafte Datenstrukturen
-
zeigt eine Darstellung des Speichers 115 mit einer Journalgruppe 310 und mehreren Indizes 330. Wie dargestellt, umfasst die Journalgruppe 310 mehrere Journale 320. In einigen Beispielen können die Zapfengruppe 310, die Zapfen 320 und die Indizes 330 im Allgemeinen den Beispielimplementierungen der Zapfengruppe 120, der Zapfen 130 bzw. der Indizes 160 (dargestellt in ) entsprechen.
-
In einigen Implementierungen kann jedes Journal 320 mit einem entsprechenden Index 330 verbunden sein und Änderungen an den im entsprechenden Index 330 gespeicherten Metadaten aufzeichnen. Ferner können für jeder Journalgruppe 310 alle entsprechenden Indizes 330 mit einem einzigen gespeicherten Objekt (z. B. einer Benutzersicherung, einem Dokument, einer Datenbanktabelle, einer Datendatei usw.) verbunden sein. Beispielsweise können alle entsprechenden Indizes 330 Metadaten für Dateneinheiten enthalten, die in einer einzelnen Datei enthalten sind, die in einem Deduplizierungssystem gespeichert ist (z. B. das in dargestellte Speichersystem 100). In einigen Implementierungen können die Assoziationen zwischen den Indizes 330 und der Journalgruppe 310 in Einträgen einer gespeicherten Nachschlagetabelle aufgezeichnet werden (z. B. in der gespeicherten Nachschlagetabelle 186 in ).
-
In einigen Implementierungen kann jedes Journal 320 eine Versionsnummer 325 enthalten oder damit verbunden sein. Außerdem kann jeder Index 330 eine Versionsnummer 335 enthalten oder mit dieser verknüpft sein. In einigen Implementierungen kann die Versionsnummer 325 mit der Versionsnummer 335 verglichen werden, um festzustellen, ob die Zeitschrift 320 oder der zugehörige Index 330 die neueste Version der Metadaten enthält. Wenn beispielsweise die Versionsnummer 325 größer ist als die Versionsnummer 335, kann festgestellt werden, dass die im Journal 320 enthaltenen Änderungsdaten einen neueren Stand der Metadaten widerspiegeln als die im Index 330 gespeicherten Metadaten. Ist dies der Fall, kann der Index 330 aktualisiert werden, um die im Journal 320 aufgezeichneten Änderungen aufzunehmen. Wenn jedoch die Versionsnummer 325 kleiner ist als die Versionsnummer 335, kann festgestellt werden, dass die im Journal 320 enthaltenen Änderungsdaten einen Zustand der Metadaten widerspiegeln, der älter ist als die im Index 330 gespeicherten Metadaten. In diesem Fall kann das Journal 320 gelöscht werden, ohne den Index 330 zu aktualisieren. In einigen Implementierungen kann der Vergleich der Versionsnummer 325 mit der Versionsnummer 335 als Reaktion auf das Laden des Journals 320 oder des zugehörigen Index 330 aus dem persistenten Speicher in den Speicher (z. B. aus dem persistenten Speicher 140 in den Speicher 115, wie in dargestellt) durchgeführt werden.
-
In einer oder mehreren Implementierungen kann die Anzahl der in einer Journalgruppe 310 enthaltenen Journale 320 in einem gespeicherten Parameter (z. B. einer Benutzereinstellung, einer Konfigurationsvariablen usw.) angegeben werden. In einigen Beispielen kann dieser Parameter angepasst oder abgestimmt werden, um die Leistungscharakteristiken von Ein-/Ausgabeoperationen (E/A) in einem Speichersystem zu ändern. Beispielsweise kann dieser Parameter erhöht werden, um zu versuchen, relativ weniger häufige Schreibvorgänge von relativ großer Größe zu erhalten. In einem anderen Beispiel kann dieser Parameter verringert werden, um relativ häufige Schreibvorgänge von relativ geringer Größe zu erreichen.
-
ABB. 4 - Beispielprozess für die Verwaltung von Metadaten
-
In ist ein Beispielprozess 400 für die Verwaltung von Metadaten in Übereinstimmung mit einigen Implementierungen dargestellt. Der Prozess 400 kann von der Speichersteuerung 110 durchgeführt werden, die Anweisungen ausführt. Der Prozess 400 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nicht transitorischen, computerlesbaren Medium gespeichert werden, z. B. in einem optischen, Halbleiter- oder magnetischen Speichergerät. Die maschinenlesbaren Anweisungen können von einem einzigen Prozessor, mehreren Prozessoren, einer einzigen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung werden Einzelheiten des Prozesses 400 im Folgenden unter Bezugnahme auf beschrieben, die Beispiele gemäß einigen Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
-
Block 410 kann das Laden eines Stapels von Manifesten in den Speicher während eines Housekeeping-Vorgangs umfassen. Block 415 kann das Identifizieren von Indizes, auf die in dem Stapel von Manifesten verwiesen wird, und das Laden der Indizes in den Speicher umfassen. Beispielsweise kann die Speichersteuerung 110 einen Befehl oder eine Anforderung (z. B. von einem internen Prozess, einem periodischen Zeitgeber, einem Client usw.) erhalten, um einen Housekeeping-Prozess für einen Stapel von Manifesten 150 durchzuführen (z. B. um die Anzahl der Verweise auf Dateneinheiten zu verringern, die nicht mehr in den Manifesten 150 enthalten sind). Als Reaktion auf den Befehl oder die Anforderung kann die Speichersteuerung 110 einen Satz von Indizes 160 identifizieren, auf die der Stapel von Manifesten 150 verweist, und die identifizierten Indizes 160 in den Speicher 115 laden.
-
Wie in dargestellt, kann Block 420 die Erstellung einer Arbeitsübersicht im Speicher beinhalten, um Änderungen der Referenzanzahl in jedem Index aufzuzeichnen. Block 425 kann das Entladen des Stapels von Manifesten aus dem Speicher beinhalten. Beispielsweise kann der Speicher-Controller 110, wie in dargestellt, den Stapel von Manifesten 150 verwenden, um die Referenzzählungsänderungen für jeden Index 160 (z. B. für jede Dateneinheit, auf die der Index 160 verweist) zu bestimmen, und diese Informationen in einer Arbeitsübersicht 180 speichern. Nachdem die mit jedem Manifest 150 verbundenen Änderungen in die Work-Map 180 aufgenommen wurden, kann die Speichersteuerung 110 dieses Manifest 150 aus dem Speicher 115 entfernen.
-
Wie in dargestellt, kann Block 430 die Identifizierung der den Indizes zugeordneten Zeitschriftengruppen anhand einer gespeicherten Nachschlagetabelle umfassen. Block 435 kann das Sortieren der Indizes in einer sortierten Reihenfolge nach der zugehörigen Zeitschriftengruppe umfassen. Block 440 kann beinhalten, dass für jede Joumalgruppe die Anzahl der Indizes bestimmt wird, die der Journalgruppe zugeordnet sind. In Bezug auf kann die Speichersteuerung 110 beispielsweise eine gespeicherte Nachschlagetabelle 186 verwenden, um die Zeitschriftengruppen 120 zu identifizieren, die mit den Indizes 160 verbunden sind, und kann die Indizes 160 nach ihren zugehörigen Zeitschriftengruppen 120 sortieren (z. B. nach den Kennungen der Zeitschriftengruppen 120). Die Speichersteuerung 110 kann auch für jede Journalgruppe 120 die Anzahl der zugehörigen Indizes 160 bestimmen, die in der Arbeitsübersicht enthalten sind (d.h., deren Referenzzahlen durch den Housekeeping-Prozess geändert wurden).
-
Wieder Bezug nehmend auf , kann in Block 450 eine Schleife (definiert durch die Blöcke 450, 460, 465, 470, 475 und 480) eingegeben werden, um jeden Index in der sortierten Reihenfolge (bestimmt in Block 435) zu verarbeiten. Block 460 kann, wenn der aktuelle Index der anfängliche (d. h. erste) Index ist, der für eine bestimmte Zeitschriftengruppe verarbeitet werden soll, das Laden dieser Zeitschriftengruppe in den Speicher und das Setzen eines Countdown-Zählers auf die Anzahl der Indizes (bestimmt in Block 440) umfassen. Beispielsweise kann der Speichercontroller 110 ( ) unter Bezugnahme auf feststellen, dass ein neuer Index 160 verarbeitet wird und dass dieser neue Index 160 der erste Index 160 in der sortierten Reihenfolge ist, der für eine bestimmte Journalgruppe 120 verarbeitet werden soll. Dementsprechend kann die Speichersteuerung 110 die Journalgruppe 120 in den Speicher 115 laden und einen Countdown-Zähler 182 („CD-Zähler“) setzen, der der Anzahl der Indizes 160 entspricht, die dieser Journalgruppe 120 zugeordnet sind. In einigen Implementierungen kann das Speichersteuergerät 110 die Journalgruppe 120 im Speicher 115 beibehalten oder „feststecken“, bis alle Referenzzählungsänderungen in die Journalgruppe 120 aufgenommen wurden.
-
Wieder Bezug nehmend auf , kann Block 465 die Aktualisierung der Journalgruppe beinhalten, um Referenzzählungsänderungen aus der Arbeitsübersicht zu speichern. Block 470 kann das Dekrementieren des Countdown-Zählers beinhalten, wenn Änderungen für den Index abgeschlossen sind. Block 475 kann beinhalten, dass, wenn der Countdown-Zähler Null erreicht, die aktuelle Journalgruppe in den Speicher geschrieben und aus dem Speicher entfernt wird. Beispielsweise kann der Speicher-Controller 110 die im Speicher 115 abgelegte Journalgruppe 120 aktualisieren, um die Referenzzählungen der Änderungen für den aktuellen Index 160 aufzunehmen, wie in der Workmap 180 angegeben. Sobald alle Änderungen für den aktuellen Index 160 abgeschlossen sind (d. h. in der Journalgruppe 120 gespeichert sind), kann die Speichersteuerung 110 den Countdown-Zähler 182 um eins dekrementieren. Wenn der Countdown-Zähler 182 Null erreicht (d.h. die Journalgruppe 120 wurde aktualisiert, um alle Referenzzählungsänderungen für die zugehörigen Indizes 160 zu enthalten), kann die Speichersteuerung 110 die Journalgruppe 120 in den permanenten Speicher 140 schreiben und die Journalgruppe 120 aus dem Speicher 115 entfernen.
-
Wiederum Bezug nehmend auf , kann der Entscheidungsblock 480 die Feststellung beinhalten, ob alle Indizes verarbeitet wurden. Ist dies der Fall, kann der Prozess 400 abgeschlossen werden. Andernfalls, wenn nicht alle Indizes verarbeitet wurden, kann der Prozess 400 zu Block 450 zurückkehren (d. h. mit der Verarbeitung eines anderen Index beginnen). Beispielsweise kann die Speichersteuerung 110 die Indizes 160 gemäß der sortierten Reihenfolge weiter verarbeiten, bis alle Indizes 160 verarbeitet sind (siehe ). Auf diese Weise kann die Speichersteuerung 110 den Housekeeping-Prozess mit einer reduzierten Anzahl von Instanzen des Ladens einer Journalgruppe 120 in den Speicher 115 sowie einer reduzierten Anzahl von Instanzen des Schreibens der Journalgruppe 160 in den permanenten Speicher 140 durchführen.
-
ABB. 5A-5B - Beispielhafte Datenstrukturen
-
In ist ein Beispiel für die Implementierung der Nachschlagetabelle 186 zu sehen. Wie dargestellt, kann die Nachschlagetabelle 186 mehrere Einträge oder Zeilen enthalten. Jeder Eintrag kann einem bestimmten Behälterindex entsprechen. Außerdem kann jeder Eintrag die Zeitschriftengruppe identifizieren, die einem bestimmten Containerindex zugeordnet ist. In einigen Implementierungen kann jeder Eintrag der Nachschlagetabelle 186 zu dem Zeitpunkt hinzugefügt werden, an dem die Journalgruppe dem Index erstmals zugewiesen wird (z. B. bei der Erstellung des Index). In einigen Implementierungen kann die Nachschlagetabelle 186 auch dauerhaft in den Metadaten der Elemente gespeichert werden (z. B. in dem in ABB. dargestellten dauerhaften Speicher 140).
-
zeigt ein Beispiel für die Implementierung der Arbeitsübersicht 180. Wie gezeigt, kann die Arbeitsübersicht 180 mehrere Einträge oder Zeilen enthalten, wobei jeder Eintrag einem bestimmten Referenzzählwert (d. h. für eine bestimmte Adresse oder einen bestimmten Ort) entspricht, der in einem bestimmten Containerindex enthalten ist. Ferner kann jeder Eintrag den Änderungsbetrag für jeden Referenzwert angeben. In einigen Implementierungen kann jeder Eintrag während eines Housekeeping-Prozesses zur Arbeitsübersicht 180 hinzugefügt werden. Beispielsweise kann der Speicher-Controller 110 die in den Speicher geladenen Manifeste 150 verwenden, um die Änderungen der Referenzzählung für jeden Index 160 (z. B. für jede Dateneinheit, auf die der Index 160 verweist) zu bestimmen, und kann diese Informationen in einem entsprechenden Eintrag der Work Map 180 speichern. In einigen Implementierungen kann die Work-Map 180 nur im Speicher 115 gespeichert werden und nach Abschluss des Housekeeping-Prozesses gelöscht werden.
-
ABB. 6 - Beispiel für ein maschinenlesbares Medium
-
zeigt ein maschinenlesbares Medium 600, auf dem Anweisungen 610-630 in Übereinstimmung mit einigen Implementierungen gespeichert sind. Die Anweisungen 610-630 können von einem einzelnen Prozessor, mehreren Prozessoren, einer einzelnen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Das maschinenlesbare Medium 600 kann ein nicht-transitorisches Speichermedium sein, wie z. B. ein optisches, Halbleiter- oder magnetisches Speichermedium.
-
Die Anweisung 610 kann ausgeführt werden, um eine Housekeeping-Operation zu erkennen, um Aktualisierungen an Daten eines Satzes von Container-Indizes gespeicherter deduplizierter Daten durchzuführen. Die Anweisung 620 kann ausgeführt werden, um als Reaktion auf die Erkennung der Housekeeping-Operation aus dem Satz von Container-Indizes eine Vielzahl von Container-Indizes zu identifizieren, die einer bestimmten Journal-Gruppe zugeordnet sind, wobei die bestimmte Journal-Gruppe eine Vielzahl von Journalen umfasst, um Aktualisierungen von Daten der Vielzahl von Container-Indizes zu speichern. Die Anweisung 630 kann ausgeführt werden, um die bestimmte Journalgruppe im Speicher geladen zu halten, bis alle Aktualisierungen der Housekeeping-Operation an der Vielzahl von Container-Indizes in den jeweiligen Journalen der bestimmten Journalgruppe gespeichert worden sind.
-
Beispielsweise kann der Speicher-Controller 110 einen Befehl oder eine Anfrage zur Durchführung eines Housekeeping-Prozesses für einen Stapel von Manifesten 150 erhalten (siehe ). Daraufhin kann die Speichersteuerung 110 einen Satz von Indizes 160 ermitteln, auf die der Stapel von Manifesten 150 verweist. Ferner kann die Speichersteuerung 110 die Journalgruppen 120 identifizieren, die mit den Indizes 160 verbunden sind, und die Indizes 160 nach den ihnen zugeordneten Journalgruppen 120 sortieren. Darüber hinaus kann die Speichersteuerung 110 die Journalgruppe 120 in den Speicher 115 laden und pflegen, bis alle Referenzzählungsänderungen in der Journalgruppe 120 enthalten sind.
-
ABB. 7 - Beispiel für eine Datenverarbeitungsanlage
-
zeigt ein schematisches Diagramm eines Beispiel-Computergeräts 700. In einigen Beispielen kann die Rechenvorrichtung 700 im Allgemeinen einem Teil oder der Gesamtheit des Speichersystems 100 (dargestellt in ) entsprechen. Wie dargestellt, kann die Rechenvorrichtung 700 einen Hardware-Prozessor 702, einen Speicher 704 und einen maschinenlesbaren Speicher 705 mit Anweisungen 710-730 umfassen. Bei dem maschinenlesbaren Speicher 705 kann es sich um ein nicht-übertragbares Medium handeln. Die Anweisungen 710-730 können von dem Hardware-Prozessor 702 oder von einer im Hardware-Prozessor 702 enthaltenen Verarbeitungsmaschine ausgeführt werden.
-
Die Anweisung 710 kann ausgeführt werden, um eine Housekeeping-Operation zu erkennen, um Aktualisierungen von Daten eines Satzes von Container-Indizes gespeicherter deduplizierter Daten durchzuführen. Die Anweisung 720 kann ausgeführt werden, um als Reaktion auf die Erkennung der Housekeeping-Operation aus dem Satz von Container-Indizes eine Vielzahl von Container-Indizes zu identifizieren, die einer bestimmten Joumalgruppe zugeordnet sind, wobei die bestimmte Journalgruppe eine Vielzahl von Journalen umfasst, um Aktualisierungen von Daten der Vielzahl von Container-Indizes entsprechend zu speichern. Die Anweisung 730 kann ausgeführt werden, um die bestimmte Journalgruppe, die in den Speicher geladen ist, aufrechtzuerhalten, bis alle Aktualisierungen der Housekeeping-Operation an der Vielzahl von Container-Indizes in den jeweiligen Journalen der bestimmten Journalgruppe gespeichert worden sind.
-
ABB. 8 - Beispielprozess
-
In ist ein Beispielprozess 800 in Übereinstimmung mit einigen Implementierungen dargestellt. In einigen Beispielen kann der Prozess 800 unter Verwendung des Speicher-Controllers 110 (dargestellt in ) durchgeführt werden. Der Prozess 800 kann in Hardware oder einer Kombination aus Hardware und Programmierung (z. B. maschinenlesbare Anweisungen, die von einem oder mehreren Prozessoren ausgeführt werden können) implementiert werden. Die maschinenlesbaren Anweisungen können in einem nichttransitorischen, computerlesbaren Medium gespeichert werden, z. B. in einer optischen, Halbleiter- oder magnetischen Speichereinrichtung. Die maschinenlesbaren Anweisungen können von einem einzigen Prozessor, mehreren Prozessoren, einer einzigen Verarbeitungsmaschine, mehreren Verarbeitungsmaschinen usw. ausgeführt werden. Zur Veranschaulichung werden Einzelheiten des Prozesses 800 im Folgenden unter Bezugnahme auf die beschrieben, die Beispiele für einige Implementierungen zeigen. Es sind jedoch auch andere Implementierungen möglich.
-
Block 810 kann beinhalten, dass ein Speicher-Controller eines Deduplizierungs-Speichersystems eine Housekeeping-Operation erkennt, um Aktualisierungen an Daten eines Satzes von Container-Indizes gespeicherter deduplizierter Daten durchzuführen. Block 820 kann als Reaktion auf eine Erkennung der Housekeeping-Operation beinhalten, dass der Speicher-Controller unter dem Satz von Container-Indizes eine Vielzahl von Container-Indizes identifiziert, die mit einer bestimmten Journal-Gruppe verbunden sind, wobei die bestimmte Journal-Gruppe eine Vielzahl von Journalen umfasst, um Aktualisierungen von Daten der Vielzahl von Container-Indizes zu speichern. Block 830 kann beinhalten, dass der Speicher-Controller die bestimmte Journalgruppe, die in den Speicher geladen ist, solange aufrechterhält, bis alle Aktualisierungen der Housekeeping-Operation an der Vielzahl von Container-Indizes in den jeweiligen Journalen der bestimmten Journalgruppe gespeichert worden sind. Nach Block 830 kann der Prozess 800 abgeschlossen werden.
-
In Übereinstimmung mit den hier beschriebenen Implementierungen kann ein Deduplizierungsspeichersystem eine Housekeeping-Operation durchführen, die das Ordnen eines Satzes von Indizes entsprechend ihrer zugehörigen Journalgruppen und das anschließende Laden der Indizes in den Speicher entsprechend ihrer sortierten Reihenfolge umfasst. Jede Journalgruppe kann während der Verarbeitung der zugehörigen Indizes im Speicher gehalten werden. Die angeheftete Journalgruppe kann die Änderungen an den in den zugehörigen Indizes enthaltenen Referenzzahlen speichern. In einigen Implementierungen kann ein Countdown-Zähler mit der Anzahl der zugehörigen Indizes initialisiert werden, die Änderungen an ihren Referenzzählungen aufweisen. Wenn jeder Index abgeschlossen ist, kann der Countdown-Zähler dekrementiert werden. Wenn der Countdown-Zähler gleich Null ist, wurde die Journalgruppe so aktualisiert, dass sie alle Referenzzählungsänderungen für die zugehörigen Indizes enthält. Dementsprechend wird die Journalgruppe aus dem Speicher entfernt und in den Speicher geschrieben. Auf diese Weise kann die beschriebene Technik die Anzahl der Ladevorgänge einer Journalgruppe in den Speicher und die Anzahl der Schreibvorgänge der Journalgruppe in den Speicher reduzieren und dadurch die Leistung des Deduplizierungsspeichersystems verbessern.
-
Beachten Sie, dass die verschiedene Beispiele zeigen, sind die Implementierungen in dieser Hinsicht nicht beschränkt. Beispielsweise kann das Speichersystem 100, wie in dargestellt, zusätzliche Geräte und/oder Komponenten, weniger Komponenten, andere Komponenten, andere Anordnungen usw. enthalten. Ein weiteres Beispiel ist, dass die oben beschriebene Funktionalität des Speicher-Controllers 110 in einer anderen Maschine oder Software des Speichersystems 100 enthalten sein kann. Andere Kombinationen und/oder Variationen sind ebenfalls möglich.
-
Daten und Anweisungen werden in entsprechenden Speichervorrichtungen gespeichert, die als ein oder mehrere computerlesbare oder maschinenlesbare Speichermedien ausgeführt sind. Zu den Speichermedien gehören verschiedene Formen von nicht transitorischen Speichern, darunter Halbleiterspeicher wie dynamische oder statische Direktzugriffsspeicher (DRAMs oder SRAMs), löschbare und programmierbare Festwertspeicher (EPROMs), elektrisch löschbare und programmierbare Festwertspeicher (EEPROMs) und Flash-Speicher; Magnetplatten wie Fest-, Disketten- und Wechselplatten; andere magnetische Medien einschließlich Bänder; optische Medien wie Compact Discs (CDs) oder digitale Videodisks (DVDs) oder andere Arten von Speichervorrichtungen.
-
Es ist zu beachten, dass die oben erörterten Anweisungen auf einem einzigen computerlesbaren oder maschinenlesbaren Speichermedium oder alternativ auf mehreren computerlesbaren oder maschinenlesbaren Speichermedien bereitgestellt werden können, die in einem großen System mit möglicherweise mehreren Knotenpunkten verteilt sind. Ein solches computerlesbares oder maschinenlesbares Speichermedium oder solche Speichermedien werden als Teil eines Artikels (oder eines Herstellungsartikels) betrachtet. Ein Artikel oder Herstellungsgegenstand kann sich auf jede hergestellte Einzelkomponente oder auf mehrere Komponenten beziehen. Das Speichermedium oder die Speichermedien können sich entweder in der Maschine befinden, auf der die maschinenlesbaren Anweisungen ausgeführt werden, oder an einem entfernten Standort, von dem maschinenlesbare Anweisungen über ein Netzwerk zur Ausführung heruntergeladen werden können.
-
In der vorstehenden Beschreibung sind zahlreiche Details aufgeführt, um ein Verständnis des hierin offengelegten Themas zu vermitteln. Allerdings können Implementierungen ohne einige dieser Details praktiziert werden. Andere Implementierungen können Modifikationen und Abweichungen von den oben beschriebenen Details enthalten. Es ist beabsichtigt, dass die beigefügten Ansprüche solche Modifikationen und Variationen abdecken.