Re: malloc() Fehler

From: Oliver Fromme <olli(at)dorifer.heim3.tu-clausthal.de>
Date: Tue, 10 Aug 1999 17:11:46 +0200 (CEST)

Yves Jäger schrieb in list.de-bsd-questions:
> Mein Problem ist, dass sowohl unter FreeBSD 2.2.7 als auch unter FreeBSD
> 3.2 mit malloc() mehr Speicher alloziert werden kann als physikalisch
> ueberhaupt vorhanden ist.

Das ist ein Feature, es nennt sich "memory overcommit".

> Wenn in /etc/login.conf datazisze begrenzt ist, stuerzt das Programm bei
> malloc() mit einem Code-Dump (Abort-Trap) ab. Die physikalische Grenze
> hingegen wird nicht ueberprueft.

Das ist die zu erwartende Verhaltensweise.

> Im untenstehende Programm, wird ein Buffer von ca. 256MB alloziert
> (wobei ich nur 64MB RAM und 96MB Swap habe).
> Danach wird dieser Buffer mit Nullen gefuellt. Irgendwann ist
> physikalisch kein Speicher mehr vorhanden und das Programm wird gekillt
> mit der Fehlermeldung:
> swap_pager: out of swap space
> Killed
> <date> <foo> /kernel: pid 334 (test), uid 0, was killed: out of swap
> space
>
> Falls ich den Eintrag fuer die Swap-Partition in der /etc/fstab
> auskommentiere, kommt nur die Meldung:
> Killed

Auch das ist das normale Verhalten.

> Falls das Programm zusaetzlich /dev/io geoeffnet hat (ich weiss, sollte
> man eigentlich nicht machen), kommt ueberhaupt keine Fehlermeldung und
> FreeBSD haengt sich auf:

Wenn Du /dev/io öffnest, solltest Du auf jeden Fall genau
wissen, was Du tust. Wenn da etwas schiefgeht, kann alles
mögliche passieren.

In diesem speziellen Fall läuft der Kernel noch munter vor
sich hin, aber ansonsten tut sich nix mehr.

> - Es werden keine Tastendrücke mehr verarbeitet (<Strg>-C, ...)

Sie kommen bei keinem Programm mehr an.

> - Nur zwischen den Virtuellen Konsolen kann nur hin- und her-
> geswitscht werden.

Das macht der Kernel alleine.

> - ping von einem anderen Rechner funktioniert noch

Dito.

> - telnet dagegen nicht.

Dazu braucht's den inetd.

> Meine Frage ist nun folgende:
> Kann malloc() so konfiguriert(?) werden, dass maximal nur
> soviel Speicher wie physikalisch verfuegbar ist alloziert werden kann
> ?
> Falls mehr Speicher alloziert werden möchte, soll malloc() NULL
> zurückgeben und errno auf ENOMEM setzen.

Das ist nicht möglich (und meiner Meinung nach auch nicht
sinnvoll). UNIX verwendet das Konzept des "virtual memory",
und ein Programm sollte gar nicht wissen müssen, wieviel
physikalischer RAM in einem System vorhanden ist, geschweige
denn davon in irgendeiner Weise abhängig sein. Es ist allein
Aufgabe des Betriebssystems, den Speicher so effizient wie
möglich zu verwalten, und ich denke, daß FreeBSD in dieser
Hinsicht seine Aufgabe hervorragend erledingt.

Gruß
   Oliver

-- 
Oliver Fromme, Leibnizstr. 18/61, 38678 Clausthal, Germany
(Info: finger userinfo:olli(at)dorifer.heim3.tu-clausthal.de)
"In jedem Stück Kohle wartet ein Diamant auf seine Geburt"
                                         (Terry Pratchett)
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 10 Aug 1999 - 17:12:00 CEST

search this site