Hat Pascal Probleme mit der Speicherverwaltung?
-
- Beiträge: 57
- Registriert: Di 9. Okt 2012, 17:32
Re: Hat Pascal Probleme mit der Speicherverwaltung?
"Naja, was heißt "besser"?"
Sorry
hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
MIch interessiert
wie in die Heapverwaltung eingreifen
a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
Sorry
hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
MIch interessiert
wie in die Heapverwaltung eingreifen
a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Ich habe diesen Beitrag jetzt 3 mal gelesen verstehe beim besten Willen allerdings nicht worauf du hinaus möchtesttryunderror hat geschrieben:"Naja, was heißt "besser"?"
Sorry
hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
MIch interessiert
wie in die Heapverwaltung eingreifen
a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Wie und wo genau das Zeugs im Heap liegt kann dir doch egal sein. Du sagst im Programm nur "gib mir Speicher" (mit Create, New, etc.) und "ich geb den Speicher wieder frei" (mit Free / Dispose, etc.). Wie es im Heap im Detail ausschaut ist Sache der Speicherverwaltung des Betriebssystems.
.
-
- Beiträge: 320
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Warf hat geschrieben: hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
Mach ich bei kleinen Programmen auch immer so.
Alles in ein großes (dynamisches) Array .
Man kann sogar eine Linked-List so machen. Da verweist man dann statt Pointer durch Arrayindizes.
Die hardcore Variante ist newinstance und FreeInstance zu überschreiben.Warf hat geschrieben: a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
Zum Beispiel:
Code: Alles auswählen
type TGlobalObject = class
i: Integer;
class function newinstance: tobject; override;
procedure FreeInstance; override;
end;
var dataBlock: array[1..1024] of byte;
class function TGlobalObject.newinstance: tobject;
begin
result := tobject(@dataBlock);
InitInstance(result);
end;
procedure TGlobalObject.FreeInstance;
begin
end;
Code: Alles auswählen
var a, b: TGlobalObject;
begin
a := TGlobalObject.Create;
b := TGlobalObject.Create;
a.i := 10;
b.i := 20;
writeln(a.i);
C++ hat die beste Speicherverwaltung aller Sprachen (abgesehen vielleicht von den ganz Neuentwicklungen wie Rust)Patito hat geschrieben: In C++ ist die Speicherverwaltung eine Katastrophe, da dort verschiedene
Arten der Speicherverwaltung (Heap/Stack) gemischt auftreten. Das gibt dann natürlich schnell
ein Chaos. Wer damit eine Zeitlang leben muss, wird zwangsläufig auf die Idee kommen,
dass man ohne Garbage-Collector nicht leben kann - dabei hätte es eigentlich gereicht wenn man
einfach erst mal die Heap- und Stack-basierten Systeme sauber voneinander getrennt hätte.
Da wählt man dann halt beim Verwenden aus, ob man das Objekt auf dem Stack, Heap oder Heap-mit-Ref-Counting haben.
In 90% der Fälle bleibt alles auf dem Stack und dann hat man keinerlei Speicherprobleme. Sonst verwendet man die Variante ref-counting.
In Pascal hat man keine Wahl, und muss die Variante nehmen, die der Klassenautor gewählt hat. Und wenn es dann nicht ref-counted ist, kriegt man Probleme
-
- Beiträge: 57
- Registriert: Di 9. Okt 2012, 17:32
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Warf hat geschrieben:Ich habe diesen Beitrag jetzt 3 mal gelesen verstehe beim besten Willen allerdings nicht worauf du hinaus möchtesttryunderror hat geschrieben:"Naja, was heißt "besser"?"
Sorry
hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
MIch interessiert
wie in die Heapverwaltung eingreifen
a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
a Ich will wissen was der Compiler tut bei nil und dispose und new
b Das will ich optimieren.
c Daten auslagern simuliert unendlichen Speicher.
-
- Beiträge: 57
- Registriert: Di 9. Okt 2012, 17:32
Re: Hat Pascal Probleme mit der Speicherverwaltung?
baumina hat geschrieben:Wie und wo genau das Zeugs im Heap liegt kann dir doch egal sein. Du sagst im Programm nur "gib mir Speicher" (mit Create, New, etc.) und "ich geb den Speicher wieder frei" (mit Free / Dispose, etc.). Wie es im Heap im Detail ausschaut ist Sache der Speicherverwaltung des Betriebssystems.
Ja und nein.
Das wird erst interessant
zb Du hast 1 GB HD
und hast 6 GB Daten rein und davon sind 4 wieder weg. Mit weg meine ich Zwischenergebnisse. Also musst Du 2 GB auf 5 GB verwalten. Bitcoins Abrechungen werden endlos. Und da musst Du den Heap organisieren. Nehmen wir an, Du handelst mit Bitcoins und willst alle Protokolle speichern.
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Hat Pascal Probleme mit der Speicherverwaltung?
- New reserviert dir den Speicher für die Variable und erzeugt einen Zeiger (Pointer), der auf die Variable zeigt.tryunderror hat geschrieben:a Ich will wissen was der Compiler tut bei nil und dispose und new
b Das will ich optimieren.
c Daten auslagern simuliert unendlichen Speicher.
- Dispose gibt dir den Speicher, den die Variable belegt, wieder frei. Dadurch ist der Pointer ungültig, da er auf eine ungültige Adresse im Speicher zeigt, deswegen wird oft nach Dispose der Pointer auf Nil gesetzt (sichere Programmierung).
- Pointer auf Nil setzen macht mit dem Speicher, den die Variable belegt, gar nichts. Nur zeigt er nicht mehr dorthin, deswegen ist es meist sinnvoll bevor der Pointer auf Nil gesetzt wird, den Speicherplatz durch ein Dispose freizugeben (außer ein anderer Pointer zeigt noch auf den Speicherbereich),
P.S. in die komplexe Speicherverwaltung von Windows einzugreifen ist nicht ratsam.
Übrigens: Ein dynamisches Array (Array of Integer) landet im Heap, ein statisches Array (Array [0..100000] of Integer) dagegen im Stack.
.
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Hat Pascal Probleme mit der Speicherverwaltung?
a: New: Das Programm sagt dem Betriebsystem: Hey gib mir ma x Byte Speicher. Dispose: Das Programm sagt dem Betriebsystem: Den Speicher dort brauche ich nicht mehr.tryunderror hat geschrieben:Warf hat geschrieben:Ich habe diesen Beitrag jetzt 3 mal gelesen verstehe beim besten Willen allerdings nicht worauf du hinaus möchtesttryunderror hat geschrieben:"Naja, was heißt "besser"?"
Sorry
hatte ich nicht klar gesagt.
Die Frage ist theoretisch gedacht.
In der Praxis würde ich wenn ich Party mache und es kommen 50 Leute
dann lege ich array 1:50 an und leg da records rein. Fertig. Schlampig schnell und egal.
MIch interessiert
wie in die Heapverwaltung eingreifen
a schneller als jetzt
b nie ein Loch weil da passieren dann die Zugriffsfehler
c Automatisch auslagern.
a Ich will wissen was der Compiler tut bei nil und dispose und new
b Das will ich optimieren.
c Daten auslagern simuliert unendlichen Speicher.
Wenn du es genau wissen willst, linux z.B. geht beim allokieren nach dem QuickFit Algorithmus vor, und bei dispose wird einfach nur ein Eintrag in der Memory Table gemacht dass dieser Speicherbereich nicht mehr belegt ist
b: Nimm linux und optimiere den Kernel, auch wenn das recht schwer wird, der Linux kernel ist schon ziemlich gut
c: Das nennt sich Paging und das machen Moderne Betriebsysteme (Seit c.a. 1990) selbst. Nur dein Virtueller Adressraum ist durch die Architektur begrenzt (32 Bit: 4GB, 64 Bit 2^64 Byte) und Durch das System (Windows 10 Pro 64 bit max 156 GB, Windows 32 Bit: 2 GB)
Wenn dich so was interessiert leg dir doch mal dieses Buch zu. Das habe ich im rahmen der Betriebsystem Vorlesung der Uni mal angeschaut und ein paar Kapitel gelesen, ist echt gut, war mir aber letztlich zu teuer um es außerhalb der Bibliothek zu lesen.
Darin beschreibt Tanenbaum genau solche Probleme für Betriebsysteme, welche Lösungsansätze es gibt, und welche von den entsprechenden Systemen verwendet werden
Zuletzt geändert von Warf am Fr 30. Okt 2015, 12:09, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Viele Anforderungen und Freigaben können einer Fragmentierung des Arbeitsspeichers führen. Beispiel: Nach einiger Laufzeit sind von 4 GB wieder 2 GB frei; diese sind aber im Adressraum des Prozesses so verteilt, dass eine Anforderung über ein Array von 500 MB nicht erfüllt werden kann.baumina hat geschrieben:Wie und wo genau das Zeugs im Heap liegt kann dir doch egal sein. Du sagst im Programm nur "gib mir Speicher" (mit Create, New, etc.) und "ich geb den Speicher wieder frei" (mit Free / Dispose, etc.). Wie es im Heap im Detail ausschaut ist Sache der Speicherverwaltung des Betriebssystems.
Gerade bei speicherhungrigen 32-Bit-Anwendungen (z.B. Spiele, Datenbanken) kann das zu Problemen führen, sofern das Speichermanagement nicht darauf ausgelegt ist. Sofern eine Anwendung in diesem Grenzgebiet arbeitet, wird häufig eine interne Speicherverwaltung zwischen der Anwendung (Objekte, Arrays, New und Dispose) und dem Betriebssystem geschaltet.
Bei 64-Bit-Anwendungen ist ein 64-Bit-Adressraum vorhanden. Damit führt Fragmentierung auf absehbare Zeit nicht mehr zu Problemen.
Natürlich kannst du in den Arbeitsspeicher nur so viele Daten hineinladen, wie dort hineinpassen. Wenn du mehr Daten als Arbeitsspeicher hast, musst du diese nacheinander: laden, verarbeiten, ausladen. Das hat weniger mit der Speicherveraltung von Pascal, C oder Java sondern viel mehr mit einer konkreten Anwendung zu tun. Datenbanken haben beispielsweise eigene Softwarekomponenten, die den Speicherbereich für unterschiedliche Teilanwendungen (Cache, Zwischenergebnisse, Änderungslog) verwalten und auf Anfragen bereitstellen.tryunderror hat geschrieben:zb Du hast 1 GB HD
und hast 6 GB Daten rein und davon sind 4 wieder weg. Mit weg meine ich Zwischenergebnisse. Also musst Du 2 GB auf 5 GB verwalten. Bitcoins Abrechungen werden endlos. Und da musst Du den Heap organisieren. Nehmen wir an, Du handelst mit Bitcoins und willst alle Protokolle speichern.
Wie wäre es mit einem Cache? Alle Anfragen an Daten laufen über diesen Cache; er entscheidet selbsständig, welche Daten im Speicher gehalten werden (alter der Belege, letzte Zugriffszeit, Häufigkeit der Zugriffe etc.) und kann bei Bedarf Arbeitsspeicher frei machen und anderweitig verwenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 57
- Registriert: Di 9. Okt 2012, 17:32
Re: Hat Pascal Probleme mit der Speicherverwaltung?
"Übrigens: Ein dynamisches Array (Array of Integer) landet im Heap, ein statisches Array (Array [0..100000] of Integer) dagegen im Stack."
Genau
darum geht es.
Aber das kann und will ich manipulieren.
Beispiel.
A array 1:1000 of record pointer auf adresse.
oder
B pointer auf das array
A landet im Stack.
B landet im Heap.
OK?
A und B mit identischen Daten brauchen (fast) denselben Speicherplatz,
nur
mal Heap, mal Stack.
Nun mache ich A
und lösche Element 37 .
Jetzt habe ich ein Loch im Speicherplatz, Feld 37 ist leer.
Aber ich kann es nun verwalten und evt. neu belegen.
Hätte ich gemacht:
Statt Array 1:1000 einen Pointerbaum mit 1000 Knoten, hätte Knoten 37 deleted (dispose)
wäre unkontrollierbar 37 verschwunden.
Anders formuliert: Der Speicher lässt sich auch dynamisch so organisieren, dass es wenig "Löcher" gibt.
ZB der WIN Nutzer macht jede Woche auf HD defrag, das füllt Löcher. (Hat nix mit Pascal zu tun).
Und wie gesagt
wir denken darüber nach.
ABER ich programmier was für mich, da ist mir Heapverwaltung pipegal.
Genau
darum geht es.
Aber das kann und will ich manipulieren.
Beispiel.
A array 1:1000 of record pointer auf adresse.
oder
B pointer auf das array
A landet im Stack.
B landet im Heap.
OK?
A und B mit identischen Daten brauchen (fast) denselben Speicherplatz,
nur
mal Heap, mal Stack.
Nun mache ich A
und lösche Element 37 .
Jetzt habe ich ein Loch im Speicherplatz, Feld 37 ist leer.
Aber ich kann es nun verwalten und evt. neu belegen.
Hätte ich gemacht:
Statt Array 1:1000 einen Pointerbaum mit 1000 Knoten, hätte Knoten 37 deleted (dispose)
wäre unkontrollierbar 37 verschwunden.
Anders formuliert: Der Speicher lässt sich auch dynamisch so organisieren, dass es wenig "Löcher" gibt.
ZB der WIN Nutzer macht jede Woche auf HD defrag, das füllt Löcher. (Hat nix mit Pascal zu tun).
Und wie gesagt
wir denken darüber nach.
ABER ich programmier was für mich, da ist mir Heapverwaltung pipegal.
-
- Beiträge: 57
- Registriert: Di 9. Okt 2012, 17:32
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Dane für alle Buchtips Thread ist gebrannt und Buchtitel notiert Danke.Je virtueller der Speicherzugriff wird, umso mehr Bremsklötze hat man im System (-> langsamer ->? schlechter).
Theorie schrieb ich.
Denn ich kann immer zb Platz sparen und Code wird länger.
ZB
Ich baue Compiler.
Das geht mit wenig Code und viel Speicherplatz und viel Rechenzeit.
Oder
ich baue Compiler für dieselbe Sprache mit viel Code und viel Speicherplatz und wenig Rechenzeit.
Oder wenig Space und quick dann langer komplexer Code.
So hier das Thema ist
wie in Pascal Space verwalten.
Und nur als Gedankenspiel
Ich habe ein gb Space
und jeden Tag 10 GB Daten rein und raus
und davon wird auch zb 99 % gelöscht nach check.
Wie gesagt nur gedanklich
denn wenn ich einfach sage
Daten weg Dispose Nil dann habe ich Lücken in meinem gedachten Gigabyte drin.
Und Anmerkung: Im Code sind Daten vom Stack leichter zu finden als im Heap also auch damit,
was wo liegt. Bein Zeiger auf Zeiger ist das nicht so einfach.
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Erst dachte ich "Google Translator", aber der macht keine Tippfehler...tryunderror hat geschrieben:Dane für alle Buchtips Thread ist gebrannt und Buchtitel notiert Danke.Je virtueller der Speicherzugriff wird, umso mehr Bremsklötze hat man im System (-> langsamer ->? schlechter).
Theorie schrieb ich.
Denn ich kann immer zb Platz sparen und Code wird länger.
ZB
Ich baue Compiler.
Das geht mit wenig Code und viel Speicherplatz und viel Rechenzeit.
Oder
ich baue Compiler für dieselbe Sprache mit viel Code und viel Speicherplatz und wenig Rechenzeit.
Oder wenig Space und quick dann langer komplexer Code.
So hier das Thema ist
wie in Pascal Space verwalten.
Und nur als Gedankenspiel
Ich habe ein gb Space
und jeden Tag 10 GB Daten rein und raus
und davon wird auch zb 99 % gelöscht nach check.
Wie gesagt nur gedanklich
denn wenn ich einfach sage
Daten weg Dispose Nil dann habe ich Lücken in meinem gedachten Gigabyte drin.
Und Anmerkung: Im Code sind Daten vom Stack leichter zu finden als im Heap also auch damit,
was wo liegt. Bein Zeiger auf Zeiger ist das nicht so einfach.
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
-
- Beiträge: 320
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Der lernt, was Leute auf Webseiten schreibenKomoluna hat geschrieben:
Erst dachte ich "Google Translator", aber der macht keine Tippfehler...
Wenn das Original Tippfehler hat, werden die manchmal mitübersetzt
-
- Beiträge: 2122
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Hat Pascal Probleme mit der Speicherverwaltung?
Lies dir bitte mal vernünftig was zu Memory Management, Virtueller Speicher und Paging durch, das was du schreibst ergibt einfach keinen Sinn.tryunderror hat geschrieben:Dane für alle Buchtips Thread ist gebrannt und Buchtitel notiert Danke.Je virtueller der Speicherzugriff wird, umso mehr Bremsklötze hat man im System (-> langsamer ->? schlechter).
Theorie schrieb ich.
Denn ich kann immer zb Platz sparen und Code wird länger.
ZB
Ich baue Compiler.
Das geht mit wenig Code und viel Speicherplatz und viel Rechenzeit.
Oder
ich baue Compiler für dieselbe Sprache mit viel Code und viel Speicherplatz und wenig Rechenzeit.
Oder wenig Space und quick dann langer komplexer Code.
So hier das Thema ist
wie in Pascal Space verwalten.
Und nur als Gedankenspiel
Ich habe ein gb Space
und jeden Tag 10 GB Daten rein und raus
und davon wird auch zb 99 % gelöscht nach check.
Wie gesagt nur gedanklich
denn wenn ich einfach sage
Daten weg Dispose Nil dann habe ich Lücken in meinem gedachten Gigabyte drin.
Und Anmerkung: Im Code sind Daten vom Stack leichter zu finden als im Heap also auch damit,
was wo liegt. Bein Zeiger auf Zeiger ist das nicht so einfach.
Du kannst aus einem Array nicht einfach ein bestimmtes Element Löschen. Und selbst wenn du nur 1 GB speicher hast ist der Virtuelle speicherbereich deines Programmes mindestens 2-3 GB (32 Bit) groß.
Wenn du Speicherlücken erzeugst ist das kein Problem der Programmiersprache, dann hast du als Entwicker einfach ein kaputtes Programm gebaut.
Und Speicherlücken entstehen nur wenn du speicher nicht freigibst. Wenn du speicher freigibst bevor du ihn nicht mehr benötigst bekommst du eine Segfault und das kannst du über eine simple abfrage Assigned unterbinden