20Aug

Wie viele Speicheradressen kann das RAM in meinem Computer halten?

Irgendwann macht es Spaß, die Oberfläche des Computer-Erlebnisses zu betrachten, und an anderen Tagen macht es Spaß, direkt in die inneren Abläufe einzutauchen. Heute werfen wir einen Blick auf die Struktur des Computerspeichers und wie viele Sachen man in einen RAM-Speicher packen kann.

Die heutige Frage &Die Antwortsitzung kommt dank SuperUser, einer Unterteilung von Stack Exchange, einer Community-gesteuerten Gruppierung von Q & A-Websites, zu uns.

Die Frage

SuperUser-Leser Johan Smohan beschäftigt sich mit der Frage, wie der Prozessortyp und die Speichergröße zusammenarbeiten, um eine Gesamtanzahl von Adressen zu erhalten. Er schreibt:

Wie viele Speicheradressen können wir mit einem 32-Bit-Prozessor und 1 GB RAM und wie viele mit einem 64-Bit-Prozessor bekommen?

Ich denke, dass es in etwa so ist:

1 GB RAM geteilt durch entweder 32 Bits 4 Bits( ?), Um die Anzahl der Speicheradressen zu erhalten?

Ich lese auf Wikipedia, dass 1 Speicheradressen 32 Bit breit oder 4 Oktetts ist( 1 Oktett = 8 Bit), im Vergleich zu einem 64-Bit-Prozessor, wo 1 Speicheradressen oder 1 Ganzzahl 64 Bit breit oder 8 Oktetts ist. Aber weiß nicht, ob ich es auch richtig verstanden habe.

Dies sind die Arten von Fragen, die einen neugierigen Freak in der Nacht halten können. Wie viele Adressen sind unter jedem von Johans hypothetischen Systemen verfügbar?

Der Antwort-

-SuperUser-Mitwirkender Gronostaj bietet einen Einblick in die Aufteilung und Nutzung des RAM:

Kurze Antwort: Die Anzahl der verfügbaren Adressen entspricht der kleineren:

  • Speichergröße in Bytes
  • Größte vorzeichenlose Ganzzahl, die gespeichert werden kannim Maschinenwort der CPU

Lange Antwort und Erklärung des Obigen:

Speicher besteht aus Bytes( B).Jedes Byte besteht aus 8 Bits( b).

1 B = 8 b

1 GB RAM ist eigentlich 1 GiB( Gibibyte, nicht Gigabyte).Der Unterschied ist:

1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B

Jedes Speicherbyte hat eine eigene Adresse, unabhängig davon, wie groß das Maschinenwort der CPU ist. Z.B.Intel 8086 CPU war 16-Bit und adressierte Speicher byteweise, also moderne 32-bit und 64-bit CPUs. Das ist der Grund für das erste Limit - Sie können nicht mehr Adressen als Speicherbytes haben.

Die Speicheradresse ist nur eine Anzahl von Bytes, die die CPU vom Anfang des Speichers überspringt, um zu demjenigen zu gelangen, nach dem sie sucht.

  • Um auf das erste Byte zugreifen zu können, müssen 0 Bytes übersprungen werden, so dass die Adresse des ersten Bytes 0 ist.
  • Um auf das zweite Byte zuzugreifen, muss 1 Byte übersprungen werden, daher ist die Adresse 1.
  • ( und so weiter. ..)
  • Um auf dieLetztes Byte, CPU überspringt 1073741823 Bytes, also ist die Adresse 1073741823.

Jetzt müssen Sie wissen, was 32-Bit tatsächlich bedeutet. Wie ich bereits erwähnt habe, ist es die Größe eines Maschinenworts.

Maschinenwort ist die Speichermenge, die die CPU zum Speichern von Zahlen verwendet( im RAM, Cache oder internen Registern).32-Bit-CPU verwendet 32 ​​Bits( 4 Bytes), um Zahlen zu halten. Speicheradressen sind ebenfalls Zahlen, so dass bei einer 32-Bit-CPU die Speicheradresse aus 32 Bits besteht.

