Memory Leaks über Programmlaufzeit hinweg möglich ?
-
Hi,
mich würede es mal interessieren, ob es auch Memory Leaks gibt, die über die Programmlaufzeit hinweg bestehen bleiben könnten...
Aktuell scheint es ja so, dass sich das OS den allokierten Speicher des Prozesses merkt und nach Beendigung des Programms / Prozesses wieder frei gibt.
Wo werden die Adressen des allokierten Speichers abgelegt ?
Im RAM ?
Auf der HDD ?
Könnte man diese Adressen vor Beendigung überschreiben / löschen, dass sie nicht mehr freigegeben werden können ?
Gibt es Unterschiede zwischen Win und Linux ?Besten Dank,
zwiebelchen
-
Schau dir mal an was Virtual Memory ist
-
dot schrieb:
Schau dir mal an was Virtual Memory ist
Was hat das mit der Frage zu tun?
-
Nachfrager schrieb:
dot schrieb:
Schau dir mal an was Virtual Memory ist
Was hat das mit der Frage zu tun?
So ziemlich alles!? Vielleicht solltest du dir auch mal anschaun was das ist
-
dot schrieb:
Nachfrager schrieb:
dot schrieb:
Schau dir mal an was Virtual Memory ist
Was hat das mit der Frage zu tun?
So ziemlich alles!? Vielleicht solltest du dir auch mal anschaun was das ist
Was das OS nach Beendigung eines Prozesses macht hat garnix mit virtuellem Speicher zu tun.
-
Niemand hindert dich seine Frage umfassend zu beantworten, also nur zu...
-
zwiebelchen schrieb:
mich würede es mal interessieren, ob es auch Memory Leaks gibt, die über die Programmlaufzeit hinweg bestehen bleiben könnten...
Du kannst z.B. unter Linux ein Shared Memory Segment anfordern und dann vergessen. Es könnte ja später ein Prozess sich an dasselbe attachen ...
Bei der regulären Speicherverwaltung (malloc etc.) sollte das kein Problem sein. Ein Betriebssystem, das seinen Namen verdient, hat u.a. die Aufgabe, Prozesse nach Beendigung vernünftig abzuräumen, egal ob diese regulär oder zwangsweise beendet wurden.Aktuell scheint es ja so, dass sich das OS den allokierten Speicher des Prozesses merkt und nach Beendigung des Programms / Prozesses wieder frei gibt.
Wo werden die Adressen des allokierten Speichers abgelegt ?
Im RAM ?
Auf der HDD ?Hat das irgendwas mit der Frage zu tun?
Könnte man diese Adressen vor Beendigung überschreiben / löschen, dass sie nicht mehr freigegeben werden können ?
Die prozessinterne Speicherverwaltung kannst du sicher kaputtmachen. Wozu auch immer ... aber am Ende kommt die große Abrissbirne und macht alles platt, ob du vorher schön free aufgerufen hast oder nicht. Die dazugehörigen Datenstrukturen, die Informationen dazu enthalten, welche Segmente deinem Prozess zugeordnet sind, gehören dem OS, darauf hast du keinen Zugriff.
-
Was hat das mit der Frage zu tun?
Ehm, weil jeder allozierte Speicher im Programm erst einmal als Kernelpage alloziert und in den virtuellen Speicher gemappt wird?
-
Bashar schrieb:
zwiebelchen schrieb:
mich würede es mal interessieren, ob es auch Memory Leaks gibt, die über die Programmlaufzeit hinweg bestehen bleiben könnten...
Du kannst z.B. unter Linux ein Shared Memory Segment anfordern und dann vergessen. Es könnte ja später ein Prozess sich an dasselbe attachen ...
K.A. wie das bei Linux ist, aber bei Windows geht das nicht so einfach.
Windows merkt sich auch welche Prozesse welche Shared-Memory Bereiche "geöffnet" haben - für Shared-Memory braucht man unter Windows schliesslich ein normales File-Handle. D.h. das System bekommt mit, wenn der letzte Prozess verschwindet, der den Shared-Memory-Bereich referenziert hat. Und räumt den dann auf.Ein "permanentes" Leak kann es da nur geben, so lange immer mindestens ein Prozess läuft, der den Shared-Memory-Bereich offen hat. Welcher das ist kann wechseln, aber sobald alle Prozesse weg sind, wird auch der Shared-Memory-Bereich freigegeben.
Ist das bei Linux wirklich anders? Würde mich fast ein wenig wundern/schrecken.
-
hustbaer schrieb:
Ist das bei Linux wirklich anders? Würde mich fast ein wenig wundern/schrecken.
Hat nichts mit Linux direkt zu tun, das ist System V IPC:
http://fscked.org/writings/SHM/shm-5.html
Shared segments in System V are a bit different than those obtained with BSD's mmap. First of all, while you do need a key for a segment which is usually obtained by running ftok(2) on some file in the filesyetem, System V shared segments exist only in memory. Because of this, System V shared segments must persist after the termination of a process. It is the responsibility of the programmer to ensure that all of his segments are removed from the system, otherwise his memory leaks become system wide.
Wahrscheinlich benutzt das kaum jemand, ich hab damit aber vor vielen Jahren mal was gemacht und bin darüber gestolpert. Es gibt ein Utility, mit dem man sich die systemweiten System-V-IPC-Keys auflisten lassen kann, darüber kann man sie auch freigeben.