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 .
Odpowiedzi:
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:
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 ).
źródło