Frage

Es scheint, dass es ein aktuelles steigendes Interesse an STM wurde (Software Transactional Memory) Frameworks und Spracherweiterungen. Clojure insbesondere hat eine hervorragende Umsetzung, die MVCC (Multi-Version Concurrency Control) eher als ein Rollprotokoll begehen. GHC Haskell hat auch rel="noreferrer"> die auch Transaktions Zusammensetzung erlaubt . Schließlich, um mein eigenes Horn nur ein bisschen zu blasen, ich habe vor kurzem eine STM Rahmen für die Scala die Referenz Einschränkungen statisch erzwingt.

Alle diese sind interessante Experimente, aber sie scheinen allein auf diesen Bereich beschränkt werden (Experimente). Also meine Frage ist: Hat jemand von Ihnen STM in der realen Welt gesehen oder gebraucht? Wenn ja warum? Welche Vorteile hat es bringen? Was ist Leistung? (Es scheint in diesem Punkt sehr viel widersprüchlicher Informationen zu sein) Möchten Sie STM wieder verwenden oder doch lieber eine andere Concurrency Abstraktion wie Schauspieler benutzen?

War es hilfreich?

Lösung

Ich nahm an dem Bastler Entwicklung der BitTorrent-Client in Haskell (benannt conjure). Es verwendet STM ziemlich stark unterschiedliche Threads (1 pro Peer + 1 für das Speichermanagement + 1 für das Gesamtmanagement).

zu koordinieren

Vorteile: weniger Schlösser, lesbarer Code

.

Geschwindigkeit war kein Problem, zumindest nicht aufgrund STM-Nutzung.

Hope, das hilft

Andere Tipps

Der Artikel „Software Transactional Memory: Warum ist es nur ein Forschungs Spielzeug?“ scheitert an der Haskell Implementierung zu suchen, die eine wirklich große Unterlassung ist. Das Problem für STM, wie der Artikel weist darauf hin, dass Implementierungen zwischen entweder machen alle Variable zugreift Transaktions es sei denn, der Compiler sie nachweisen können, sicher wählte müssen (die Leistung kills) oder den Programmierer lassen angeben, welche sind transaktionale zu sein (die Einfachheit tötet und Zuverlässigkeit). Doch die Haskell Implementierung verwendet die Reinheit von Haskell die Notwendigkeit zu vermeiden, um die meisten zu machen Variable verwendet Transaktions-, während das Typsystem ein einfaches Modell zusammen mit wirksamer Durchsetzung der Transaktions Mutation Operationen zur Verfügung stellt. So ein Programm Haskell kann für diese Variablen STM verwenden, die zwischen den Threads wirklich geteilt werden, während die gewährleisten, dass nicht transaktionale Speicher Verwendung Gesichert wird.

Wir verwenden es ziemlich regelmäßig für hohe Parallelität Apps bei Galois (in Haskell). Es funktioniert, seine weit verbreitet in der Haskell Welt verwendet, und es ist eine Sackgasse nicht (obwohl man natürlich zu viel Konkurrenz haben kann). Manchmal haben wir Dinge umschreiben MVar zu verwenden, wenn wir das Design Recht haben -., Da sie schneller sind

Just verwenden. Es ist keine große Sache. Soweit es mich betrifft, STM in Haskell ist „gelöst“. Es gibt keine weitere Arbeit zu tun. So nutzen wir es.

Wir, factis research GmbH , verwenden Haskell STM mit GHC in der Produktion. Unser Server einen Strom von Nachrichten über neue und geänderte „Objekte“ von einem ClinCal „Datenserver“ empfängt, wandelt diesen Ereignisstrom on the fly (durch neue Objekte zu erzeugen, Objekte ändert, Dinge aggregieren, usw.) und berechnet die diese neuen Objekte sollten verbunden iPads synchronisiert werden. Er empfängt auch Eingaben von iPads Form, die verarbeitet wird, mit dem „Hauptstrom“ zusammengefasst und auch auf den anderen iPads synchronisiert. Wir verwenden STM für alle Kanäle und änderbare Datenstrukturen, die zwischen Threads gemeinsam genutzt werden müssen. Themen sind sehr leicht in Haskell, so dass wir viele von ihnen ohne die Leistung zu beeinträchtigen (zur Zeit 5 pro iPad-Verbindung) haben können. eine große Anwendung zu bauen ist immer eine Herausforderung, und es gab viele Lektionen gelernt werden, aber wir hatten nie Probleme mit STM. Es funktionierte immer, wie Sie naiv erwarten würde. Wir hatten einige ernsthafte Performance-Tuning zu tun, aber STM war nie ein Problem. (80% der Zeit versuchen wir kurzlebig Zuweisungen und Gesamtspeicherverbrauch zu reduzieren.)

STM

ist ein Bereich, wo Haskell und die GHC-Laufzeit wirklich glänzen. Es ist nicht nur ein Experiment und nicht für Spielzeug Programme nur.

Wir bauen eine andere Komponente unseres ClinCal System in Scala und haben Schauspieler wurde unter Verwendung von so weit, aber wir sind wirklich STM fehlt. Wenn jemand Erfahrung hat, wie es ist in der Produktion eine der Scala STM-Implementierungen verwenden würde ich gerne von Ihnen zu hören. : -)

Wir haben unsere gesamtes System (In-Memory-Datenbank und Laufzeit) implementiert oben unsere eigenen STM-Implementierung in C Vor diesem Zeitpunkt hatten wir einige Log- und sperren basierten Mechanismus mit Parallelität zu behandeln, aber das war ein Schmerz zu erhalten. Wir sind sehr zufrieden mit STM, da wir jeden Betrieb die gleiche Art und Weise behandeln kann. Fast könnte alle Sperren entfernt werden. Wir STM verwenden jetzt fast alles in jeder Größe, haben wir sogar einen Speichermanager auf implementieren.

Die Leistung ist in Ordnung, aber die Dinge beschleunigen wir jetzt eine benutzerdefinierte Betriebssystem in Zusammenarbeit entwickelt mit der ETH Zürich. Das System unterstützt native Transaktionsspeicher.

Aber es gibt einige von STM verursachten Herausforderungen. Vor allem bei größeren Transaktionen und Hotspots, die unnötigen Transaktionskonflikte verursachen. Wenn zum Beispiel zwei Transaktionen ein Element in einer verknüpften Liste setzen, wird eine unnötige Konflikte auftreten, die hätte vermieden werden können eine Sperre freie Datenstruktur.

Ich bin derzeit mit Akka in einiger PGAS Systemforschung. Akka ist eine Scala Bibliothek für skalierbare gleichzeitige Entwicklung von Systemen mit Schauspieler, STM und integrierte Funktionen Fehlertoleranz nach Erlang modelliert " Let It fehlschlagen / Absturz / Crater / ROFL“Philosophie. Akka STM-Implementierung angeblich um einen Scala Hafen von Clojure STM Implementierung gebaut. Eine Übersicht über Akka STM-Modul kann hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top