Das Speichersubsystem eines modernen Prozessors ist auf den Zugriff auf Speicher mit der Granularität und Ausrichtung seiner Wortgröße beschränkt. Dies ist aus mehreren Gründen der Fall.
Geschwindigkeit
Moderne Prozessoren verfügen über mehrere Ebenen des Cache-Speichers, durch die Daten gezogen werden müssen. Das Unterstützen von Einzelbyte-Lesevorgängen würde den Durchsatz des Speichersubsystems eng an den Durchsatz der Ausführungseinheit binden (auch bekannt als CPU-gebunden). Dies alles erinnert daran, wie der PIO-Modus von DMA aus vielen der gleichen Gründe auf Festplatten übertroffen wurde .
Die CPU liest immer mit ihrer Wortgröße (4 Byte auf einem 32-Bit-Prozessor). Wenn Sie also einen nicht ausgerichteten Adresszugriff durchführen - auf einem Prozessor, der dies unterstützt -, liest der Prozessor mehrere Wörter. Die CPU liest jedes Speicherwort, das Ihre angeforderte Adresse überspannt. Dies bewirkt eine bis zu zweifache Verstärkung der Anzahl von Speichertransaktionen, die für den Zugriff auf die angeforderten Daten erforderlich sind.
Aus diesem Grund kann es sehr leicht langsamer sein, zwei Bytes als vier zu lesen. Angenommen, Sie haben eine Struktur im Speicher, die folgendermaßen aussieht:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
Auf einem 32-Bit-Prozessor würde es höchstwahrscheinlich wie hier gezeigt ausgerichtet sein:
Der Prozessor kann jedes dieser Mitglieder in einer Transaktion lesen.
Angenommen, Sie hatten eine gepackte Version der Struktur, möglicherweise aus dem Netzwerk, in dem sie aus Gründen der Übertragungseffizienz gepackt wurde. es könnte ungefähr so aussehen:
Das Lesen des ersten Bytes wird dasselbe sein.
Wenn Sie den Prozessor bitten, Ihnen 16 Bit von 0x0005 zu geben, muss er ein Wort von 0x0004 lesen und 1 Byte nach links verschieben, um es in ein 16-Bit-Register zu legen. etwas zusätzliche Arbeit, aber die meisten können das in einem Zyklus erledigen.
Wenn Sie von 0x0001 nach 32 Bit fragen, erhalten Sie eine 2-fache Verstärkung. Der Prozessor liest von 0x0000 in das Ergebnisregister und verschiebt 1 Byte nach links, liest dann erneut von 0x0004 in ein temporäres Register, verschiebt 3 Byte nach rechts und dann OR
mit dem Ergebnisregister.
Angebot
Wenn die Architektur für einen bestimmten Adressraum davon ausgehen kann, dass die 2 LSBs immer 0 sind (z. B. 32-Bit-Maschinen), kann sie auf viermal mehr Speicher zugreifen (die zwei gespeicherten Bits können vier verschiedene Zustände darstellen) oder auf dieselbe Menge Speicher mit 2 Bits für so etwas wie Flags. Wenn Sie die 2 LSBs von einer Adresse entfernen, erhalten Sie eine 4-Byte-Ausrichtung. wird auch als Schritt von 4 Bytes bezeichnet. Jedes Mal, wenn eine Adresse inkrementiert wird, wird Bit 2 und nicht Bit 0 effektiv inkrementiert, dh die letzten 2 Bits bleiben immer bestehen 00
.
Dies kann sich sogar auf das physische Design des Systems auswirken. Wenn der Adressbus 2 weniger Bits benötigt, können 2 weniger Pins auf der CPU und 2 weniger Spuren auf der Leiterplatte vorhanden sein.
Atomizität
Die CPU kann atomar mit einem ausgerichteten Speicherwort arbeiten, was bedeutet, dass kein anderer Befehl diesen Vorgang unterbrechen kann. Dies ist entscheidend für den korrekten Betrieb vieler sperrenfreier Datenstrukturen und anderer Parallelitätsparadigmen .
Fazit
Das Speichersystem eines Prozessors ist wesentlich komplexer und komplizierter als hier beschrieben; Eine Diskussion darüber, wie ein x86-Prozessor tatsächlich den Speicher adressiert, kann helfen (viele Prozessoren arbeiten ähnlich).
Die Einhaltung der Speicherausrichtung bietet noch viele weitere Vorteile, die Sie in diesem IBM Artikel lesen können .
Die Hauptverwendung eines Computers besteht darin, Daten zu transformieren. Moderne Speicherarchitekturen und -technologien wurden über Jahrzehnte hinweg optimiert, um das Ein- und Auslesen von mehr Daten zwischen mehr und schnelleren Ausführungseinheiten auf äußerst zuverlässige Weise zu ermöglichen.
Bonus: Caches
Eine andere Ausrichtung für die Leistung, auf die ich zuvor hingewiesen habe, ist die Ausrichtung auf Cache-Zeilen, die (zum Beispiel auf einigen CPUs) 64B sind.
Weitere Informationen darüber, wie viel Leistung durch die Nutzung von Caches erzielt werden kann, finden Sie in der Galerie der Prozessor-Cache-Effekte . von dieser Frage auf Cache-Zeilengrößen
Das Verständnis der Cache-Zeilen kann für bestimmte Arten von Programmoptimierungen wichtig sein. Beispielsweise kann die Ausrichtung von Daten bestimmen, ob eine Operation eine oder zwei Cache-Zeilen berührt. Wie wir im obigen Beispiel gesehen haben, kann dies leicht bedeuten, dass im falsch ausgerichteten Fall der Vorgang zweimal langsamer ist.