Jaki model pamięci jest zaimplementowany w .NET Core?

36

Specyfikacja interfejsu ECMA CLI definiuje słaby model pamięci. Pozwala to zmienić kolejność wykonywania poleceń (co jest przydatne dla wydajności). Ale pisanie kodu niskiego poziomu dla takiego modelu jest bardzo trudne.

A co najważniejsze - architektury procesorów X86 / AMD64 mają bardziej ścisły (mocny) model pamięci. W rezultacie Microsoft zaimplementował silniejszy model pamięci w swojej implementacji CLR niż opisano w specyfikacji.

Czy model pamięci zmienił się w .NET Core? Potencjalnie ten framework może działać na architekturach ze słabszym modelem pamięci niż X86 / AMD64.

Ponadto .NET Core zawiera Mono i inne. I o ile mi wiadomo, model pamięci Mono jest słabszy, odpowiada ECMA.

W tym artykule Wprowadzenie do .NET 5 napisano:

Rozszerz możliwości platformy .NET, wykorzystując to, co najlepsze w .NET Core, .NET Framework, Xamarin i Mono.

Myślę więc, że jeśli nie teraz, to w przyszłości środowiska wykonawcze połączą się w jedną całość.
Poniżej w artykule jest napisane:

Jesteśmy w trakcie wzajemnej wymiany CoreCLR i Mono. Ułatwimy wybór przełącznika kompilacji między różnymi opcjami środowiska wykonawczego.

Jeśli dobrze rozumiem, będą dwa (lub więcej) środowiska uruchomieniowe. I prawdopodobnie każdy będzie miał swój własny model pamięci.

O czym mówimy: Model pamięci .

Aleksander Pietrow
źródło
8
Związane . Konkluzja: CoreCLR nie uważa się za ograniczoną do replikacji silniejszych gwarancji CLR na x86 (co, uczciwie, byłoby niepraktyczne na ARM). (Jednocześnie nie ma motywacji, by celowo odejść od obecnego modelu x86 na x86.)
Jeroen Mostert
„.NET Core zawiera mono i inne” wymaga odnośników do linków. Nie wierzę jeszcze, że to prawda, ponieważ .NET Core CLR i Mono CLR to wciąż osobne rzeczy.
Lex Li
@LexLi - zaktualizowano. Dodano link.
Aleksander Pietrow
@Alexander Petrov Ten link dotyczy platformy .NET 5, która ma zostać udostępniona w 2020 r. .NET Core i Mono to wciąż różne platformy.
V0ldek,

Odpowiedzi:

1

Model pamięci jest specyficzny dla środowiska wykonawczego, więc twoje pytanie brzmi „czy są jakieś różnice w modelach pamięci CLR, CoreCLR i MonoRuntime”.

Po krótkim badaniu pytanie jest naprawdę bardzo trudne. Istnieje specyfikacja ECMA , o której wspominałeś, która daje absolutne minimum gwarancji, które muszą zapewniać wszystkie wdrożenia. Jest bardzo ładny, zwięzły opis na blogu Joe Duffy dla CLR 2.0. Następnie dla .NET Framework znajduje się ten dwuczęściowy artykuł, który mówi o modelu CLR prawdopodobnie bardziej szczegółowo, niż warto wiedzieć. Jest nawet napisany na ten temat artykuł .

W przypadku MonoRuntime znalazłem ten dokument, który mówi o atomice i faktycznie opisuje sposób, w jaki Mono to implementuje, chociaż poziom szczegółowości jest raczej niski.

Znalezienie szczegółów CoreCLR jest jeszcze trudniejsze. W tym wątku GitHub dotnet / coreclr wyróżniono kilka kluczowych punktów oraz dyskusję na temat niestabilnego odczytu / zapisu w tym wątku .

Najprostszym sposobem na udzielenie odpowiedzi jest - tak, zmieniło się, w oparciu o powyższe zasoby.

Istnieje jednak drugi sposób odpowiedzi na twoje pytanie, a mianowicie zaprzeczenie jego założeniu - wydaje się zakładać, że model pamięci zmienił się w tym sensie, że niektórzy inteligentni ludzie usiedli, przepisali specyfikację ECMA CLI, wprowadzili to do CoreCLR specyfikacja modelu pamięci i to jest nowy model pamięci. Tak nie jest. Wspomniani inteligentni ludzie usiedli i przez wiele miesięcy udoskonalili projekt, aby był niezawodny, szybki, rozsądnie łatwy do wdrożenia i nie naruszał minimalnych gwarancji specyfikacji. Cytowanie z połączonego bloga Joe Duffy:

Konstruowaliśmy nasz model przez lata nieformalnej pracy i projekt po przykładzie (...) może się zmieniać z jednego wdrożenia na drugie.

Nieformalna specyfikacja ECMA jest niestety tak formalna, jak na razie. Nie ma formalnego opisu zmian między specyfikacją ECMA a implementacją CLR, ani nie ma formalnego opisu zmian między CLR a CoreCLR. Co ważniejsze, różnice specyficzne dla implementacji między ECMA CLI a CLR / CoreCLR są po prostu - specyficzne dla implementacji - i nie można na nich polegać . Jedynym w 100% niezawodnym źródłem implementacji modelu pamięci .NET Core jest kod źródłowy. I to oczywiście zmienia się z każdym zatwierdzeniem, każdym wydaniem, i nie ma gwarancji, że zespół nie wyrzuci całego jittera przez okno i nie przepisze go, aby .NET 5 był dokładnie taki sam jak specyfikacja ECMA (choć jest to bardzo mało prawdopodobne ).

V0ldek
źródło