next up previous contents index
Next: 4.5 Betriebssystem Up: 4. Computer Previous: 4.3 Arbeitsweise eines Computers

Unterabschnitte

  
4.4 Speicher

Bereits in Abschnitt [*] haben wir den Hauptspeicher  eines Computers kennengelernt. In ihm werden die gerade auszuführenden Programme bzw. Programmteile sowie die benötigten Daten gespeichert.

Der Hauptspeicher eines Computers muß in der Regel vom Prozessor  sehr schnell zugreifbar sein und ist dementsprechend verhältnismäßig teuer. Zum langfristigen Speichern größer Datenmengen, die gerade nicht benötigt werden, können langsamere und billigere Speicher wie Magnetplattenspeicher, häufig auch als Festplatte  bezeichnet, verwendet werden. Erst bei Bedarf werden die Daten aus diesem sogenannten Hintergrundspeicher  in den Hauptspeicher geladen.

  
4.4.1 Zeichendarstellung im Speicher

Der Speicher eines Rechners besteht aus vielen einzelnen Speicherelementen . Jedes Speicherelement ist dabei in der Lage, einen von zwei erlaubten Zuständen anzunehmen; es repräsentiert ein Bit , die kleinste Darstellungseinheit für Daten in der binären Zahlendarstellung. Man kennzeichnet die beiden Zustände mit den Zeichen ,,0`` und ,,1``.

Im allgemeinen greift man nicht auf ein einzelnes Speicherelement sondern auf eine Speicherzelle  zu. Speicherzellen fassen dabei 8 einzelne Speicherelemente zusammen und repräsentieren ein sogenanntes Byte , also 8 Bit. Die Zusammenfassung mehrerer Speicherzellen (4 oder 8) wird auch als Speicherwort   bezeichnet.

Speicherelemente, -zellen und -wörter werden zum (dauerhaften) Abspeichern von Werten benutzt. Eine Speicherzelle kann demnach 21 = 2 verschiedene Werte abspeichern, ein Speicherelement 28 = 256 und ein Speicherwort 232 oder 264 Werte.

Sogenannte int-Variablen 4.1 dienen in Programmiersprachen zum Aufbewahren ganzzahliger Werte wie -4, 0 oder 1023. Für die Abspeicherung eines int-Wertes wird im allgemeinen ein Wort mit 4 Speicherzellen reserviert. Das bedeutet also, es können insgesamt 232verschiedene ganzzahlige Werte in einer int-Variablen gespeichert werden bzw. anders ausgedrückt, der Wertebereich einer int-Variablen ist beschränkt auf 232 verschiedene Werte.

  
4.4.2 Dualsystem

Werte müssen also zur Abspeicherung im Rechner in Folgen von Nullen und Einsen umgerechnet werden. Das Zahlensystem , das nur die beiden Ziffern ,,0`` und ,,1`` kennt, nennt man auch das Dualsystem . Wir rechnen normalerweise im Dezimalsystem ; dieses kennt die Ziffern ,,0``, ,,1``, ,,2``, ... ,,9``.

Stellen Sie sich vor, Sie wollen eine Dezimalzahl - bspw. die ,,23`` - im Rechner, genauer gesagt in einer int-Variablen, abspeichern. Wie erfolgt nun eine Umrechnung dieser Dezimalzahl in eine 32-stellige Dualzahl?

Es existieren verschiedene Codierungsverfahren. Bei dem gängigsten wird das erste der 32 Bits einer int-Variablen genutzt, um das Vorzeichen darzustellen: ,,1`` bedeutet, daß die Zahl negativ ist; ,,0`` bedeutet, daß die Zahl positiv ist. Somit können also 231 negative ganzzahlige Werte und 231-1 positive ganzzahlige Werte sowie die Null abgespeichert werden; der Wertebereich einer int-Variablen umfaßt alle Ganzen Zahlen zwischen -231 und 231-1. Größere bzw. kleinere ganzzahlige Werte können nicht dargestellt werden.

Die Umrechnung einer positiven Dezimalzahl in eine Dualzahl  erfolgt nach folgendem Schema: Man dividiert die umzurechnende Dezimalzahl ganzzahlig fortlaufend durch 2 bis die 0 erreicht wird und merkt sich jeweils den Rest der Division. Die Dualzahl ergibt sich anschließend durch das Lesen der Reste in umgekehrter Reihenfolge. Beispiel:

       23 : 2 = 11 R 1
       11 : 2 =  5 R 1
        5 : 2 =  2 R 1
        2 : 2 =  1 R 0
        1 : 2 =  0 R 1

D.h. die Dezimalzahl ,,23`` wird im Dualsystem durch die Ziffernfolge ,,10111`` dargestellt. Bei der Abspeicherung dieser Zahl in einer int-Variablen werden diesen fünf Ziffern 27 Nullen vorangestellt.

Zur Umrechnung einer negativen Ganzen Zahl ins Dualsystem gehen Sie folgendermaßen vor: Rechnen Sie zunächst die entsprechende positive Ganze Zahl wie oben beschrieben in eine Dualzahl um, kehren Sie dann alle Ziffern um (aus ,,0`` wird ,,1`` und aus ,,1`` wird ,,0``) und addieren Sie den Wert 1. Die Addition von Dualzahlen funktioniert dabei genauso wie die Addition von Dezimalzahlen, nur daß Sie lediglich 2 Ziffern zur Verfügung haben, so daß es viel schneller zu einem Übertrag kommt; ,,1`` + ,,1`` im Dualsystem ergibt also ,,10``. Beispiel:

        23 = 00..0010111
       -23 = 11..1101000 + 1 = 1..101001

Ein bei der Programmierung zu beachtender Effekt tritt auf, wenn Sie zum Wert 231-1 (2147483647), also dem größten in einer int-Variablen darzustellenden Wert, den Wert 1 addieren.

        0111..111      2147483647
      + 0000..001     +         1
      -----------     -----------
        1000..000     -2147483648

Wie Sie sehen, kippt hierbei das erste Bit um, das das Vorzeichen der Zahl bestimmt. Und in der Tat ergibt sich bei dieser Addition der Wert -231 (-2147483648). Das bedeutet: Das Verlassen des Wertebereich an einer Seite führt zum Eintreten in den Wertebereich an der anderen Seite.

  
4.4.3 Stack und Heap

Wird ein Programm aufgerufen, so wird - vereinfacht ausgedrückt - vom Betriebssystem  ein Speicherblock des Hauptspeichers freigegeben, in dem das Programm laufen kann. Dieser Laufzeitspeicher  besteht typischerweise aus vier Bereichen (siehe Abbildung [*]). Im ersten Bereich wird der Programmcode  selbst abgelegt, der zweite Bereich enthält statische Daten  wie globale Variablen des Programms. Die Größen dieser beiden Bereiche lassen sich bereits zur Compilierzeit ermitteln. Der dritte und vierte Bereich des Laufzeitspeichers sind variable groß, die Summe der beiden Größen ist jedoch in der Regel konstant. Den dritten Bereich nennt man Stack  und den vierten Bereich Heap .


  
Abbildung: Laufzeitspeicher
\begin{figure}
\centerline{\epsffile{part1/zeichnungen/computer.laufzeitspeicher.eps}}\end{figure}

Der Stack wird für die Verwaltung von Prozedur-  und Funktionsaufrufen4.2 benutzt. Wird eine Funktion aufgerufen, dann wird die Ausführung der gerade aktiven Funktion unterbrochen, und Informationen zum Zustand der Funktion wie die aktuellen Registerwerte werden auf dem Stack gespeichert. Wenn die Kontrolle nach Beendigung der aufgerufenen Funktion zurückkehrt, wird mit Hilfe der abgespeicherten Informationen der alte Zustand wiederhergestellt. Auch lokale Variablen von Funktionen werden auf dem Stack gespeichert.

Viele Programmiersprachen erlauben die Zuweisung von Speicherplatz für Daten unter Programmkontrolle; der Speicherplatz für diese Daten wird vom Heap genommen.


next up previous contents index
Next: 4.5 Betriebssystem Up: 4. Computer Previous: 4.3 Arbeitsweise eines Computers
Dietrich Boles
1999-05-31