Donnerstag, Dezember 12, 2019

Wie groß ist der stack-Speicher für ein bestimmtes Programm, und gibt es irgendwelche compiler-flags, die es einrichten können?

Als der Titel besagt: gibt es eine Allgemeine „Faustregel“ über die Größe der Stapel. Ich vermute, dass die Größe variieren je nach dem Betriebssystem, die Architektur, die Größe des cache(s), wie viel RAM verfügbar ist etc.

Kann jedoch nichts gesagt werden, im Allgemeinen, oder gibt es eine Möglichkeit, um herauszufinden, wie viel der stack diese Programm nutzen darf?. Als bonus-Frage gibt es eine Möglichkeit (mit compiler-flags usw. (denken meist C/C++ hier, aber auch allgemein)), dass die Größe des Stapels kann eingestellt werden, um eine Feste Größe, die durch den Benutzer?

Btw, ich Frage streng aus Neugier, ich bin nicht mit einem stack-überlauf. 🙂

  • Die Höhe der Stapel ein bestimmtes Programm zu verwenden ist, im Allgemeinen, unentscheidbaren (es ist äquivalent zu Halteproblem). Sind Sie Fragen, wie können Sie explizit erzwingen, eine begrenzte stack-Größe?
  • Diese Frage kann für Sie von Interesse sein stackoverflow.com/questions/156510/…
  • Erstmal danke! Aber warum ist diese unentscheidbaren und entspricht dem Halteproblem?
  • Die stack-Größe zur Verfügung, um Ihr Programm ist sehr gut definiert. Die Höhe der Stapel ein beliebiges Programm erfordert für die korrekte Funktion ist ähnlich wie das Halteproblem für diese Programme (und nur unentscheidbaren im Allgemeinen-die meisten spezifischen Programmen ermöglicht, eine Analyse).
  • Denn um zu bestimmen, die maximale stack-Auslastung, die Sie im Grunde brauchen, um zu analysieren, alle möglichen code-Pfade (die ich bin sicher, dass Sie sehen können ist sehr ähnlich zu dem problem, die durch das Halteproblem). In einigen (vielleicht auch vielen) Fällen, obwohl, dies kann ermittelt werden, über die statische Analyse. Aber Rekursion oder Funktion Zeiger machen dies schwierig.
  • „ist nur die unentscheidbaren im Allgemeinen-die meisten spezifischen Programmen ermöglicht, eine Analyse“ — korrekt. Ich habe gerade gehört Vint Cerf machen diese häufigen Fehler, zu fordern, ein Programm kann nicht herausfinden, was ein anderes Programm hat wegen der HP. Aber die HP sagt nur, dass es kein Programm, das feststellen kann, ob etwaige Programm wird angehalten. Diese hat so gut wie keine praktischen Konsequenzen, da, zum Beispiel, ist es möglich zu bestimmen, ob jedes Programm, das mit einer begrenzten Menge an Speicher halte. „Aber Rekursion oder Funktion Zeiger machen dies schwierig.“ — Irrelevant; HP über formale Unmöglichkeit, nicht zu Schwierigkeit.
  • „Werden Sie Fragen, wie können Sie explizit erzwingen, eine begrenzte stack-Größe?“ – Das ist, was er explizit danach gefragt. Offensichtlich, compiler-flags irrelevant sind, wie viel stack-Algorithmus erfordert.
  • Ich war mit denen als Beispiele dafür, Wann ein codebase kann der übergang von „offensichtlich statisch analysierbaren“ „oh, ja, das wäre schwierig zu analysieren“ (wie ein hand-waving Vorläufer von „unmöglich“).
  • Er fragte auch „wie groß ist der stack-Speicher für eine bestimmte Anwendung“. Aber ich bin einverstanden, auf einem zweiten Lesen, ist es offensichtlich, was war hier gefragt!
  • Allerdings ist das definitiv nicht mein Gebiet, also, wenn Sie sagen, dass es möglich ist, zu bestimmen, ob ein bounded-storage-Programm halte, werde ich wählen, zu glauben, Sie 😉
  • Begrenzt Speicher impliziert eine begrenzt Anzahl von Staaten. Für ein bestimmtes Programm, jedes dieser Staaten zugeordnet werden können und die nächsten aufeinanderfolgenden Zustand. Dann, für einen beliebigen Startpunkt Staat, Sie (ist, eine Turing-Maschine, die ist nicht begrenzt durch die Lebensdauer oder auch die Dauer des Universums) bestimmen kann, ob es erreicht einen halt-Zustand oder es ist Teil einer Schleife.
  • Ich sehe, danke. Also die Methode ist im wesentlichen simulieren Sie das Programm, bis entweder Sie schlagen eine Globale Zustand ist, den Sie bereits aufgetreten sind, oder Sie schlagen einen halt-Zustand, sowohl von der auftreten würde, in endlicher Zeit. In diesem Licht, die HP ist in der Tat völlig irrelevant hier!
  • Recht. Die HP ist oft falsch angewandt zu unpraktisch Analyse, wenn es sich eigentlich nur bezieht sich auf eine Generalisierung über alle Programme für die es eine formale mathematische Beweis der Unmöglichkeit, per reductio ad absurdum, mit selbst-Referenz a la Gödel-theorem (das kann in der Tat nachgewiesen werden, über die HP-Nachweis).
  • Unrelated: in der edit-queue, stieß ich auf eine Frage, Sie stimmten in triage. Sie, die falsche Wahl gemacht es. Bitte: studieren Sie die Hilfe für die triage, sehr vorsichtig und vermeiden Sie die Platzierung von Elementen in der edit-queue, die dort nicht hingehört. Bitte haben Sie Verständnis, dass Ihre Stimmen haben Konsequenzen! Ich bin speziell reden über stackoverflow.com/review/triage/20908430. Das sollte haben gewesen geschlossen als MCVE (keine Fehlermeldungen gegeben) oder „unklar“! Fühlen Sie sich frei zu fallen mir eine Bemerkung in den Fall Sie haben weitere Fragen oder feedback für mich.

