Warum hat das Betriebssystem keinen Garbage Collector?

8

Ich wundere mich darüber, weil das Betriebssystem für die Speicherverwaltung zuständig ist. Warum müssen Programmiersprachen eigene Garbage Collectors implementieren?

    
Paladini 12.10.2014, 13:42
quelle

4 Antworten

9

Wie würde das Betriebssystem wissen, was Müll ist und was nicht?

Jede Programmiersprache hat ihre Regeln, um zu definieren, was eine Datenstruktur ist und wann eine Datenstruktur von einer anderen Datenstruktur referenziert wird. Jede Programmiersprachenimplementierung (d. H. Compiler, Interpreter, Laufzeit) hat ihre Art, Datenstrukturen im Speicher darzustellen. Der Garbage Collector muss wissen, wie Daten dargestellt werden: Er muss wissen, was ein Zeiger ist und worauf der Zeiger zeigt.

Im Allgemeinen ist ein Zeiger eine Adresse im Speicher. Aber es gibt keine Möglichkeit, a priori zu wissen, welche Speicherzellen einen Zeiger enthalten und welche Speicherzellen einige Nicht-Zeiger-Daten enthalten, bei denen zufällig gerade das rechte Bitmuster ein gültiger Zeiger ist. Darüber hinaus sind zusätzliche Informationen erforderlich, um die Größe des Datums zu kennen, auf den der Zeiger verweist.

Es gibt konservative Speicherbereiniger, die davon ausgehen, dass jede Speicherzelle, die als Zeiger interpretiert werden kann, ein Zeiger ist. Selbst dann muss der Garbage Collector wissen, wo die Daten, auf die der Zeiger zeigt, gestartet und gestoppt werden, so dass der Garbage Collector die Speicherdarstellung kennen muss, die von der Programmiersprachenumgebung verwendet wird. Außerdem muss der Garbage Collector davon ausgehen, dass es keine versteckten Zeiger gibt (zum Beispiel auf die Festplatte geschrieben, komprimiert, ...).

Wenn Programme beliebigen Maschinencode enthalten dürfen, was bei den meisten Betriebssystemen der Fall ist, muss die Garbage-Collection jeder Programmierumgebung überlassen werden. Es gibt einige spezialisierte Betriebssysteme, die alle Programme zwingen, dieselbe Laufzeitumgebung zu verwenden (zum Beispiel müssen alle Programme in einer JVM oder in .NET laufen) und einen Garbage Collector enthalten.

Betriebssysteme enthalten oft spezialisierte Formen von Garbage Collectors, die normalerweise auf der Referenzzählung basieren, um beispielsweise eine Datei zu schließen, wenn die Anzahl der geöffneten Prozesse auf 0 fällt oder ebenfalls für einen gemeinsamen Speicherbereich.

    
Gilles 12.10.2014, 14:38
quelle
7
  

Ich frage mich, weil OS nicht verantwortlich für die Speicherverwaltung ist?

Nur in dem Sinne, dass das Betriebssystem den Programmen Speicher zuweist, die dann entscheiden, wie sie dies mit ihren eigenen Speichermanagern verwenden. Die weitere Zentralisierung der Speicherverwaltung im Betriebssystem ist problematisch, weil es langsam wäre: Programme haben unterschiedliche Speicherzugriffsmuster, so dass es für Programmierer schwieriger wäre, benutzerdefinierte Speicherverwaltungsmuster zu verwenden, wenn sie dieselben GCs hätten. Zum Beispiel erfordern verschiedene Sprachlaufzeiten unterschiedliche Müllsammler, um die Idiome der Sprachen auf effiziente Weise zu unterstützen. Es würde auch den OS-Entwurf verkomplizieren, indem das Betriebssystem Speicher in Programmen verwaltet.

In gewisser Hinsicht bieten Betriebssysteme bereits GC: Wenn ein Programm beendet wird, säubert ein typisches Betriebssystem seinen Speicher. Aber solange das Programm läuft, ist es für die Verwaltung des Speichers verantwortlich, den das Betriebssystem ihm gibt.

BEARBEITEN : Bei den anderen Antworten gibt es einige Diskussionen darüber, was ein Betriebssystem ausmacht. Ich habe eine enge Definition betrachtet, bei der ein Betriebssystem ein Kernel ist, ein laufendes Programm, das Planung und Dienste für Prozesse bereitstellt. Dies entspricht Ihrem typischen Windows / Linux / Unix-Desktop / Server-Betriebssystem.

    
Fred Foo 12.10.2014 14:13
quelle
2

tut es.

Bei der Garbage Collection muss das Betriebssystem wissen, was Müll ist und was nicht. Der einfachste Weg dazu ist eine Art Sicherheitsgarantie. Einige experimentelle Betriebssysteme, wie Es und Singularität , bieten typsichere Sprachlaufzeiten auf Kernel-Ebene: JavaScript in Es und eine C # Variante in Singularity. Die meisten Kernel sind jedoch so konzipiert, dass Anwendungen in gängigen unsicheren Sprachen wie C ++ ausgeführt werden können. Alles, was ein Kernel in einem solchen Fall tun kann, ist die Wiederherstellung des Speichers, der von einem Prozess belegt ist, der beendet wurde.

Die meisten Kernel delegieren die Verwaltung von Speicher, der zu einem bestimmten Prozess gehört, an die Sprachlaufzeit. Die Standardinstallationen aller gängigen Desktopbetriebssysteme enthalten mehr als eine Laufzeitumgebung, in der Anwendungen nicht ausgeführt werden können.

  • Das .NET Framework wird mit allen unterstützten Desktopversionen von Windows geliefert.
  • Python kommt mit OS X und populären GNU / Linux-Distributionen.
  • Android enthält die Dalvik VM, die die gleiche Garbage Collection wie Java implementiert.
  • Darüber hinaus werden alle Desktop- und mobilen Betriebssysteme mit einem Webbrowser ausgeliefert, der JavaScript implementiert.
Damian Yerrick 12.10.2014 14:43
quelle
1

Garbage Collection wird von eigener Software übernommen, bei der Programmierung oder Programmierung von Software, aber das ist kompliziert und erfordert fortgeschrittene Entwicklererfahrung.

Normalerweise haben in C und C ++ geschriebene Programme keine automatische Speicherverwaltung wie Programme, die in Java oder PHP geschrieben sind. Das bedeutet, dass ein Programm, das in C ++ geschrieben ist, verlangt, dass der Programmierer definiert, dass die von der Software verwendeten Daten aus dem Speicher gelöscht werden, wenn sie nicht mehr verwendet werden.

So sind viele Programme, die Sie verwenden, in C und C ++ geschrieben und die Speicherverwaltung ist in den meisten Fällen nicht sehr effizient. Wenn Sie diese Programme ausführen, enthält Ihr Speicher viele Fragmente, die nicht mehr verwendet werden, und dies ist ein Fehler des Programms. Die einzige Alternative, die ich kenne, ist den PC neu starten.

Ich stimme zu, dass die SO selbst ein Werkzeug haben sollte, um ungenutzte Speicherbereiche zu "säubern", wie es für Android (Ccleaner zum Beispiel) ist.

    
joseneas 12.10.2014 14:04
quelle