Wie kann ich mir die Arbeitsweise des Arbeitsspeichers vorstellen?

davidh38

Bekanntes Mitglied
Hallo,

also erstes würde ich gern wissen, wie ich mir den Arbeitsspeicher vorstellen soll?


Die Vorstellung von mir war bislang immer, dass der ARbeitsspeicher mit durchnummeriert, etwa so

0x000001 000000000 0x00000002 0x0000000

Das ist natürlich quatsch, weil ich so nur 32-bit zahlen ablegen könnte und außerdem auch die Adressen ändern könnte, was ja die such nach einem Wert und seiner Eindeutigkeit erheblich erschweren würde.

Kennt jemand zufällig eine Seite auf der das erklärt ist oder kann mir das vielleicht jemand in einfacher Weise erklären?
 

davidh38

Bekanntes Mitglied
Beschreib' mal genauer, was du da meinst. Der Speicher ist im Prinzip schon so "durchnummeriert" - wenn auch byteweise und nicht int (32bit)-weise...

Also wenn ich etwas irgendwo abspeichere, dann denke ich, dass ich eine Adresse benötige, damit ich weiß, wo ich etwas abgespeichert habe.

Folgendes Szenario verdeutlicht vielleicht was ich meine.

Ein Rechner sucht im Arbeitsspeicher einen Wert unter einer Adresse 1234567. Sagen wir er fängt vom Anfang des Speichers an, diese Adresse zu suchen. Wie kann er unterscheiden, ob es sich überhaupt um eine Adresse und nicht um einen Wert handelt der unter einer Adresse abgespeichert worden ist?
 

tfa

Top Contributor
Stell dir das so vor: Du hast eine Million Schuhkartons in einer Reihe stehen. Die sind mit den Zahlen 0 bis 999999 durchnumeriert. Das sind die Adressen, die fest aufgedruckt sind und sich auch nicht ändern lassen. In jeden Karton passt jetzt ein Byte. Wenn man das Byte an Position 100000 lesen will, schau man einfach da rein. Da die Kartons ja alle in einer Reihe stehen, findet man den auch sofort ohne zu suchen.
 

davidh38

Bekanntes Mitglied

Marco13

Top Contributor
Das ist ungefähr so wie die Frage, ob in eine Straße doppelt so viele Häuser passen würden, wenn sie keine Hausnummern hätten :D Die Adresse ist nicht direkt iregndwo "abgespeichert" - man kann es sich wirklich als eine Zahl vorstellen, die nur die Stelle beschreibt, an der etwas steht.

Bei "hardwarenäheren" Programmiersprachen wie C gibt es so genannte "Zeiger". Das sind praktisch Variablen, die eine Adresse enthalten können. Mit diesen Adressen kann man dann ganz normal rumrechnen. Wenn man also sowas hat wie
[c]int *zeiger = 0x12345678;[/c]
dann kann man da einfach sowas machen wie
[c]int *weiterHinten = zeiger + 123;[/c]
um den Zeiger auf eine andere Speicherstelle zeigen zu lassen.
 

davidh38

Bekanntes Mitglied
Das ist ungefähr so wie die Frage, ob in eine Straße doppelt so viele Häuser passen würden, wenn sie keine Hausnummern hätten :D Die Adresse ist nicht direkt iregndwo "abgespeichert" - man kann es sich wirklich als eine Zahl vorstellen, die nur die Stelle beschreibt, an der etwas steht.

Bei "hardwarenäheren" Programmiersprachen wie C gibt es so genannte "Zeiger". Das sind praktisch Variablen, die eine Adresse enthalten können. Mit diesen Adressen kann man dann ganz normal rumrechnen. Wenn man also sowas hat wie
[c]int *zeiger = 0x12345678;[/c]
dann kann man da einfach sowas machen wie
[c]int *weiterHinten = zeiger + 123;[/c]
um den Zeiger auf eine andere Speicherstelle zeigen zu lassen.


Okay, dann meine letzte Frage:

Wenn ich z.b.
int x = 5; schreibe und sagen wir mal der der int ist 32-bit groß. Dann speichert er die Variable an vier Speicheradressen, (die vermutlich direkt hintereinander sind). Woher weiß nun, der Rechner, dass es sich um ein Int handelt, wenn er das x liest? Wird zusätzlich noch mehr Informationen abgespeichert, wie z.B. dass es sich bei der Variable um einen Int handelt?
 

Marco13

Top Contributor
Nein, nicht direkt. Sowas wie "int x = 123;" ist auch etwas, was in bezug auf den Speicher sehr unterschiedliche Bedeutungen haben kann, je nachdem, ob es als Instanzvariable in einer Klasse steht
Code:
class X
{
    int x = 123;
}
oder als lokale Variable in einer Methode
Code:
void m()
{
   int x = 123;
}

Allgemein muss man da auch ein bißchen aufpassen: Java läuft ja nur auf der JVM, da gibt es sowas wie eine "Adresse" ja erstmal nicht, und mache dieser Hardwarebezogenen Dinge lassen sich nicht direkt auf Java übertragen. Bei Java ist vieles von dem, was direkt mit dem "echten Speicherchip im Computer" zu tun hat, durch die JVM wegabstrahiert.

Aber der Versuch, die konkrete Frage zu beantworten: Der Typ (int, in diesem Fall) wird NICHT mitgespeichert. Der Rechner hat keine Möglichkeit, zu erkennen, dass dort ein int steht - und er braucht das auch nicht. Das, was dort für den Rechner steht, ist eine Folge von 32 bits, die keine Bedeutung hat. Das kann ein int sein, oder ein float, oder 4 bytes, oder es kann für einen Befehl stehen, den er ausführen soll. Die Interpretation deser Speicherstelle als 'int' erfolgt nur durch das Programm, das diese Stelle ausliest, und z.B. eine int-Addition mit dem Inhalt einer anderen Speicherstelle durchführt. Wenn das, was dort stand, ein 'float' war, kommt halt Mist raus, aber dass das passiert, wird von der Sprache (d.h. quasi vom Compiler) i.a. von vornherein verhindert - außer bei solchen Dingen wie ByteBuffer (Java Platform SE 6) : Dort kann man einen 'int' reinlegen der dann an irgendeiner Speicherstelle landet, und dann sagen, dass er von genau dieser Stelle dann einen 'float' lesen soll - der dann nur Mist enthält, aber ... das ist dann die Schuld des Programmierers ;)
 

Ähnliche Java Themen

Neue Themen


Oben