InformationsquelleAutor Andersnk | 2013-03-11

2 Kommentare

  1. 3

    Ja, Sie können den stack-Größe, es ist in der Regel ein linker-flag, und es hängt von Ihrer toolchain (in der Regel bezeichnet durch den Namen des Compilers).

    Finden Sie auch mehrere vorhandene Fragen hier auf StackOverflow.

    • --stack im GCC/GNU-ld ist Windows-spezifisch. Es ist nicht auf andere Ziele.
    • Ist die option unterschiedlich geschrieben (-stack_size) oder Sie denken, es ist keine option?
    • Es ist keine option. Auf unix-Systemen, die maximale stack-Größe für den ersten thread ist bestimmt durch die ulimit Befehl/setrlimit Funktion, aber auf Linux, die reserviert/begangen stack-Größe ist fest auf etwa 128 Kb plus ein kleines extra, das scheint von der Umgebung abhängig sind (132k oder 136k ist typisch Gesamt). Wenn das Programm versucht, wächst der stack über, und es gibt Speicher frei, es kann wachsen bis zu der festgelegten Grenze von ulimit/setrlimit, aber es gibt keine Möglichkeit zu reservieren, die mehr als ~128k im moment exec stattfindet.
    • Gut, ich weiß, dass die meisten (vielleicht alle) der eingebetteten Ziele, die ich verwenden habe so eine linker-option. So scheint es, dass Linux ist die ungerade Mann heraus. Und ich glaube nicht, dass „memory free“ ist relevant, es sei denn, Sie deaktiviert haben, swap-und overcommit, das einzige, was zählt, ist, ob es ausreichend zusammenhängenden virtuellen Adressraum.
    • Ich normalerweise davon ausgehen, overcommit deaktiviert ist. Verlassen overcommit aktiviert, die Ergebnisse in eine schrecklich buggy, non-konform, gefährlich instabilen system. 🙂 Ja, auch wenn overcommit aktiviert ist, der Versuch, vergrößern Sie die Stapel werden können, was löst der OOM-killer zu töten, die Ihren Prozess.
    • Noch moderne Systeme sind viel eher Probleme mit dem virtuellen Adressraum Fragmentierung als run out of swap. Und Sie sollten Ihre Abneigung gegen overcommit mit der kernel-Entwickler.
    • Die stack-Wachstum normalerweise nicht gehemmt werden durch den Adressraum Fragmentierung; der kernel behält sich eine virtuelle Adresse, die Bereich gleich auf die RLIMIT_STACK Größe, bis zu einer angemessenen Grenze von mindestens 8 MB oder so, für die Zukunft Stapel Wachstum. Es spielt einfach keine reserve verpflichten Ladung.
    • Ihre obigen Ausführungen sind verwirrend reservieren und verpflichten, dann, weil Sie vorhin sagten, nur ~132k vorbehalten war.
    • OK, zur Klärung: der Virtuelle Adressraum Raum entsprechend dem Wert des RLIMIT_STACK ist reserviert für den stack; keine anderen Karten zugeordnet werden, die innerhalb dieser Entfernung, wo der stack beginnt. Nur bei den meisten ~132k berücksichtigt wird, wie Begehen Anklage gegen physische Unterstützung (ram/swap) jedoch, und es gibt keine Möglichkeit dies zu erhöhen, die ich kenne. Wenn Sie mehr verpflichtet sind, sollten Sie vielleicht stomp ganzen stack am Anfang main…ja, die ist wirklich häßlich, ich weiß. Auf der anderen Seite, wenn Sie möchten, Begehen weniger, senken RLIMIT_STACK sollte es tun.

  2. 5

    In Windows die Standard-stack-Größe für ein thread ist eine million bytes, unabhängig vom Betriebssystem, usw.

    In verwaltetem code (C#, VB, etc) können Sie erzwingen, dass ein neuer thread zu einem anderen stack-Größe mit dieser ctor:

    http://msdn.microsoft.com/en-us/library/5cykbwz4.aspx

    Ändern Sie die stack-Größe die Standard-thread von einem Windows-Programm, ob Sie verwaltet werden oder nicht, können Sie das editbin-Dienstprogramm:

    http://msdn.microsoft.com/en-us/library/xd3shwhf.aspx

    • Eigentlich die Standard-Größe (wenn Sie übergeben 0, um CreateThread) ist die gleiche wie die stack-Größe des Start thread (wie angegeben im PE-header).
    • Ich wusste nicht, dass, aber das macht Sinn. Danke!
    • Nur zusätzliche Informationen: die API für Die Erstellung von native-threads (die es erlaubt die Angabe der stack-Größe) ist CreateThread

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...