LinuxWiki > LinuxProgrammierung > SpeicherManagment
Speicher-Managment unter Linux
Credits: Juergen Doser (überarbeitet von Wolfgang Koller); Stand: November 1998 (überarbeitet July 2002)
- Anwendung sendet eine Anfrage an das OS: "Ich benötige N Bytes Speicher, bitte gib mir den Platz frei!" (in C würde das mit "malloc(N)" gemacht werden )
- Im Normalfall meldet das OS: "Natürlich, gerne. Hier ist er:" und reserviert dann diesen Speicher für diese Anwendung und "malloc(N)" liefert einen Zeiger auf diesen Speicherbereich zurück (zumindest in C). In diesem Beispiel meldet das OS: "Tut mir leid, soviel hab Ich nicht mehr", es wird kein speicher reserviert und "malloc(N)" liefert NULL zurück.
- Gute Anwendungen hören auf das was das OS sagt, und können friedlich weiterleben (z.B. können sie dem Benutzer mitteilen, daß es etwas Speicher bräuchte, und er vielleicht ein paar andere Anwendungen schließen könnte). Unhöfliche Anwendungen hören nicht auf das OS, und verwenden den von "malloc(N)" zurückgegebenen NULL-Pointer, als ob er auf einen gültigen Speicherbereich zeigen würde. Sie versuchen also, an Adresse 'NULL' etwas zu speichern (sowas passiert aber wirklich nur bei sehr schlechter Software, zumindest absichtlich in einen NULL-Pointer zu schreiben).
- Das OS merkt, daß die Anwendung auf einen Speicherbereich zugreift, welcher ihr nicht gehört, und sagt: "So nicht! Tue Buße und stirb in Frieden". (d.h. das OS schickt das Signal SIGSEGV, also Segmentation fault, an diesen Prozess)
- Vorausschauende Anwendungen tun nun Buße, d.h. sie haben einen Signalhandler registriert, in dem sie z.B. wichtige Daten noch speichern können, und begehen dann geläutert Selbstmord (in C: exit(1)). Andere werden vom OS kaltblütig getötet.
Natürlich ist das alles jetzt nur sehr schematisch dargestellt, aber im Prinzip funktioniert das ganze so.
Nocheinmal zu den NULL-Pointern: Theorethisch sollten alle erstellten Pointer auf NULL-Pointer hin überprüft werden, das Problem ist nur oft fehlt diese Überprüfung, und daher kommt es zu solchen Abstürzen!