.NET Core'da hangi bellek modeli uygulanmaktadır?


36

ECMA CLI spesifikasyonu zayıf bir bellek modeli tanımlar. Bu, komut yürütme sırasının (performans için yararlıdır) yeniden sıralanmasını sağlar. Ancak böyle bir model için düşük seviyeli kod yazmak çok zordur.

Ve en önemlisi - X86 / AMD64 işlemci mimarilerinin daha katı (güçlü) bir bellek modeli var. Sonuç olarak Microsoft, CLR uygulamasında belirtimde açıklanandan daha güçlü bir bellek modeli uyguladı.

.NET Core'da bellek modeli değişti mi? Potansiyel olarak, bu çerçeve X86 / AMD64'ten daha zayıf bellek modeline sahip mimarilerde çalışabilir.

Ayrıca, .NET Core Mono ve diğerlerini de içerir. Ve bildiğim kadarıyla, Mono bellek modeli zayıf, ECMA'ya karşılık geliyor.

Bu yazıda .NET 5 ile tanışın:

.NET Core, .NET Framework, Xamarin ve Mono'dan en iyi şekilde yararlanarak .NET'in yeteneklerini genişletin.

Bence şimdi değilse, gelecekte bu çalışma zamanları tek bir bütün halinde birleşecek.
Makalede aşağıda yazılmıştır:

CoreCLR ve Mono drop-in yedeklerini birbirimiz için yapma sürecindeyiz. Farklı çalışma zamanı seçenekleri arasında seçim yapmayı basitleştireceğiz.

Doğru anlarsam, iki (veya daha fazla) çalışma zamanı olacaktır. Ve muhtemelen herkesin kendi hafıza modeli olacaktır.

Neden bahsediyoruz: Bellek Modeli .


8
İlgili . Alt satır: CoreCLR kendisini x86'da CLR'nin daha güçlü garantilerini çoğaltmakla sınırlı görmemektedir (bu adil olmak gerekirse ARM üzerinde pratik değildir). (Aynı zamanda, x86'daki mevcut x86 modelinden kasten sapmak için bir teşvik yoktur.)
Jeroen Mostert

".NET Core, Mono ve diğer" ihtiyaç link bağlantılarını içerir. .NET Core CLR ve Mono CLR hala ayrı şeyler olduğundan, bunun doğru olduğuna inanmıyorum.
Lex Li

@LexLi - güncellendi. Bağlantı eklendi.
Alexander Petrov

@Alexander Petrov Bu bağlantı, 2020'de yaklaşan .NET 5 ile ilgilidir. .NET Core ve Mono hala farklı platformlardır.
V0ldek

Yanıtlar:


1

Bellek modeli çalışma zamanına özgüdür, bu nedenle sorunuz aslında "CLR, CoreCLR ve MonoRuntime'ın bellek modellerinde herhangi bir fark var mıdır".

Biraz araştırma yaptıktan sonra, soruya cevap vermek gerçekten çok zor. Orada ECMA şartname sen iyi uygulamaları sunmak gerektiğini minimum teminat verir Bahsettiğiniz ki. Joe Duffy'nin CLR 2.0 blogunda çok hoş ve özlü bir açıklama var . Daha sonra, .NET Framework için CLR modeli hakkında muhtemelen sağlıklı olduğundan daha ayrıntılı olarak konuşan bu iki bölümlü makale var. Üzerinde yazılı bir kağıt bile var.

MonoRuntime için, atom hakkında konuşan ve aslında Mono'nun bunu uygulama şeklini açıklayan bu dokümanı buldum , ancak ayrıntı seviyesi oldukça düşük.

CoreCLR'nin ayrıntılarını bulmak daha da zordur. Bu vurgulanan bazı keypoints vardır dotnet / CoreCLR GitHub iplik ve kalıcı okuma / yazma konusunda tartışma bunda .

Cevap vermenin en basit yolu - evet, yukarıdaki kaynaklara göre değişti.

Ancak, sorunuzu cevaplamanın ikinci bir yolu var ve bu sadece öncülünü inkar etmektir - bazı akıllı insanların oturduğu, ECMA CLI spesifikasyonunu yeniden yazdığı, CoreCLR'ye yaptığı anlamında bellek modelinin değiştiğini varsayıyor gibi görünüyor. bellek modeli spec ve bu yeni bellek modeli. Durum böyle değil. Bahsedilen akıllı insanlar oturdu ve aylar boyunca tasarımı güvenilir, hızlı, kolay uygulanabilir ve spesifikasyonun asgari garantilerini ihlal etmeyecek şekilde geliştirdi. Bağlantılı Joe Duffy blogundan alıntı:

Modelimizi yıllardır gayri resmi çalışma ve örnekle (...) tasarladık, bu bir uygulamadan diğerine değişmeye yatkındır.

Gayri resmi ECMA şartnamesi, ne yazık ki, şimdilik elde ettiğimiz kadar resmi. ECMA spesifikasyonu ve CLR uygulaması arasında değişikliklerin resmi bir tanımı veya CLR ile CoreCLR arasındaki değişikliklerin resmi bir açıklaması yoktur. Ve daha da önemlisi, ECMA CLI ve CLR / CoreCLR arasındaki uygulamaya özgü farklılıklar sadece - uygulamaya özeldir - ve buna güvenilmemelidir . .NET Core bellek modelinin nasıl uygulandığına dair yalnızca% 100 güvenilir kaynak kaynak kodudur. Ve bu her taahhütte, her sürümde açık bir şekilde değişiyor ve ekibin tüm titremeyi pencereden dışarı atmayacağı ve .NET 5'in ECMA spesifikasyonu ile tam olarak aynı olması için yeniden yazmayacağının garantisi yok ( ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.