Autor Thema: Hauptspeicher defragmentieren  (Gelesen 9171 mal)

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« am: 24. October 2006, 20:36 »
Hallo, ein bekanntes Problem bei Betriebssystemen ist ja die Fragmentierung des Hauptspeichers, wenn es lange genug läuft. Bei dem Speicher, der von den User-Prozessen belegt wird ist das ganze ja weniger schlimm, da dieser vom System ja oft nur als 4kB Pages betrachtet wird, aber was ist mit dem Heap des Kernels? Wenn das System mehrere Tage läuft und einige tausend malloc und free Operationen ausgeführt hat dürfte es schon recht schwierig werden einen größeren zusammenhängenden Block zu allocieren. Nun habe ich mal irgendwo gelesen, dass zB Linux die Möglichkeit hat den Speicher zu "defragmentieren". Ist so etwas eigentlich bei einem in C geschriebenen Kernel möglich, oder ist damit womöglich nur das Defragmentieren der Page-Tabelle gemeint?

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #1 am: 24. October 2006, 21:56 »
Ich denke schon, dass es möglich ist. Aber ich denke, dass sich der Aufwand nicht lohnen wird, denn du musst ja einen Grossteil des Speichers herumschieben.
Den einzigen Grund sehe ich, wenn ein grösserer Speicherblock, der physikalisch zusammenhängend sein muss, alloziert weden soll(zum Beispiel für den DMA-Controller).
Baim virtuellen Speicher wäre ich eher vorsichtig. Das Betriebssystem hat ja keine Ahnung von all den Pointern & co. in den Tasks. Und wenn die Pointer dann irgendwo ins Nirvana zeigen, hast du, respektive der Task ein Problem.

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #2 am: 25. October 2006, 18:30 »
Genau das meine ich ja, wie soll das überhaupt funktionieren, dass man den Heap defragmentiert, wenn man einen mit C Kernel hat, wo man nicht weiß wer wie oft wohin zeigt?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 25. October 2006, 19:03 »
Man kann nicht einfach so defragmentieren, dazu bräuchte man eine Sprache die sowas unterstützt.

In C/C++ wird fragmentierung versucht beim aufruf von malloc/free (bzw. das C++ äquivalent new/delete) zu verhindern, indem man
* malloc: das bestmöglich passende Stück speicher allozieren, um das zu beschleunigen kann man mehrere "pools" anlegen in denen sich nur speicherstücke bestimmter größe befinden
* free: wenn möglich das freizugebende stück speicher mit einem anderen/mehreren anderen zusammenfügen, falls die beiden aneinander liegen. Das könnte man auch in einen speziellen defrag() aufruf machen, der alle Zeit mal ausgeführt wird.
* man könnte auch sich pro "Ding" (Klasse) das alloziert werden soll seinen eigenen allokator schreiben, das könnte man in C++ sehr bequem und transparent durch überladen des new/delete operators realisieren.
Aber der Kernel sollte niemals in der userspace speicherverwaltung herumpfuschen, dass ist nicht seine Aufgabe. Er sollte nur, wenn eine page in einer app freigeworden ist, diese wieder ausmappen und innerhalb des kernels speicher.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #4 am: 25. October 2006, 20:07 »
Mir ist auch klar, dass es mit Sprachen wie C/C++ eigentlich möglich sein sollte den Arbeitsspeicher zu defragmentieren, jedoch dann gibt es immer mal wieder Programme wie zB "Multi Platform RAM Defragmentation" die behaupten sie würden es doch können:
http://ramdefrag.sourceforge.net/#about
Leider sind ihre Informationen darüber WIE sie es machen eher vage...
Ich habe aber so den Verdacht, dass sie lediglich etwas im virtuellen Speicher aufräumen.

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. October 2006, 23:48 »
 :-D
Ich glaube sie machen goarnix. Wäre auch ziemlich schwierig ^^. Eine gute Auflösung des Rätsels steht hier: http://ramdefrag.sourceforge.net/sourceforge-description.txt
 :-D
Agieren statt Konsumieren!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 26. October 2006, 13:28 »
*roflmao* ich dachts mir eigentlich fast. :roll:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 26. October 2006, 13:42 »
Man kann nicht einfach so defragmentieren, dazu bräuchte man eine Sprache die sowas unterstützt.
Naja, man kann sich sicher auch in C was basteln, was funktioniert, wenn man seine eigenen Regeln mit eiserner Disziplin einhält. Mit passender Sprache ist es natürlich bequemer... Wenn du sowas hast, kannst du dann auch gleich noch Garbage Collection machen. ;)

Zitat
* malloc: das bestmöglich passende Stück speicher allozieren, um das zu beschleunigen kann man mehrere "pools" anlegen in denen sich nur speicherstücke bestimmter größe befinden
Soweit ich weiß, ist Best Fit in der Praxis nicht besser als First Fit - eher umgekehrt.

Zitat
Eine gute Auflösung des Rätsels steht hier: http://ramdefrag.sourceforge.net/sourceforge-description.txt
Sehr nettes Tool. :D
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 26. October 2006, 14:35 »
Naja, man kann sich sicher auch in C was basteln, was funktioniert, wenn man seine eigenen Regeln mit eiserner Disziplin einhält.
Das wär aber dann definitiv frickelcode und ich weiß auch nicht ob das dann funktioniert ohne das der Compiler da so richtig mitspielt. Der darf ja normalerweise pointer, etc. zwecks optimierungen in registern zwischenspeichern. Und wenn du dann deinen Speicher defragmentierst und den pointer verändern willst is das natürlich müll. Und jeden Pointer zu locken/unlocken is doch shice :roll:

Zitat
Soweit ich weiß, ist Best Fit in der Praxis nicht besser als First Fit - eher umgekehrt.
Was meinst du mit besser? Von der fragmentierung her denke ich schon, aber von der Geschwindigkeit natürlich nicht.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 26. October 2006, 15:03 »
Ich habe weder gesagt, daß es schön wird, noch daß es in irgendeiner Weise erstrebenswert wäre. Wenn, dann würde ich Nägel mit Köpfen machen und Java oder .NET implementieren...

Zitat
Soweit ich weiß, ist Best Fit in der Praxis nicht besser als First Fit - eher umgekehrt.
Was meinst du mit besser? Von der fragmentierung her denke ich schon, aber von der Geschwindigkeit natürlich nicht.
Ich meine schon von der Fragmentierung her, da ist angeblich First Fit oder Next Fit das beste. Ist allerdings eine von mir persönlich ungeprüfte Aussage, die ich so direkt vom Compilerbau-Professor weitergebe. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen