Heap und Stack

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Euklid
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

Beitrag von Euklid »

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

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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;

Euklid
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:

Beitrag von Euklid »

Ok, werde das Ergebnis dann hier posten...

Euklid
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:

Beitrag von Euklid »

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?

Euklid
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

Beitrag von Euklid »

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:
Bei Windows, Linux, FreeBSD und NetBSD ist die Stackgröße nur durch die Größe des verfügbaren Arbeitsspeichers begrenzt.
Sprich: Man braucht sich um den Stack keine Sorgen zu machen.

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

KOBOLD Messring GmbH
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

Beitrag von KOBOLD Messring GmbH »

Der Stack war dabei garnichtmal so groß, glaube 1 MB oder so.
16kB Stack-Default.
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 :lol:

Na, ¿ wer kennt es noch ?
(läuft bei mir noch, in VMWare unter Mandriva)
Dateianhänge
turbo5.png

_Bernd
Beiträge: 145
Registriert: Di 13. Feb 2007, 11:16

Re: Heap und Stack

Beitrag von _Bernd »

Euklid hat geschrieben:Sprich: Man braucht sich um den Stack keine Sorgen zu machen.
ja und warum kommt es dann in dem Beispiel von theo zu einer Exception? ;-)

Gruß, Bernd.

Euklid
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

Beitrag von Euklid »

_Bernd hat geschrieben:
Euklid hat geschrieben:Sprich: Man braucht sich um den Stack keine Sorgen zu machen.
ja und warum kommt es dann in dem Beispiel von theo zu einer Exception? ;-)
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?

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?

pluto
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

Beitrag von pluto »

Ich dachte darum kümmern sich heutzutage die Modernen Betriebssysteme. Und lagern wenn nötig aus....
MFG
Michael Springwald

Benutzeravatar
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

Beitrag von af0815 »

[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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Euklid
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

Beitrag von Euklid »

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.
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.

Euklid

marcov
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

Beitrag von marcov »

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?
Ich glaube dass ist das Problem. Kan man mit $M oder -Cs aendern.

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.

Euklid
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

Beitrag von Euklid »

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.
Aha - d.h. der Stack auf meinem System ist 8 MB groß.

Danke für die Information!

Euklid

Antworten