2009-02-12 17 views
27

Ich habe über Möglichkeiten nachgedacht, dass funktionale Sprachen direkter an ihre Hardware gebunden sein könnten und habe mich über Hardware-Implementierungen von Garbage Collection Gedanken gemacht.Hardware Assisted Garbage Collection

Dies würde die Dinge erheblich beschleunigen, da die Hardware selbst implizit die gesamte Sammlung handhaben würde, anstatt die Laufzeit einiger Umgebungen.

Haben LISP Machines das gemacht? Wurde diese Idee weiter erforscht? Ist das zu domänenspezifisch?

Gedanken? Einwände? Diskutieren.

+1

der Müllwagen, der von meinem Haus kommt, hebt auf und leert den Mülleimer von selbst. zählt das? – kenwarner

+0

Ich frage mich, ob dies würde die gesamte GC aktivieren - Stellen Sie sich vor, keine Prozesspartitionierung (und durch Verschwendung von Fragmentierung, und verteilten reservierten leeren Raum für neue Alloc). Installieren Sie die Zeitüberprüfung der Software und die Fähigkeit, Objekte zwischen Anwendungen ohne Kopieren zu übertragen. Ich mag Befähiger. Die Hardwareunterstützung könnte statistische Messungen umfassen, die fortlaufend kalte Speicherblöcke finden, sowie Referenzzählung. – Todd

Antwort

13

Wegen Generations-Sammlung, ich würde sagen müssen, dass das Verfolgen und Kopieren nicht große Engpässe zu GC sind.

Was helfen würde, sind hardwaregestützte READ-Barrieren, die die Notwendigkeit von "Stop the world" -Pausen bei Stack-Scans und der Markierung des Heaps beseitigen.

Azul Systems hat dies getan: http://www.azulsystems.com/products/compute_appliance.htm Sie gaben eine Präsentation bei JavaOne darüber, wie ihre Hardware-Modifikationen völlig pauseless GC ermöglicht.

Eine weitere Verbesserung wären hardwaregestützte Schreibbarrieren für die Verfolgung von gespeicherten Mengen.

Generative GCs, und noch mehr für G1 oder Garbage First, reduzieren die Anzahl der zu scannenden Heaps, indem sie nur eine Partition scannen und eine Liste der gemerkten Sets für zonenübergreifende Zeiger führen.

Das Problem ist, das bedeutet, JEDERMAL setzt der Mutator (lustiges Wort für das 'echte Programm') einen Zeiger, der auch einen Eintrag in die entsprechende, gemerkte Menge setzen muss. Sie haben also (kleinen) Overhead, auch wenn Sie nicht GCing sind. Wenn Sie dies reduzieren können, reduzieren Sie sowohl die für GCing erforderlichen Pausenzeiten als auch die Gesamtleistung des Programms.

+0

azulsystems sehen interessant aus –

+0

Ich lag falsch, Garbage First scannt/markiert den gesamten Heap während eines GC, kopiert aber nur Abschnitte (oder kopiert sie nicht). – runT1ME

+0

Warum bei der Garbagw-Kollektion anhalten? Es könnte auch dazu beitragen, nicht verwalteten Speicher zu optimieren. Es kann Speicher zuordnen und freigeben. –

0

Warum sollte es die Dinge beschleunigen? Was genau sollte die Hardware machen? Es muss immer noch alle Referenzen zwischen Objekten durchlaufen, was bedeutet, dass es einen großen Teil der Daten im Hauptspeicher durchlaufen muss, was der Hauptgrund dafür ist, dass es Zeit braucht. Was würdest du dadurch gewinnen? Welche bestimmte Operation ist Ihrer Meinung nach schneller mit Hardwareunterstützung möglich? Die meiste Arbeit in einem Garbage Collector folgt nur Zeigern/Verweisen und gelegentlich kopiert Live-Objekte von einem Heap zu einem anderen. Wie unterscheidet sich das von den Anweisungen, die eine CPU bereits unterstützt?

Mit dem genannten, warum denken Sie, wir brauchen schneller Garbage Collection? Ein moderner GC kann bereits sehr schnell und effizient sein, bis zu dem Punkt, an dem es im Grunde ein gelöstes Problem ist.

+0

was 'tude? Ich fragte einfach nach weiteren Einzelheiten zu dem, was Sie zu erreichen glaubten (und warum es von Vorteil wäre). Tut mir leid, wenn es hart klang. Ich sehe einfach nicht, was genau du hardwarebeschleunigen willst. – jalf

+0

Aber wenn Sie sagen, dass "dies würde die Dinge erheblich beschleunigen", denke ich, es ist fair zu fragen, warum *. Nicht wahr? – jalf

+0

Ich hatte den Eindruck, wenn Dinge normalerweise in einer Hardwareversion implementiert werden, tendiert es dazu, die Softwareversion zu überholen. Nicht in allen Fällen, da ich gesehen habe, dass virtualisierte Funktionen schneller laufen als ihre Hardware-Gegenstücke. Du bist gerade als rüstiger Typ abgegangen. –

2

Ich bin mir ziemlich sicher, dass einige Prototypen existieren sollten. Aber Hardware-spezifische Features zu entwickeln und zu produzieren ist sehr teuer. Es hat sehr lange gedauert, MMU oder TLB auf Hardwareebene zu implementieren, die recht einfach zu implementieren sind.

Der GC ist zu groß, um auf Hardwareebene effizient implementiert werden zu können.

+3

Dinge wie OpenGL und Virtualisierung sind wohl zu groß, um sie auch in Hardware zu implementieren, aber Sie können * einige * Hardware-Unterstützung hinzufügen, die es ermöglicht, dass diese wirklich schnell gehen. Er sagte "hardware * assisted *", nicht "hardware-only". – Ken

+0

Ich würde vorschlagen, dass, wenn man einen weichen Kern und Metzger nimmt, der MMU hardwareunterstützte GC möglich wäre –

+4

Das Argument, dass Sie den exakt gleichen Algorithmus nicht implementieren können, ist absurd. Es ist dasselbe wie zu sagen "Sie können nicht eine Maschine implementieren, die diese Algorithm implementieren kann". In diesem Fall existiert eine solche Maschine bereits, weil eine CPU eine solche Maschine ist, sie ist einfach nicht für diese spezielle Aufgabe optimiert. Ein Zähler ist einer der einfachsten Konstrukte, die in Logik implementiert werden können. Der Rest ist eine Kombination aus Einlösen, virtuellem Speicher und möglicherweise DMA. – NoMoreZealots

4

Eine offensichtliche Lösung bestand darin, Speicherzeiger zu haben, die größer als Ihr verfügbarer RAM sind, z. B. 34-Bit-Zeiger auf einer 32-Bit-Maschine. Oder verwenden Sie die obersten 8 Bits einer 32-Bit-Maschine, wenn Sie nur 16 MB RAM (2^24) haben. Die Oberon machines an der ETH Zürich nutzte ein solches Schema mit viel Erfolg, bis RAM zu billig wurde. Das war um 1994, also ist die Idee ziemlich alt.

Dies gibt Ihnen ein paar Bits, wo Sie Objektstatus speichern können (wie "das ist ein neues Objekt" und "Ich habe gerade dieses Objekt berührt"). Wenn Sie den GC verwenden, bevorzugen Sie Objekte mit "Dies ist neu" und vermeiden Sie "nur berührt".

Dies könnte tatsächlich eine Renaissance erleben, denn niemand hat 2^64 Bytes RAM (= 2^67 Bits; es gibt ungefähr 10^80 ~ 2^240 Atome im Universum, also ist es vielleicht nicht möglich zu haben so viel RAM jemals). Das heißt, Sie könnten ein paar Bits in den heutigen Maschinen verwenden , wenn die VM dem Betriebssystem mitteilen kann, wie der Speicher zugeordnet wird.

+0

Ich erinnere mich an die ursprünglichen Apple Macs verwendet, um etwas ähnliches zu tun: 32bit ptrs, aber Top-8-Bits waren eine Art von Tag und nur 24bit Adresse.Einige Dinge durften verschoben werden, um eine Fragmentierung zu vermeiden. Sie mussten es mit der Zeit loswerden> 16MByte Maschinen erschienen! – timday

+0

Tatsächlich gibt es laut Wikipedia etwa 10^80 Atome im Universum. –

+1

Ich habe meinen Cache aktualisiert (in meinem Kopf). –

1

