หน่วยความจำแบบใดที่ถูกนำไปใช้ใน. NET Core


36

ข้อมูลจำเพาะ ECMA CLI กำหนดรูปแบบหน่วยความจำที่อ่อนแอ สิ่งนี้อนุญาตให้เรียงลำดับคำสั่งการดำเนินการคำสั่งใหม่ (ซึ่งมีประโยชน์สำหรับประสิทธิภาพ) แต่การเขียนโค้ดระดับต่ำสำหรับโมเดลนั้นยากมาก

และที่สำคัญที่สุด - สถาปัตยกรรมโปรเซสเซอร์ X86 / AMD64 มีรูปแบบหน่วยความจำที่เข้มงวดมากขึ้น ด้วยเหตุนี้ Microsoft จึงใช้โมเดลหน่วยความจำที่แข็งแกร่งกว่าในการนำ CLR ไปใช้งานมากกว่าที่อธิบายไว้ในข้อมูลจำเพาะ

โมเดลหน่วยความจำมีการเปลี่ยนแปลงใน. NET Core หรือไม่ อาจเป็นไปได้ว่ากรอบงานนี้สามารถทำงานกับสถาปัตยกรรมที่มีหน่วยความจำที่อ่อนกว่ารุ่น X86 / AMD64

นอกจากนี้. NET Core ยังรวม Mono และอื่น ๆ และเท่าที่ฉันรู้รูปแบบหน่วยความจำ Mono นั้นอ่อนกว่านั้นสอดคล้องกับ ECMA

ในบทความนี้แนะนำ. NET 5เขียน:

ขยายขีดความสามารถของ. NET โดยการใช้. NET Core ที่ดีที่สุด,. NET Framework, Xamarin และ Mono

ดังนั้นฉันคิดว่าถ้าไม่ได้ตอนนี้ในอนาคต runtimes เหล่านี้จะรวมเป็นหนึ่งเดียว
ด้านล่างในบทความเขียน:

เรากำลังอยู่ในขั้นตอนการสร้าง CoreCLR และ Mono แทนกันได้ เราจะทำให้มันง่ายเหมือนสวิตช์สร้างเพื่อเลือกระหว่างตัวเลือกรันไทม์ที่แตกต่างกัน

ถ้าฉันเข้าใจถูกต้องจะมี runtimes สองครั้งขึ้นไป และทุกคนอาจจะมีรูปแบบหน่วยความจำของตัวเอง

สิ่งที่เราพูดคุยเกี่ยวกับ: หน่วยความจำรุ่น


8
ที่เกี่ยวข้อง Bottom line: CoreCLR ไม่ได้พิจารณาตัวเองว่ามีข้อ จำกัด ในการทำซ้ำการรับประกันที่แข็งแกร่งของ CLR บน x86 (ซึ่งเพื่อความเป็นธรรมจะไม่สามารถทำได้บน ARM) (ในเวลาเดียวกันไม่มีแรงจูงใจที่จะจงใจเบี่ยงเบนไปจากรุ่น x86 ปัจจุบันใน x86)
Jeroen Mostert

". NET Core รวม Mono และอื่น ๆ " ต้องการการอ้างอิงลิงก์ ฉันไม่เชื่อว่ามันเป็นความจริงเนื่องจาก. NET Core CLR และ Mono CLR ยังคงแยกสิ่งต่าง ๆ
Lex Li

@LexLi - อัปเดต เพิ่มลิงค์
Alexander Petrov

@Alexander Petrov ลิงก์นั้นเกี่ยวข้องกับ. NET 5 ซึ่งกำลังจะมีขึ้นในปี 2020 .NET Core และ Mono ยังคงเป็นแพลตฟอร์มที่แตกต่างกัน
V0ldek

คำตอบ:


1

โมเดลหน่วยความจำมีความเฉพาะสำหรับรันไทม์ดังนั้นคำถามของคุณคือจริง ๆ "มีความแตกต่างในรูปแบบหน่วยความจำของ CLR, CoreCLR และ MonoRuntime"

