Die Sprache Nim fĂŒhrt YRC ein – einen threadsicheren Garbage Collector fĂŒr zirkulĂ€re Referenzen.

Andreas Rumpf (Araq), der Schöpfer der Programmiersprache Nim, hat einen neuen Algorithmus zur Speicherverwaltung namens YRC (ausgesprochen „Ürk“) vorgestellt, der ein zentrales Problem der bestehenden Mechanismen in Nim löst: die korrekte Verarbeitung von zirkulĂ€ren Referenzen, die die Thread-Grenzen ĂŒberschreiten.

Vor der EinfĂŒhrung von YRC hatten die in Nim angebotenen Algorithmen zur Speicherverwaltung folgende EinschrĂ€nkungen: ARC – unterstĂŒtzte weder Multithreading noch die Behandlung von KreislĂ€ufen; Atomic ARC – war threadsicher, behandelte jedoch keine zirkulĂ€ren Referenzen; ORC – konnte zirkulĂ€re Referenzen behandeln, jedoch nur korrekt innerhalb eines einzelnen Threads (bei der Verwendung von gemeinsamen Referenzen zwischen Threads traten GedĂ€chtnislecks auf).

Die vorgeschlagene YRC kombiniert Thread-Sicherheit und das Verarbeiten von Zyklen zwischen Threads durch einen hybriden Ansatz: FĂŒr azyklische Daten wird eine atomare ReferenzzĂ€hlung verwendet, wĂ€hrend fĂŒr zyklische Daten eine Schreibbarriere (write barrier) zum Einsatz kommt, die nur beim Zuweisen von Zeigern aktiviert wird. In der vorgeschlagenen Implementierung wird der Collector nur bei tatsĂ€chlichem Bedarf gestartet (keine stop-the-world Pausen); die Wurzelobjekte von RC sind eindeutig definiert und werden einmalig zusammengefĂŒhrt (kein Scannen der Thread-Stacks erforderlich); das mehrfĂ€dige Löschen wĂ€hrend der Iteration wird vermieden (keine globale Sweep-Phase); Mutatoren können Daten frei lesen; jeder Thread kann bei Bedarf den Garbage Collector starten (kein dedizierter GC-Thread).

YRC nutzt vollstĂ€ndige Informationen zu den Ereignissen incRef/decRef, die herkömmliche tracing Garbage Collector (GC) ignorieren und dann durch das Scannen von Stacks und Traversieren des Graphen wiederherstellen mĂŒssen. Die Implementierung besteht aus nur 550 Codezeilen und hat eine formale Sicherheits- und Deadlock-Verifizierung durch eine Spezifikation in der Sprache TLA+ und einen Beweis im Lean-Toolset. YRC wird als "nahezu letzter ZĂ€hler-basierten Cycles Collector" positioniert (der Buchstabe Y kommt vor Z im Alphabet) und auch als der einfachste thread-sichere Garbage Collector — laut dem Autor erfordert er nicht die vielen komplexen Mechanismen, die herkömmlichen tracing Garbage Collectors eigen sind.

YRC bietet die gleiche API wie ORC und fĂŒhrt Destruktoren wĂ€hrend der Garbage Collection aus. Der Sammler verarbeitet nur die Teilgraphen von Objekten, mit denen die Threads arbeiten, und berĂŒhrt keine unverbundenen Datenstrukturen (Caches, langlebige Objekte). Dieser Ansatz Ă€hnelt einem „idealen“ generationsbasierten Garbage Collector ohne die Verwendung von Generationen. Der Hauptnachteil ist die Leistung: YRC zeigt im orcbench-Leistungstest eine Verlangsamung von 1,5 bis 2,0 im Vergleich zu ORC. Der Autor hĂ€lt dies fĂŒr einen akzeptablen Preis fĂŒr die vollstĂ€ndige thread-sichere Behandlung von zyklischen Verweisen.

YRC ist bereits in der Entwicklungsversion von Nim verfĂŒgbar und wird ĂŒber das Flag „—mm:yrc“ aktiviert. In spĂ€teren Mitteilungen erkannte der Autor jedoch, dass die ursprĂŒngliche Implementierung schwerwiegende Fehler enthielt und Zyklen nicht korrekt sammelte. Zum Zeitpunkt der Veröffentlichung steht ein Satz von Korrekturen zur VerfĂŒgung, die die Hauptfehler beheben. Der Autor arbeitet weiterhin an der Feinabstimmung der Sammelheuristiken und der Behebung der verbleibenden Fehler, wĂ€hrend der grundlegende Algorithmus und dessen formale Verifikation korrekt bleiben.

Quelle: opennet.ru

Erwerben Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster