Heap und Stack
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Heap und Stack
Hallo Leute!
Ich habe da mal eine ganz allgemeine Frage:
In den Zeiten von TurboPascal 5 musste man bei seinen Programmen noch aufpassen, dass sehr begrenzten Speicherplatz des Stack nicht überschreitet. Benötigte ein Programm zusätzlichen Speicherplatz, musste man mit Pointern arbeiten und den Heap benutzen, wenn ich mich richtig erinnere.
Der Stack war dabei garnichtmal so groß, glaube 1 MB oder so.
Wie ist das denn heute bei FreePascal/Lazarus und anderen Sprachen? Ist der Stack immernoch derart begrenzt?
Muss ich damit rechnen, dass wenn ich unter "var" meine Variablen deklariere, irgendwann einen Stack-Overflow erreiche, obwohl die 512 MB RAM meines Rechners noch garnicht ausgefüllt sind?
Oder hat sich was geändert, der Stack ist nicht mehr begrenzt oder der Compiler kümmert sich darum?
Danke für die Antworten im Voraus!
Alexander
Ich habe da mal eine ganz allgemeine Frage:
In den Zeiten von TurboPascal 5 musste man bei seinen Programmen noch aufpassen, dass sehr begrenzten Speicherplatz des Stack nicht überschreitet. Benötigte ein Programm zusätzlichen Speicherplatz, musste man mit Pointern arbeiten und den Heap benutzen, wenn ich mich richtig erinnere.
Der Stack war dabei garnichtmal so groß, glaube 1 MB oder so.
Wie ist das denn heute bei FreePascal/Lazarus und anderen Sprachen? Ist der Stack immernoch derart begrenzt?
Muss ich damit rechnen, dass wenn ich unter "var" meine Variablen deklariere, irgendwann einen Stack-Overflow erreiche, obwohl die 512 MB RAM meines Rechners noch garnicht ausgefüllt sind?
Oder hat sich was geändert, der Stack ist nicht mehr begrenzt oder der Compiler kümmert sich darum?
Danke für die Antworten im Voraus!
Alexander
Probier's doch aus. Da muss man immer noch aufpassen.
Code: Alles auswählen
type TmyArr=Array[1..100000] of integer; //gibt stack overflow
//type TmyArr=Array[1..100] of integer; //das müsste klappen
{$S+} //Stack Checking einschalten
procedure TForm1.Button1Click(Sender: TObject);
var myArr:TmyArr;
begin
Writeln('Hmm');
end;
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Euklid hat geschrieben:Ok, werde das Ergebnis dann hier posten...
... so. hat nun doch eine Weile gedauert. Um so überraschender das Ergebnis:
Definiert man mit Theos Typ TmyArr eine Variable, so kommt es zu einem "Unbekannter Fehler: 202", wenn man in den Compilereinstellungen den Stack überprüft - sonst nicht!
Dann habe ich das ganze Array dem Wert 53 bestückt. Dabei scheint kein Wert im Array verloren zu gehen - trotz Fehlermeldung.
hmmm. Wie habe ich das jetzt zu deuten?
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Heap und Stack
Hallo Leute,
hierzu gibt es jetzt eine eindeutige Antwort durch dieses Buch
http://www.cul.de/freepascal2.html" onclick="window.open(this.href);return false;
welches ich mir vergangene Woche zugelegt habe. Darin steht:
Das Buch ist übrigends wirklich empfehlenswert! Ich glaube, ich werde in den Osterferien mal eine Rezension o.ä. dazu für dieses Forum schreiben.
Viele Grüße, Euklid
hierzu gibt es jetzt eine eindeutige Antwort durch dieses Buch
http://www.cul.de/freepascal2.html" onclick="window.open(this.href);return false;
welches ich mir vergangene Woche zugelegt habe. Darin steht:
Sprich: Man braucht sich um den Stack keine Sorgen zu machen.Bei Windows, Linux, FreeBSD und NetBSD ist die Stackgröße nur durch die Größe des verfügbaren Arbeitsspeichers begrenzt.
Das Buch ist übrigends wirklich empfehlenswert! Ich glaube, ich werde in den Osterferien mal eine Rezension o.ä. dazu für dieses Forum schreiben.
Viele Grüße, Euklid
-
- Beiträge: 155
- Registriert: Mi 22. Aug 2007, 14:52
- OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 65719 Hofheim am Taunus
- Kontaktdaten:
Re: Heap und Stack
16kB Stack-Default.Der Stack war dabei garnichtmal so groß, glaube 1 MB oder so.
Mit 20 Adressleitungen eines 8088-Prozessors kann man _insgesamt_ nicht mehr als 1 MB adressieren. Bis 640K für Programme, 641-1024K für BIOS.
¿Wozu auch? "Es wird niemals Programme geben, die mehr als 64kB Arbeitsspeicher benötigen" (oder so, frei nach Bill Gates). Und ein IBM-Personal-Computer hat doch 640K, also für ¡¡ 10 Programme !! gleichzeitig, die man (ausser den Speicherresidenten) eh nicht gleichzeitig ausführen kann. ...mehr als ausreichend, hihihi

Na, ¿ wer kennt es noch ?
(läuft bei mir noch, in VMWare unter Mandriva)
Re: Heap und Stack
ja und warum kommt es dann in dem Beispiel von theo zu einer Exception?Euklid hat geschrieben:Sprich: Man braucht sich um den Stack keine Sorgen zu machen.

Gruß, Bernd.
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Heap und Stack
Das ist eine gute Frage! Möglicherweise meldet die Option {$S+} garkeine Stack-Fehler - sondern nur, ob der für den Stack benötigte Speicherplatz einen gewissen Wert (z.B. 64kB) überschreitet?_Bernd hat geschrieben:ja und warum kommt es dann in dem Beispiel von theo zu einer Exception?Euklid hat geschrieben:Sprich: Man braucht sich um den Stack keine Sorgen zu machen.
Im FreePascal-Buch steht, dass die Stack-Überprüfung für Betriebssysteme mit begrenzter Stack-Größe notwendig ist (DOS, BeOS). Kann man daraus schließen, dass sie für Linux, Windows, FreeBSD, u.s.w. in keinem Fall aktiviert werden muss?
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Heap und Stack
Ich dachte darum kümmern sich heutzutage die Modernen Betriebssysteme. Und lagern wenn nötig aus....
MFG
Michael Springwald
Michael Springwald
- af0815
- Lazarusforum e. V.
- Beiträge: 6834
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Heap und Stack
[quote="Euklid]Im FreePascal-Buch steht, dass die Stack-Überprüfung für Betriebssysteme mit begrenzter Stack-Größe notwendig ist (DOS, BeOS). Kann man daraus schließen, dass sie für Linux, Windows, FreeBSD, u.s.w. in keinem Fall aktiviert werden muss?[/quote]
Sie ist sinnvoll wenn man testen will, ob das programm nicht zuviel Heap verbraucht. Besonders gerne bei rekursionen kann man in schleifen kommen, wo der Heap sich ins Nirvana vergrössert. Da ist eine Notbremse oft hilfreich. In Produktivumgebungen NACH dem Testen wird wieder abgeschalten.
Sie ist sinnvoll wenn man testen will, ob das programm nicht zuviel Heap verbraucht. Besonders gerne bei rekursionen kann man in schleifen kommen, wo der Heap sich ins Nirvana vergrössert. Da ist eine Notbremse oft hilfreich. In Produktivumgebungen NACH dem Testen wird wieder abgeschalten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Heap und Stack
Hehe, da hast du natürlich Recht: Möchte nicht wissen, wie oft mein PC wegen des Speicherverzehrs rekursiver Schleifen schon abgestürtzt ist. Hierfür gibt es aber eine Überlaufprüfung, die unabhängig von der Stack-Überprüfung ist.af0815 hat geschrieben: Sie ist sinnvoll wenn man testen will, ob das programm nicht zuviel Heap verbraucht. Besonders gerne bei rekursionen kann man in schleifen kommen, wo der Heap sich ins Nirvana vergrössert. Da ist eine Notbremse oft hilfreich. In Produktivumgebungen NACH dem Testen wird wieder abgeschalten.
Euklid
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Heap und Stack
Ich glaube dass ist das Problem. Kan man mit $M oder -Cs aendern.Das ist eine gute Frage! Möglicherweise meldet die Option {$S+} garkeine Stack-Fehler - sondern nur, ob der für den Stack benötigte Speicherplatz einen gewissen Wert (z.B. 64kB) überschreitet?
Aber auch das System hat grenze glaub ich. Kann mann sehen mit ulimit -s, genau so wie ulimit -d den Datasegment Groesse gibt. ISPs setzen oft solchen Limieten auf Shell accounts.
Zuletzt geändert von marcov am Do 2. Apr 2009, 23:05, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Heap und Stack
Aha - d.h. der Stack auf meinem System ist 8 MB groß.marcov hat geschrieben:Aber auch das System hat grenze glaub ich. Kann mann sehen mit ulimit -s, genau so wie ulimit -d den Datasegment Groesse gibt. ISPs setzen oft solchen Limieten auf Shell accounts.
Danke für die Information!
Euklid