Denken Sie jetzt darüber nach: Wenn Sie ein Bit haben, können Sie zwei Werte speichern: 0 oder 1. Fügen Sie ein weiteres Bit hinzu und Sie haben vier Werte: 0, 1, 2, 3. Auf drei Bits können Sie acht speichernWerte: 0, 1, 2. .. 6, 7. Dies ist eigentlich ein Binärsystem und es funktioniert so:

Binär Dezimal 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 111011 12 1100 13 1101 14 1110 15 1111

Es funktioniert genau wie normale Addition, aber die maximale Ziffer ist 1, nicht 9. Dezimal 0 ist 0000, dann addierst du 1 und bekommst 0001, addierst noch einmal und du hast 0010. Was?hier passiert ist, als hätte man Dezimal 09 und fügt eins hinzu: man ändert 9 auf 0 und erhöht die nächste Ziffer.

Aus dem obigen Beispiel können Sie sehen, dass es immer einen maximalen Wert gibt, den Sie in einer Zahl mit konstanter Anzahl von Bits behalten können - denn wenn alle Bits 1 sind und Sie versuchen, den Wert um 1 zu erhöhen, werden alle Bits 0 und brechendie Nummer. Es heißt Integer Overflow und verursacht viele unangenehme Probleme, sowohl für Benutzer und Entwickler.

11111111 = 255 + 1 ----------- 100000000 = 0( 9 Bits hier, also 1 ist getrimmt)
  • Für 1 Bit ist der größte Wert 1,
  • 2 Bit - 3,
  • 3 Bit -7,
  • 4 Bits - 15

Die größtmögliche Anzahl ist immer 2 ^ N-1, wobei N die Anzahl der Bits ist. Wie ich bereits sagte, ist eine Speicheradresse eine Zahl und sie hat auch einen maximalen Wert. Deshalb ist die Größe des Maschinenworts auch eine Grenze für die Anzahl der verfügbaren Speicheradressen - manchmal kann Ihre CPU die Nummern nicht verarbeiten, die groß genug sind, um mehr Speicher zu adressieren.

Also auf 32 Bits können Sie Zahlen von 0 bis 2 ^ 32-1 behalten, und das ist 4 294 967 295. Es ist mehr als die größte Adresse in 1 GB RAM, so dass in Ihrem speziellen Fall wird die Menge an RAM der begrenzende Faktor sein.

Das RAM-Limit für eine 32-Bit-CPU beträgt theoretisch 4 GB( 2 ^ 32) und für eine 64-Bit-CPU 16 EB( Exabytes, 1 EB = 2 ^ 30 GB).Mit anderen Worten, die 64-Bit-CPU könnte das gesamte Internet. .. 200 Mal adressieren;)( geschätzt von WolframAlpha).

In realen Betriebssystemen können 32-Bit-CPUs jedoch etwa 3 GiB RAM adressieren. Das liegt an der internen Architektur des Betriebssystems - einige Adressen sind für andere Zwecke reserviert. Sie können mehr über diese so genannte 3 GB-Barriere auf Wikipedia lesen. Sie können dieses Limit mit Physical Address Extension anheben.

Wenn ich über die Speicheradressierung spreche, gibt es einige Dinge, die ich erwähnen sollte: virtueller Speicher , Segmentierung und Paging .

Virtueller Speicher

Wie OSDiel R Hicks in einer anderen Antwort darauf hingewiesen hat, verwenden Betriebssysteme virtuellen Speicher. Was es bedeutet, dass Anwendungen tatsächlich nicht an realen Speicheradressen arbeiten, sondern an solchen, die vom Betriebssystem bereitgestellt werden.

Mit dieser Technik kann das Betriebssystem einige Daten aus dem RAM in ein sogenanntes Pagefile( Windows) oder Swap( * NIX) verschieben. HDD ist einige Größenordnungen langsamer als RAM, aber es ist kein ernsthaftes Problem für Daten, auf die nur selten zugegriffen wird, und es ermöglicht OS, Anwendungen mehr RAM zur Verfügung zu stellen, als Sie tatsächlich installiert haben.

