Nim นำเสนอ YRC ซึ่งเป็นตัวเก็บรวบรวมการอ้างอิงที่ปลอดภัยต่อเธรด

Andreas Rumpf (Araq) ผู้เขียนภาษาโปรแกรม Nim ได้ประกาศอัลกอริทึมการจัดการหน่วยความจำใหม่ชื่อ YRC (อ่านว่า "เอิร์ก") ซึ่งแก้ไขปัญหาสำคัญประการหนึ่งของกลไกที่มีอยู่เดิมใน Nim นั่นคือ ความไม่สามารถจัดการกับการอ้างอิงแบบวนซ้ำที่ข้ามขอบเขตของเธรดได้อย่างถูกต้อง

ก่อน YRC อัลกอริทึมการจัดการหน่วยความจำที่นิมเสนอมีข้อจำกัดดังต่อไปนี้: ARC ไม่รองรับมัลติเธรดดิ้งหรือการจัดการวงจร; Atomic ARC ปลอดภัยต่อเธรดแต่ไม่สามารถจัดการการอ้างอิงแบบวนซ้ำได้; ORC สามารถจัดการการอ้างอิงแบบวนซ้ำได้ แต่สามารถทำได้อย่างถูกต้องเฉพาะภายในเธรดเดียวเท่านั้น (เกิดการรั่วไหลของหน่วยความจำเมื่อใช้การอ้างอิงร่วมกันระหว่างเธรด)

YRC ที่เสนอมานี้ ผสานความปลอดภัยของเธรดและการจัดการวงจรการทำงานระหว่างเธรดโดยใช้วิธีการแบบไฮบริด: ใช้การนับการอ้างอิงแบบอะตอมิกสำหรับข้อมูลที่ไม่มีวงจร และใช้ตัวกั้นการเขียน ซึ่งจะทำงานเฉพาะเมื่อมีการกำหนดค่าตัวชี้เท่านั้น สำหรับข้อมูลที่มีวงจร ในการใช้งานที่เสนอมานี้: ตัวเก็บขยะจะเริ่มต้นเมื่อจำเป็นจริงๆ (ไม่มีการหยุดการทำงานทั้งหมด); อ็อบเจ็กต์รากของ RC จะถูกกำหนดและรวมเข้าด้วยกันอย่างชัดเจนเพียงครั้งเดียว (ไม่จำเป็นต้องสแกนสแต็กของเธรด); หลีกเลี่ยงการลบแบบมัลติเธรดระหว่างการวนซ้ำ (ไม่มีขั้นตอนการกวาดล้างทั่วโลก); ตัวแก้ไขสามารถอ่านข้อมูลได้อย่างอิสระ; เธรดใดๆ ก็สามารถเริ่มต้นตัวเก็บขยะได้เมื่อจำเป็น (ไม่มีเธรด GC เฉพาะ)

YRC ใช้ข้อมูลเหตุการณ์ incRef/decRef อย่างครบถ้วน ซึ่งตัวเก็บขยะแบบติดตาม (tracing garbage collector หรือ GC) แบบดั้งเดิมจะทิ้งไป และต้องกู้คืนผ่านการสแกนสแต็กและการสำรวจกราฟ การใช้งานใช้โค้ดเพียง 550 บรรทัด และได้รับการตรวจสอบอย่างเป็นทางการถึงความปลอดภัยและการปราศจากภาวะหยุดชะงัก (deadlock) ผ่านข้อกำหนดใน TLA+ และการพิสูจน์ใน Lean toolkit YRC ถูกวางจำหน่ายในฐานะ "ตัวเก็บขยะแบบนับการอ้างอิงตัวสุดท้ายเกือบจะทั้งหมด" (ตัวอักษร Y มาก่อน Z ในลำดับตัวอักษร) รวมถึงเป็นตัวเก็บขยะที่ปลอดภัยต่อเธรดที่ง่ายที่สุด—ตามที่ผู้เขียนกล่าวไว้ มันไม่จำเป็นต้องใช้กลไกที่ซับซ้อนมากมายที่มีอยู่ในตัวเก็บขยะแบบติดตามแบบดั้งเดิม

YRC มี API เหมือนกับ ORC โดยมีการเรียกใช้ destructor ในระหว่างการเก็บขยะ (garbage collection) ตัวเก็บขยะจะประมวลผลเฉพาะโครงสร้างย่อยของอ็อบเจ็กต์ที่เธรดเข้าถึงเท่านั้น โดยปล่อยให้โครงสร้างข้อมูลที่ไม่เกี่ยวข้อง (แคช อ็อบเจ็กต์ที่มีอายุการใช้งานยาวนาน) ไม่ถูกแตะต้อง ซึ่งเป็นแนวทางที่คล้ายกับตัวเก็บขยะแบบแบ่งรุ่น (generational garbage collector) ในอุดมคติที่ไม่มีการแบ่งรุ่น ข้อเสียหลักคือประสิทธิภาพ: YRC แสดงให้เห็นถึงความช้ากว่า ORC 1.5-2.0 เท่าในเกณฑ์มาตรฐาน orcbench ผู้เขียนพิจารณาว่านี่เป็นการแลกเปลี่ยนที่ยอมรับได้สำหรับการจัดการการอ้างอิงแบบวนซ้ำอย่างปลอดภัยต่อเธรดอย่างสมบูรณ์

YRC มีให้ใช้งานแล้วในเวอร์ชันพัฒนาของ Nim และสามารถเปิดใช้งานได้ด้วยแฟล็ก "--mm:yrc" อย่างไรก็ตาม ในโพสต์ต่อมา ผู้เขียนยอมรับว่าการใช้งานในขั้นต้นมีข้อบกพร่องร้ายแรงและไม่ได้สร้างวงจรอย่างถูกต้อง ณ เวลาที่เผยแพร่ มีการเตรียมแพตช์ชุดหนึ่งที่แก้ไขปัญหาหลักๆ แล้ว ผู้เขียนยังคงปรับแต่งฮิวริสติกส์การสร้างและแก้ไขข้อบกพร่องที่เหลืออยู่ ในขณะที่อัลกอริทึมพื้นฐานและการตรวจสอบอย่างเป็นทางการยังคงถูกต้อง

ที่มา: opennet.ru

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster