Model memori apa yang diterapkan dalam .NET Core?

36

Spesifikasi ECMA CLI mendefinisikan model memori yang lemah. Ini memungkinkan untuk menyusun ulang urutan eksekusi perintah (yang berguna untuk kinerja). Tetapi menulis kode tingkat rendah untuk model seperti itu sangat sulit.

Dan yang paling penting - arsitektur prosesor X86 / AMD64 memiliki model memori yang lebih ketat (kuat). Akibatnya, Microsoft menerapkan model memori yang lebih kuat dalam implementasi CLR daripada yang dijelaskan dalam spesifikasi.

Apakah model memori diubah dalam .NET Core? Secara potensial, kerangka kerja ini dapat berjalan pada arsitektur dengan model memori yang lebih lemah daripada X86 / AMD64.

Selain itu, .NET Core menggabungkan Mono dan lainnya. Dan sejauh yang saya tahu, model memori Mono lebih lemah, sesuai dengan ECMA.

Dalam artikel ini Memperkenalkan. NET 5 yang ditulis:

Perluas kapabilitas .NET dengan mengambil yang terbaik dari .NET Core, .NET Framework, Xamarin dan Mono.

Jadi saya pikir jika tidak sekarang, maka di masa depan runtimes ini akan bergabung menjadi satu kesatuan.
Di bawah dalam artikel ini tertulis:

Kami sedang dalam proses membuat CoreCLR dan Mono menjadi pengganti satu sama lain. Kami akan membuatnya sesederhana sebuah switch build untuk memilih antara opsi runtime yang berbeda.

Jika saya mengerti dengan benar, akan ada dua (atau lebih) runtime. Dan mungkin semua orang akan memiliki model memori mereka sendiri.

Apa yang kita bicarakan: Model Memori .

Alexander Petrov
sumber
8
Terkait . Intinya: CoreCLR tidak menganggap dirinya dibatasi untuk mereplikasi jaminan yang lebih kuat dari CLR pada x86 (yang, agar adil, tidak praktis pada ARM). (Pada saat yang sama, tidak ada insentif untuk secara sengaja menyimpang dari model x86 saat ini di x86.)
Jeroen Mostert
".NET Core menggabungkan Mono dan lainnya" memerlukan referensi tautan. Saya belum percaya itu benar, karena .NET Core CLR dan Mono CLR masih terpisah.
Lex Li
@LexLi - diperbarui. Tautan yang ditambahkan.
Alexander Petrov
@Alexander Petrov Tautan tersebut menyangkut .NET 5, yang akan datang pada tahun 2020. .NET Core dan Mono masih merupakan platform yang berbeda.
V0ldek

Jawaban:

1

Model memori khusus untuk runtime, jadi pertanyaan Anda sebenarnya adalah "apakah ada perbedaan dalam model memori CLR, CoreCLR dan MonoRuntime".

Setelah meneliti sedikit, pertanyaannya sangat, sangat sulit dijawab. Ada spesifikasi ECMA yang telah Anda sebutkan, yang memberi Anda jaminan minimum yang harus disediakan oleh semua implementasi. Ada deskripsi yang sangat bagus dan ringkas di blog Joe Duffy untuk CLR 2.0. Kemudian, untuk .NET Framework ada artikel dua bagian ini yang berbicara tentang model CLR mungkin lebih detail daripada yang diketahui. Bahkan ada makalah tentang itu.

Untuk MonoRuntime, saya telah menemukan dokumen ini yang berbicara tentang atom dan benar-benar menggambarkan cara Mono mengimplementasikan ini, meskipun tingkat detailnya agak rendah.

Menemukan detail CoreCLR bahkan lebih sulit. Ada beberapa keypoint yang disorot dalam utas GitHub dotnet / coreclr ini dan diskusi tentang volatile baca / tulis dalam yang ini .

Cara paling sederhana untuk menjawab adalah - ya, sudah berubah, berdasarkan sumber daya di atas.

Namun, ada cara kedua untuk menjawab pertanyaan Anda dan itu adalah hanya menyangkal premisnya - tampaknya mengasumsikan bahwa model memori berubah dalam arti bahwa beberapa orang pintar duduk, menulis ulang spesifikasi ECMA CLI, membuatnya menjadi CoreCLR memory-model spec dan itulah model memori baru. Bukan itu masalahnya. Orang-orang pintar yang disebutkan itu duduk dan, selama berbulan-bulan, menyempurnakan desain agar dapat diandalkan, cepat, mudah diimplementasikan, dan tidak melanggar jaminan minimum spesifikasi. Mengutip dari blog Joe Duffy yang ditautkan:

Kami telah membangun model kami selama bertahun-tahun dalam pekerjaan informal dan desain-dengan-contoh (...) ini cenderung berubah dari satu implementasi ke yang berikutnya.

Spesifikasi ECMA informal, sayangnya, seformal yang kita dapatkan untuk saat ini. Tidak ada deskripsi formal tentang perubahan antara spesifikasi ECMA dan implementasi CLR, juga tidak ada deskripsi formal tentang perubahan antara CLR dan CoreCLR. Dan, yang lebih penting, perbedaan implementasi khusus antara ECMA CLI dan CLR / CoreCLR hanya itu - implementasi spesifik - dan tidak boleh diandalkan . Satu-satunya sumber terpercaya 100% dari bagaimana model memori .NET Core diimplementasikan adalah kode sumber. Dan itu jelas berubah dengan setiap komit, setiap rilis, dan tidak ada jaminan bahwa tim tidak akan membuang seluruh kegugupan ke luar jendela dan menulis ulang untuk. NET 5 menjadi persis sama dengan spesifikasi ECMA (namun sangat tidak mungkin itu adalah ).

V0ldek
sumber