4 Stimmen

Bereichsbezogene Speicherverwaltung

Ich entwerfe eine Hochsprache, und ich möchte, dass sie die Geschwindigkeit von C++ hat (sie wird LLVM verwenden), aber sicher und hochrangig wie C# ist. Garbage Collection ist langsam, und new/delete ist unsicher. Ich habe beschlossen, "region based memory management" zu verwenden (es gibt ein paar Abhandlungen darüber im Internet, meist für funktionale Sprachen). Die einzige "nützliche" Sprache, die dies verwendet, ist Cyclone, aber die hat auch GC. Grundsätzlich werden Objekte auf einem lexikalischen Stack alloziert und wieder freigegeben, wenn der Block geschlossen wird. Objekte können nur auf andere Objekte in der gleichen oder einer höheren Region verweisen, um "Dangling References" zu vermeiden. Um dies flexibler zu gestalten, habe ich parallele Regionen hinzugefügt, die auf dem Stack nach oben und unten verschoben werden können und durch Schleifen beibehalten werden können. Das Typsystem wäre in den meisten Fällen in der Lage, Zuweisungen zu verifizieren, aber an einigen Stellen wären Laufzeitprüfungen mit geringem Aufwand erforderlich.

Ex:

region(A) {
    Foo@A x=new Foo(); //x is deleted when this region closes.
    region(B,C) while(x.Y) {
        Bar@B n=new Bar();
        n.D=x; //OK, n is in lower region than x.
        //x.D=n; would cause error: x is in higher region than n.
        n.DoSomething();
        Bar@C m=new Bar();
        //m.D=n; would cause error: m and n are parallel.
        if(m.Y)
            retain(C); //On the next iteration, m is retained.
    }
}

Ist das praktisch? Müsste ich nicht-lexikalisch skalierte, referenzierte Regionen hinzufügen? Müsste ich schwache Variablen hinzufügen, die auf jedes beliebige Objekt verweisen können, aber mit einer Prüfung beim Löschen von Regionen? Fallen Ihnen Algorithmen ein, die mit diesem System nur schwer zu verwenden wären oder die undicht wären?

14voto

Norman Ramsey Punkte 193087

Ich würde Ihnen davon abraten, Regionen auszuprobieren. Das Problem ist, dass man ein sehr ausgeklügeltes Typsystem braucht, um Regionen garantiert sicher zu machen - ich bin sicher, Sie haben sich die Arbeiten von Tofte und Talpin angesehen und haben eine Vorstellung von der Komplexität, die damit verbunden ist. Selbst wenn Sie Regionen erfolgreich zum Laufen bringen, ist die Wahrscheinlichkeit sehr hoch, dass Ihr Programm eine Region benötigt, deren Lebensdauer die Lebensdauer des Programms ist - und diese Region muss mindestens garbage collected werden. (Aus diesem Grund hat Cyclone Regionen y GC.)

Da Sie gerade erst anfangen, würde ich Sie ermutigen, mit Garbage Collection zu arbeiten. Moderne Garbage-Collectors können ohne großen Aufwand ziemlich schnell gemacht werden. Das Hauptproblem ist die Zuweisung von zusammenhängendem freien Speicherplatz, damit die Zuweisung schnell erfolgt. Es ist hilfreich, einen AMD64 oder eine andere Maschine mit freien Registern zu verwenden, damit Sie ein Hardware-Register als Zuweisungszeiger verwenden können.

Es gibt viele gute Ideen, die man anpassen kann; eine der einfachsten ist ein seitenbasierter Collector wie der mostly-copying Collector von Joel Bartlett, bei dem die Zuweisung nur von komplett leeren Seiten erfolgt.

Wenn Sie die vorhandenen Garbage Collectors studieren wollen, Lua hat einen ziemlich ausgeklügelten inkrementellen Garbage Collector (so dass es keine sichtbaren Pausenzeiten gibt) und die Implementierung umfasst nur 700 Zeilen. Sie ist schnell genug, um in vielen Spielen verwendet zu werden, bei denen Leistung eine Rolle spielt.

5voto

Logan Capaldo Punkte 38523

Wenn ich eine Sprache mit regionsbasierter Speicherverwaltung implementieren würde, würde ich wahrscheinlich lesen Ein sprachunabhängiger Rahmen für die Inferenz von Regionen . Allerdings ist es schon eine Weile her, dass ich mich mit diesem Thema beschäftigt habe, und ich bin sicher, dass sich der Stand der Technik weiterentwickelt hat, falls ich überhaupt jemals wusste, was der Stand der Technik war.

0voto

Will Hartung Punkte 110997

Dann sollten Sie sich mit Apples Speicherverwaltung beschäftigen. Es hat Freigabe-Pools und Zonen, die sicher klingen viel wie das, was Sie hier tun.

Ich werde die Bemerkung "GC ist langsam" nicht kommentieren,

0voto

Çağdaş Bozman Punkte 2507

Sie können mit den Arbeiten von Tofte und Talpin über regionsbasierte Speicherverwaltung beginnen.

-1voto

rmmh Punkte 6831

Wie würde ein dynamisch erstelltes Objekt zurückgegeben? Wer würde es "besitzen" und für die Freigabe des Speichers verantwortlich sein?

Nachzählung oder GC sind so üblich, weil sie fast immer die beste Wahl sind. Generationale Garbage Collectors können sehr effizient sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X