pthread - Cannot allocate memory
-
Hallo,
Mein Programm:
Client - Server
Client kann Anfragen an Server senden welcher in seinem Wörterbuch die gefragten Einträge an den Client zurück sendet.Der Server erstellt für jede Anfrage ein Thread welches jeweils 1 Client bedient.
Soweit so gut. Doch nach ca. 380 Anfragen am Server gibt dieser den Geist auf mit der Fehlermeldung vom pthread_create: Cannot allocate memory.Was mich eigentlich wundert da die threads geschlossen werden mit pthread_exit(NULL).
Mit ps -au kann man sehen dass der virtuelle Speicher(VSZ) proportional zu den Threads steigt(die eigentlich den Speicher nach beenden wieder freigeben
).
Ich bin mit meinem Latein am Ende..
Bitte helft mir
-
Nun gut ich probiers mal in meiner Glaskugel
DaiweL schrieb:
Doch nach ca. 380 Anfragen am Server gibt dieser den Geist auf mit der Fehlermeldung vom pthread_create: Cannot allocate memory.
Was sagt "ulimit -a" ?
DaiweL schrieb:
Was mich eigentlich wundert da die threads geschlossen werden mit pthread_exit(NULL).
Ja na und? Wo allokierst du denn den Speicher? Der Heap liegt im gemeinsamen Kontext und wird nicht durch das Beenden eines Threads wieder deallokiert.
DaiweL schrieb:
Mit ps -au kann man sehen dass der virtuelle Speicher(VSZ) proportional zu den Threads steigt(die eigentlich den Speicher nach beenden wieder freigeben
).
Das ist ein "normales" Verhalten. Free() gibt den Speicher für neue Allokierungen wieder frei, aber es deallokiert ihn nicht, so daß du ihn nicht mehr mit "ps -au" siehst.
Du dürftest auch den Free Memory immer mehr gegen 0 gehen sehen, aber deswegen ist noch lange nicht all der Memory verbraucht. Stichwort Freelists und Speicherverwaltung vom OS.
Ein bissl Code wäre schön
-
Hmm also ulimit -a gibt:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
max nice (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
max rt priority (-r) unlimited
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimitedAlso meiner Meinung nach ziemlich unbegrenzt.
Doch was stopft den Speicher voll wenn die Threads sich beenden?
-
DaiweL schrieb:
Also meiner Meinung nach ziemlich unbegrenzt.
Richtig, bist auf den Stack
DaiweL schrieb:
Doch was stopft den Speicher voll wenn die Threads sich beenden?
Na ein malloc innerhalb der Threads, da der Speicher nach dem Beenden eines Threads nicht automatisch freigegeben wird.
DaiweL schrieb:
Hier mein Code.. etwas durcheinander geraten durch das viele rumprobieren...
Den Code kannst du ohne Fehler übersetzen... da sehe ich ja mit bloßem Auge "{}" bei der for-schleife in der funktion "trait_demande".
-
ok nun hab ich alle malloc's und free's rausgenommen, un das ganze statisch gemacht, doch noch immer gibt es eine ca. 380'er grenze *Heul*
-
Hiiiilfe
Wieso verweilen geschlossenen Threads denn noch auf dem Heap?
-
Wenn du nicht mit pthread_join() auf den Thread wartest, solltest du pthread_detach() aufrufen. Somit wird der Exit Status, nach der Terminierung des Threads, nicht aufbewahrt.
-
Dannnnke
genau das hat das Problem gelöst!!!!