หลังจากค้นคว้าสักเล็กน้อยคำถามก็ยากที่จะตอบ มีข้อกำหนด ECMAที่คุณกล่าวถึงซึ่งให้การรับประกันขั้นต่ำเปล่าที่การดำเนินการทั้งหมดจะต้องให้ มีคำอธิบายที่กระชับดีมากในบล็อกของ Joe Duffyสำหรับ CLR 2.0 จากนั้นสำหรับ. NET Framework มีบทความสอง ส่วนนี้ที่พูดเกี่ยวกับรูปแบบ CLR โดยละเอียดอาจมากกว่ารายละเอียดที่ดีต่อสุขภาพ มีแม้กระทั่งกระดาษเขียนที่

สำหรับ MonoRuntime ฉันได้พบเอกสารนี้ที่พูดถึงอะตอมมิกส์และอธิบายถึงวิธีที่โมโนดำเนินการนี้แม้ว่าระดับรายละเอียดค่อนข้างต่ำ

การค้นหารายละเอียดของ CoreCLR นั้นยิ่งซับซ้อน มี keypoints บางส่วนไฮไลต์ในนี้dotnet / coreclr ด้าย GitHubและอภิปรายเกี่ยวกับความผันผวนอ่าน / เขียนในนี้

วิธีที่ง่ายที่สุดในการตอบคือใช่มันเปลี่ยนไปตามทรัพยากรด้านบน

อย่างไรก็ตามมีวิธีที่สองในการตอบคำถามของคุณและนั่นก็คือการปฏิเสธหลักฐาน - ดูเหมือนว่าสมมติว่ารูปแบบหน่วยความจำเปลี่ยนไปในแง่ที่ว่าคนฉลาดบางคนนั่งลงเขียนข้อมูลจำเพาะ ECMA CLI ใหม่ทำลงใน CoreCLR ข้อมูลจำเพาะรุ่นของหน่วยความจำและนั่นคือรูปแบบหน่วยความจำใหม่ ไม่เป็นเช่นนั้น คนฉลาดดังกล่าวนั่งลงและในช่วงเวลาหลายเดือนได้ปรับปรุงการออกแบบให้มีความน่าเชื่อถือรวดเร็วใช้งานง่ายอย่างสมเหตุสมผลและไม่ละเมิดการรับประกันขั้นต่ำของข้อมูลจำเพาะ อ้างจากบล็อกของ Joe Duffy ที่เชื่อมโยง:

เราได้สร้างแบบจำลองของเราในช่วงหลายปีของการทำงานอย่างไม่เป็นทางการและการออกแบบโดยตัวอย่าง (... ) นี่คือแนวโน้มที่จะเปลี่ยนจากการใช้งานที่หนึ่งไปยังอีก

ข้อมูลจำเพาะ ECMA นอกระบบเป็นเรื่องที่น่าเสียดายอย่างเป็นทางการเท่าที่เราได้รับในตอนนี้ ไม่มีคำอธิบายอย่างเป็นทางการของการเปลี่ยนแปลงระหว่างข้อมูลจำเพาะของ ECMA และการใช้งาน CLR และไม่มีคำอธิบายอย่างเป็นทางการของการเปลี่ยนแปลงระหว่าง CLR และ CoreCLR และที่สำคัญกว่าความแตกต่างของการดำเนินงานเฉพาะระหว่าง ECMA CLI และ CLR / CoreCLR เป็นเพียงที่ - การดำเนินงานเฉพาะ - และจะต้องไม่พึ่งพา แหล่งข้อมูลที่เชื่อถือได้เพียง 100% เท่านั้นที่มีการใช้งานโมเดลหน่วยความจำ. NET Core คือซอร์สโค้ด เห็นได้ชัดว่าการเปลี่ยนแปลงนั้นเกิดขึ้นกับทุกการกระทำทุกครั้งและไม่มีการรับประกันว่าทีมจะไม่โยนความกระวนกระวายใจออกไปนอกหน้าต่างและเขียนใหม่สำหรับ. NET 5 ให้ตรงกับข้อกำหนด ECMA (แน่นอนไม่น่าจะเป็นไปได้) )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.