Unter OSX sind es beispielsweise sogar weniger als 512 KB.
Gibt es eine empfohlene Größe, wenn man bedenkt, dass die App keine Rekursion verwendet und nicht viele Stapelvariablen zuweist ?
Ich weiß, dass die Frage zu weit gefasst ist und stark von der Verwendung abhängt, wollte sie aber trotzdem stellen, da ich mich gefragt habe, ob hinter dieser riesigen Zahl ein versteckter / interner / systembedingter Grund steckt.
Ich habe mich gefragt, ob ich beabsichtige, die Stapelgröße in meiner App auf 512 KiB zu ändern - dies klingt immer noch nach einer großen Zahl, ist aber viel kleiner als 8 MB - und wird zu einem deutlich verringerten virtuellen Speicher des Prozesses führen, wie ich habe viele Threads (I / O).
Ich weiß auch, dass dies nicht wirklich weh tut, was hier gut erklärt wird : Standardstapelgröße für Pthreads
quelle
Antworten:
Wie andere gesagt haben und wie in dem Link erwähnt, den Sie in Ihrer Frage angeben, schadet ein 8-MB-Stack nichts (abgesehen vom Verbrauch von Adressraum - auf einem 64-Bit-System, das keine Rolle spielt).
Linux verwendet seit sehr langer Zeit 8MiB-Stacks. Die Änderung wurde im Juli 1995 in Version 1.3.7 des Kernels eingeführt. Damals wurde sie als Einführung eines Limits vorgestellt, zuvor gab es kein Limit:
Unter Linux wirkt sich das Stapellimit auch auf die Größe der Programmargumente und der Umgebung aus, die auf ein Viertel des Stapellimits begrenzt sind . Der Kernel erzwingt mindestens 32 Seiten für die Argumente und die Umgebung.
Wenn für Threads das Stack-Limit (
RLIMIT_STACK
) unbegrenzt ist, werdenpthread_create
für die Stacks neuer Threads eigene Limits angewendet - und auf den meisten Architekturen sind dies weniger als 8 MB.quelle
top
zeige es in beängstigenden VIRT-Ergebnissen. Wenn Sie etwas tiefer graben, wird der größte Teil dieses virtuellen Adressraums aus den Arenen pro Thread (Speicher) und nicht aus der Stapelgröße entnommen, sodass durch Verringern der Stapelgröße der virtuelle Speicher nicht drastisch reduziert wird. Ich war nur neugierig, warum 8MiB und warum so viel.top
eine viel bessere Antwort auf die Frage, welchen Speicher dieser Prozess tatsächlich verwendet, als in VIRT.8 MB ist die virtuelle Größe des Stapels. Ein Seitenfehler tritt auf, wenn Ihre Anwendung versucht, mehr Stapel zu verwenden, als derzeit physisch zugewiesen ist. Der Seitenfehler-Handler des Kernels weist dann eine physische Seite zu und Ihre Anwendung wird fortgesetzt.
Eine vollständige Erklärung finden Sie unter /unix//a/280865/21212 .
Das Reduzieren der Stapelgröße sollte daher keine Auswirkungen auf die Reduzierung der physischen Speichernutzung Ihrer Anwendung haben.
quelle