Welches Speichermodell ist in .NET Core implementiert?

36

Die ECMA-CLI-Spezifikation definiert ein schwaches Speichermodell. Dies ermöglicht die Neuordnung der Befehlsausführungsreihenfolge (was für die Leistung nützlich ist). Das Schreiben von Low-Level-Code für ein solches Modell ist jedoch sehr schwierig.

Und vor allem: X86 / AMD64-Prozessorarchitekturen haben ein strengeres (starkes) Speichermodell. Infolgedessen hat Microsoft in seiner CLR-Implementierung ein stärkeres Speichermodell implementiert als in der Spezifikation beschrieben.

Hat sich das Speichermodell in .NET Core geändert? Möglicherweise kann dieses Framework auf Architekturen mit einem schwächeren Speichermodell als X86 / AMD64 ausgeführt werden.

Darüber hinaus enthält .NET Core Mono und andere. Und soweit ich weiß, ist das Mono-Speichermodell schwächer, entspricht ECMA.

In diesem Artikel Einführung in .NET 5 geschrieben:

Erweitern Sie die Funktionen von .NET, indem Sie das Beste aus .NET Core, .NET Framework, Xamarin und Mono herausholen.

Ich denke, wenn nicht jetzt, dann werden diese Laufzeiten in Zukunft zu einem Ganzen verschmelzen.
Unten im Artikel steht geschrieben:

Wir sind dabei, CoreCLR und Mono gegenseitig zu ersetzen. Wir machen es so einfach wie ein Build-Switch, zwischen den verschiedenen Laufzeitoptionen zu wählen.

Wenn ich das richtig verstehe, gibt es zwei (oder mehr) Laufzeiten. Und wahrscheinlich wird jeder sein eigenes Speichermodell haben.

Worüber sprechen wir: Speichermodell .

Alexander Petrov
quelle
8
Verwandte . Fazit: CoreCLR sieht sich nicht gezwungen, die stärkeren Garantien der CLR auf x86 zu replizieren (was, um fair zu sein, für ARM unpraktisch wäre). (Gleichzeitig gibt es keinen Anreiz, absichtlich vom aktuellen x86-Modell auf x86 abzuweichen.)
Jeroen Mostert
".NET Core enthält Mono und andere" benötigt Linkreferenzen. Ich glaube noch nicht, dass das stimmt, da .NET Core CLR und Mono CLR immer noch getrennte Dinge sind.
Lex Li
@ LexLi - aktualisiert. Link hinzugefügt.
Alexander Petrov
@Alexander Petrov Dieser Link betrifft .NET 5, das im Jahr 2020 erscheinen wird. .NET Core und Mono sind immer noch unterschiedliche Plattformen.
V0ldek

Antworten:

1

Das Speichermodell ist spezifisch für die Laufzeit, daher lautet Ihre Frage tatsächlich "Gibt es Unterschiede in den Speichermodellen von CLR, CoreCLR und MonoRuntime?".

Nach ein wenig Recherche ist die Frage wirklich sehr, sehr schwer zu beantworten. Es gibt die von Ihnen erwähnte ECMA-Spezifikation , die Ihnen die Mindestgarantien bietet, die alle Implementierungen bieten müssen. Es gibt eine sehr schöne, prägnante Beschreibung in Joe Duffys Blog für CLR 2.0. Für .NET Framework gibt es diesen zweiteiligen Artikel , in dem das CLR-Modell wahrscheinlich ausführlicher behandelt wird, als es zu wissen ist. Es gibt sogar ein Papier darüber geschrieben.

Für MonoRuntime habe ich dieses Dokument gefunden , das sich mit Atomics befasst und tatsächlich beschreibt, wie Mono dies implementiert, obwohl der Detaillierungsgrad eher gering ist.

Noch schwieriger ist es, Details zu CoreCLR zu finden. Es gibt einige Schlüsselpunkte in diesem hervorgehoben Dotnet / CoreCLR GitHub Faden und eine Diskussion über flüchtige Lese / Schreibvorgänge in diesem einen .

Der einfachste Weg zu antworten ist - ja, es hat sich basierend auf den oben genannten Ressourcen geändert.

Es gibt jedoch eine zweite Möglichkeit, Ihre Frage zu beantworten, und zwar einfach, ihre Prämisse zu leugnen - es scheint anzunehmen, dass sich das Speichermodell in dem Sinne geändert hat, dass sich einige kluge Leute hinsetzten, die ECMA-CLI-Spezifikation umschrieben und dies in die CoreCLR machten Speichermodellspezifikation und das ist das neue Speichermodell. Das ist nicht der Fall. Die genannten intelligenten Leute setzten sich und verfeinerten das Design im Laufe vieler Monate so, dass es zuverlässig, schnell, vernünftig einfach zu implementieren und nicht gegen die Mindestgarantien der Spezifikation verstößt. Zitiert aus dem verlinkten Blog von Joe Duffy:

Wir haben unser Modell über Jahre informeller Arbeit und beispielhafter Gestaltung (...) konstruiert. Dies kann sich von einer Implementierung zur nächsten ändern.

Die informelle ECMA-Spezifikation ist leider so formal, wie wir es derzeit bekommen. Es gibt weder eine formale Beschreibung von Änderungen zwischen der ECMA-Spezifikation und der CLR-Implementierung noch eine formale Beschreibung von Änderungen zwischen CLR und CoreCLR. Und was noch wichtiger ist: Die implementierungsspezifischen Unterschiede zwischen der ECMA-CLI und der CLR / CoreCLR sind genau das - implementierungsspezifisch - und dürfen nicht als verlässlich angesehen werden . Die einzige 100% zuverlässige Quelle für die Implementierung des .NET Core-Speichermodells ist der Quellcode. Und das ändert sich offensichtlich mit jedem Commit, jeder Veröffentlichung, und es gibt keine Garantie dafür, dass das Team nicht den gesamten Jitter aus dem Fenster wirft und ihn neu schreibt, damit .NET 5 genau der ECMA-Spezifikation entspricht (wie unwahrscheinlich dies auch sein mag) ).

V0ldek
quelle