On Fri, Feb 23, 2001 at 09:38:47AM +0100, Torsten Werner wrote:
Mensch, wer hat denn diesen Schwachsinn wieder angefangen? Gibt es keine besseren Themen? Es kommt mir vor, als wuerden hier Windows-DAUs diskutieren.
Das mag sein. Mir scheint auch, dass hier viele ziemlich aneinander vorbei reden und 10 verschiedene Dinge total vermischen.
Wer wirklich fachliches Interesse am Thema hat, sollte sich die Muehe machen, die Kernel-Listen-Archive zu lesen, und hier nicht unqualifiziert rumnerven.
Aha. Gut. Dann lassen wir mal alles "komplizierte" weg (also automatisch allokierten Speicher und die fork/exec-Sache mit copy on write) und begeben uns auf Niveau eines Schülers der 4. Klasse. In diesem Alter sollte man mit 3-stelligen ganzen Zahlen rechnen können. Also schauen wir doch dem 4-klässler mal bei seinen ersten Linuxerkundungen über die Schulter.
Er hat folgendes System:
rf11@max:~/tmp> uname -a Linux max 2.2.18 #1 Mon Feb 19 21:58:07 CET 2001 i586 unknown rf11@max:~/tmp> free total used free shared buffers cached Mem: 95788 41048 54740 20320 6460 15540 -/+ buffers/cache: 19048 76740 Swap: 266608 0 266608 rf11@max:~/tmp>
Also ein Linux-2.2 mit ca. 75 MB freien RAM und ca. 250 MB freiem Swap. Der Viertklässler erkennt sofort, dass er insgesamt 325 MB freien Speicher hat, da er schon richtig gut Addieren kann. "Sooo." denkt er sich: "Den Speicher will ich jetzt mal nutzen."
(das Programm sagt genau was es tut, der Code folgt unten, falls es jemand nicht glaubt)
rf11@max:~/tmp> ./a.out 300 Allokiere 300 MB: ok Allokiere zusätzlich noch 300 MB: ok gebe ggf. alles wieder frei Allokiere 600 MB in einem Stück: failed gebe ggf. alles wieder frei rf11@max:~/tmp>
Da hat unser Probant also von seinem Rechner nach der 2. Ausgabezeile tatsächlich 600 MB Speicher in zwei Teilen á 300 MB bekommen, obwohl sein Rechner doch eigentlich nur 325 MB hat. Der 4.-klässler staunt wie Sau und glaubt ab diesem Moment an die göttliche Speichervermehrung.
Nachdem er in Zeile 3 die 2*300 MB wieder freigegeben hat, holt er sich in Zeile 4 die 600 MB nochmal, diesmal aber als ein Stück. "Oooops!!!" sagt der 4-klässler "Das geht schief? Doch nix mit göttlicher Speichervermehrung?"
Unser 4-klässler ist nun völlig von der Rolle: 2*300 MB hat ihm seine Kiste gegeben, 600 MB am Stück hingegen nicht. Nachdem er sich das 2 Sekunden durch den Kopf gehen läßt, greift sich unser 4-klässler kurz an die Birne und gibt einen unverständlichen Ton von sich. Dann löscht er flugs das ulkige Linux von der Platte und installiert sich ein System, das ihn nicht so sehr bescheißt wie das Linux.
Ich kann ihn gut verstehen ...
... und ich kann die Leute nicht verstehen, die dieses, schon auf den ersten Blick völlig idiotische, Verhalten nicht stört.
Torsten: Während so ein gundlegendes Probleme in einem Stable-Kernel von vielen Entwicklern völlig ignoriert wird (bzw. zum Feature erklärt wird), streitet man sich auf der Kernelliste darüber, wie man noch 3% mehr Performance durch eine andere Strategie der Speicherverwaltung herausholt. Das ist mir als Nur-Nutzer sehr unverständlich.
Reinhard (bitte nur ernstgemeinte Zuschriften :-)
PS: Weil die Frage hier im Thread auch aufkam: Alle anderen Unixe haben das oben beschriebene Fehlverhalten von Linux nicht. Das ist wohl der Hauptgrund dafür, daß es bei den anderen Systemen um viele Größenordnungen seltener zu einem Speicherengpass kommt, den wir ja als ein generelles Problem für unixoide Systeme ausgemacht hatten.
--------------------------------- Nun noch der Code. Mich würde mal interessieren, was linux-2.4 dazu sagt.
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int mb; void *p1, *p2;
if (argc != 2) { printf("Ich will ne MB-Zahl als Parameter\n"); return -1; } mb = atoi(argv[1]); printf("Allokiere %d MB: ", mb); if ((p1 = malloc(mb*1024*1024)) == NULL) printf("failed\n"); else printf("ok\n");
printf("Allokiere zusätzlich noch %d MB: ", mb); if ((p2 = malloc(mb*1024*1024)) == NULL) printf("failed\n"); else printf("ok\n"); printf("gebe ggf. alles wieder frei\n"); if (p1 != NULL) free(p1); if (p2 != NULL) free(p2); printf("Allokiere %d MB in einem Stück: ", mb*2); if ((p1 = malloc(mb*1024*1024*2)) == NULL) printf("failed\n"); else printf("ok\n");
printf("gebe ggf. alles wieder frei\n"); if (p1 != NULL) free(p1);
return 0; }