Paging

Was wir bisher besprochen haben, heißt Flat-Adressing-Schema.

Paging ist ein alternatives Adressierungsschema, mit dem mehr Speicher adressiert werden kann, als normalerweise mit einem Maschinenwort im flachen Modell.

Stellen Sie sich ein Buch mit vier Buchstaben vor. Angenommen, auf jeder Seite befinden sich 1024 Zahlen. Um eine Nummer zu adressieren, müssen Sie zwei Dinge wissen:

  • Die Nummer der Seite, auf der das Wort gedruckt wird.
  • Welches Wort auf dieser Seite suchen Sie?

Genau so handhaben moderne x86-CPUs Speicher. Es ist in 4 KiB-Seiten( jeweils 1024 Maschinenwörter) unterteilt und diese Seiten haben Nummern.(Die Seiten können auch 4 MiB groß oder 2 MiB mit PAE sein).Wenn Sie eine Speicherzelle adressieren möchten, benötigen Sie die Seitenzahl und die Adresse auf dieser Seite. Beachten Sie, dass jede Speicherzelle von genau einem Paar Zahlen referenziert wird, was für die Segmentierung nicht der Fall ist.

Segmentierung

Nun, dieser ist dem Paging sehr ähnlich. Es wurde in Intel 8086 verwendet, um nur ein Beispiel zu nennen. Gruppen von Adressen heißen jetzt Speichersegmente, keine Seiten. Der Unterschied besteht darin, dass Segmente sich überschneiden können und sich überschneiden. Zum Beispiel waren auf 8086 die meisten Speicherzellen aus 4096 verschiedenen Segmenten verfügbar.

Ein Beispiel:

Nehmen wir an, wir haben 8 Bytes Speicher, die alle Nullen enthalten, bis auf das vierte Byte, das gleich 255 ist.

Abbildung für flaches Speichermodell:

_____ |0 ||0 ||0 ||255 ||0 ||0 ||0 ||0 |-----

Abbildung für ausgelagerten Speicher mit 4-Byte-Seiten:

PAGE0 _____ |0 ||0 ||0 |SEITE1 |255 |_____ ----- |0 ||0 ||0 ||0 |-----

Darstellung für segmentierten Speicher mit um 1 verschobenen 4-Byte-Segmenten:

SEG 0 _____ SEG 1 |0 |_____ SEG 2 |0 ||0 |_____ SEG 3 |0 ||0 ||0 |_____ SEG 4 |255 ||255 ||255 ||255 |_____ SEG 5 ----- |0 ||0 ||0 ||0 |_____ SEG 6 ----- |0 ||0 ||0 ||0 |_____ SEG 7 ----- |0 ||0 ||0 ||0 |_____ ----- |0 ||0 ||0 ||0 |----- ----- ----- -----

Wie Sie sehen können, kann das vierte Byte auf vier Arten adressiert werden:( Adressierung von 0)

  • Segment 0, Offset 3
  • Segment 1,Offset 2
  • Segment 2, Offset 1
  • Segment 3, Offset 0

Es ist immer dieselbe Speicherzelle.

In realen Implementierungen werden Segmente um mehr als 1 Byte verschoben( bei 8086 waren es 16 Byte).

Was an der Segmentierung schlecht ist, ist, dass es kompliziert ist( aber ich denke, dass du das bereits weißt;) Was gut ist, ist, dass du einige clevere Techniken verwenden kannst, um modulare Programme zu erstellen.

Zum Beispiel können Sie ein Modul in ein Segment laden, dann so tun, als wäre das Segment kleiner als es wirklich ist( gerade klein genug, um das Modul zu halten), dann wählen Sie das erste Segment, das sich nicht mit diesem pseudo-kleineren überlappt und lädtnächstes Modul und so weiter. Was Sie auf diese Weise erhalten, sind Seiten mit variabler Größe.

Haben Sie etwas zur Erklärung hinzuzufügen? Ton in den Kommentaren ab. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange Benutzern lesen? Sehen Sie sich den vollständigen Diskussionsfaden hier an.