Die wahrscheinlich relevanteste Datenmenge, die hier benötigt wird, ist, wie viel Zeit (Prozentsatz der CPU-Zeit) derzeit für die Speicherbereinigung aufgewendet wird? Es kann kein Problem sein.

Wenn wir danach gehen, müssen wir berücksichtigen, dass die Hardware mit Speicher "hinter unserem Rücken" täuscht. Ich denke, das wäre "ein anderer Thread", in der modernen Sprache. Ein gewisser Speicher ist möglicherweise nicht verfügbar, wenn er untersucht wird (vielleicht mit Dual-Port-Speicher lösbar), und sicherlich, wenn der HWGC Dinge herumbewegen wird, dann müsste er die anderen Prozesse sperren, so dass sie nicht gestört werden . Und tun Sie es so, dass es in die verwendete Architektur und Sprache passt. Also, ja, Domain-spezifisch.

Schau, was gerade erschien ... in another post ... Blick auf Java-GC-Protokoll.

+0

"Wenn die HWGC Sachen herum bewegen wird" - nun wirst du nicht "ziehen", aber Kopieren, Abbrechen, wenn der Quellspeicher während der Operation "Kopieren" beschrieben wird. – Todd

4

Es gab an article on lambda the ultimate, die beschreiben, wie Sie einen GC-aware virtuellen Speichermanager benötigen, um einen wirklich effizienten GC zu haben, und das VM-Mapping wird heutzutage hauptsächlich von Hardware durchgeführt. Hier sind Sie :)

1

entnehme ich, das größte Problem CPU-Register und der Stapel ist. Eines der Dinge, die Sie während GC tun müssen, ist das Durchlaufen aller Zeiger in Ihrem System, was bedeutet, dass Sie wissen, was diese Zeiger sind. Wenn sich einer dieser Zeiger gerade in einem CPU-Register befindet, müssen Sie auch diesen durchlaufen. Ähnlich, wenn Sie einen Zeiger auf den Stapel haben. Also muss jeder Stack-Frame eine Art Map haben, die besagt, was ein Pointer ist und was nicht, und bevor Sie GC-Traversing durchführen, müssen Sie irgendwelche Pointer in den Speicher bringen.

Sie stoßen auch auf Probleme mit Schließungen und Fortsetzungen, weil Ihr Stapel plötzlich aufhört, eine einfache LIFO-Struktur zu sein.

Der offensichtliche Weg ist, niemals Zeiger auf dem CPU-Stack oder in Registern zu halten. Stattdessen haben Sie jeden Stack-Frame als ein Objekt, das auf seinen Vorgänger verweist. Aber das tötet Leistung.

+0

Nun, es geht ohne zu sagen, GC müsste in den Prozessor integriert werden und in Kombination mit dem MMU und Cache-System arbeiten. – NoMoreZealots

2

Ältere Sparc-Systeme hatten Speicher (33 Bits) gekennzeichnet, der zum Markieren von Adressen verwendet werden konnte. Heute nicht eingebaut?

Dies kam von ihrer LISP Erbe IIRC.

Einer meiner Freunde baute einen Generations-GC, der sich durch einfaches Stehlen von Primitiven auszeichnete. Es hat besser funktioniert.

Also, ja, es kann gemacht werden, aber Nodody stört Dinge mehr zu markieren.

Die Kommentare von runT1mes über hardwareunterstützte Generationen GC sind lesenswert.

Bei einem ausreichend großen Gate-Array (Vertex-III kommt mir in den Sinn) wäre eine erweiterte MMU möglich, die GC-Aktivitäten unterstützt.

4

Sie sind ein Student, klingt wie ein gutes Thema für ein Forschungsstipendium für mich. Schauen Sie in FPGA-Design und Computer-Architektur gibt es viele kostenlose Prozessor-Design zur Verfügung http://www.opencores.org/

Garbage Collection kann als Hintergrund-Task implementiert werden, ist es bereits für den Parallelbetrieb vorgesehen.

Pete

+0

FPGA sind großartig. Es gibt neue Rasberry Pi Clones mit eingebauten FPGA-Einheiten, die programmiert werden können. –

1

Mehrere große Geister am MIT in den 80er Jahren schuf die SCHEME-79 Chip, der direkt einen Dialekt von Schema interpretiert wurde mit LISP DSLs entworfen, und hatte Hardware-gc eingebaut.

Scheme-79 die