FUGC Garbage Collector นำความปลอดภัยด้านหน่วยความจำมาสู่ภาษา C พร้อมการแลกเปลี่ยนประสิทธิภาพ 4 เท่า

ทีมชุมชน BigGo
FUGC Garbage Collector นำความปลอดภัยด้านหน่วยความจำมาสู่ภาษา C พร้อมการแลกเปลี่ยนประสิทธิภาพ 4 เท่า

Fil-C ได้เปิดตัว FUGC (Fil's Unbelievable Garbage Collector) ระบบการจัดการหน่วยความจำที่ซับซ้อนซึ่งมีเป้าหมายเพื่อนำความปลอดภัยด้านหน่วยความจำแบบอัตโนมัติมาสู่การเขียนโปรแกรม C ตัวรวบรวมขยะแบบขนานพร้อมกันนี้เป็นตัวแทนของความพยายามทางวิศวกรรมที่สำคัญในการแก้ไขหนึ่งในปัญหาที่ยืดยาวที่สุดของ C คือช่องโหว่ด้านความปลอดภัยของหน่วยความจำ

ผลกระทบต่อประสิทธิภาพทำให้เกิดคำถามเกี่ยวกับการนำไปใช้

การอภิปรายในชุมชนเผยให้เห็นปฏิกิริยาที่หลากหลายต่อลักษณะประสิทธิภาพของ FUGC แม้ว่าโปรแกรมบางตัวจะทำงานด้วยความเร็วดั้งเดิม แต่โปรแกรมอื่นๆ กลับประสบกับความช้าลงถึง 4 เท่า ช่วงประสิทธิภาพนี้ได้จุดประกายการถกเถียงเกี่ยวกับว่าประโยชน์ที่ได้รับสามารถชดเชยต้นทุนได้หรือไม่ โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่ต้องการประสิทธิภาพสูงซึ่ง C และ C++ มักครองอำนาจ

อย่างไรก็ตาม ผู้สร้างโต้แย้งว่าโค้ด C/C++ ส่วนใหญ่ไม่ได้มีความไวต่อประสิทธิภาพจริงๆ โปรแกรมจำนวนมากถูกเขียนด้วย C ไม่ใช่เพื่อความเร็ว แต่เพราะพวกมันพึ่งพาไลบรารี C ต้องการการเข้าถึง system call โดยตรง หรือเพียงแค่สืบทอดการเลือกใช้ภาษาจาก codebase เก่า สำหรับกรณีการใช้งานเหล่านี้ ประโยชน์ด้านความปลอดภัยของหน่วยความจำอาจมีน้ำหนักมากกว่าการลดประสิทธิภาพ

ลักษณะประสิทธิภาพของ FUGC

หมวดหมู่ประสิทธิภาพ ผลกระทบ ความถี่
ความเร็วดั้งเดิม ไม่มีการชะลอตัว ไม่ค่อยพบ
ผลกระทบปานกลาง การชะลอตัว 1-4 เท่า โปรแกรมส่วนใหญ่
ผลกระทบสูง การชะลอตัวประมาณ 4 เท่า ไม่ค่อยพบ

คุณสมบัติทางเทคนิคหลัก

  • Parallel: การทำเครื่องหมายและการกวาดแบบหลายเธรด
  • Concurrent: การทำงานแบบไม่บล็อกกับเธรด mutator
  • On-the-fly: การจับมือแบบนุ่มนวลแทนการหยุดทั้งระบบ
  • Grey-stack: ไม่ต้องการ load barriers
  • Dijkstra: การใช้งาน store barrier แบบง่าย
  • Accurate: การติดตาม pointer แบบแม่นยำ
  • Non-moving: วัตถุอยู่ในตำแหน่งเดิมระหว่างการเก็บขยะ

นวัตกรรมทางเทคนิคในการรวบรวมแบบพร้อมกัน

FUGC ใช้เทคนิคขั้นสูงหลายอย่างที่ทำให้แตกต่างจากตัวรวบรวมขยะแบบดั้งเดิม ระบบใช้ soft handshakes แทนการหยุดชั่วคราวแบบ stop-the-world ทำให้เธรดสามารถทำงานต่อไปได้ในขณะที่ตัวรวบรวมทำงาน วิธีการนี้ช่วยลดการขัดจังหวะให้เหลือน้อยที่สุด โดยการหยุดชั่วคราวมักจะสั้นกว่าการทำงานของ malloc ทั่วไป

วิธีการ grey-stack Dijkstra ของตัวรวบรวมช่วยขจัดความจำเป็นในการใช้ load barriers โดยต้องการเพียง store barriers อย่างง่ายเมื่อเขียน pointers การเลือกออกแบบนี้ช่วยลดภาระของการทำงานกับ pointer อย่างมีนัยสำคัญ ซึ่งเป็นพื้นฐานของการเขียนโปรแกรม C

หมายเหตุ: Load barriers เป็นการตรวจสอบที่ทำงานเมื่ออ่าน pointers จากหน่วยความจำ ในขณะที่ store barriers ทำงานเมื่อเขียน pointers การขจัด load barriers ช่วยลดผลกระทบต่อประสิทธิภาพในการทำงานทั่วไป

คุณสมบัติความปลอดภัยของหน่วยความจำเกินกว่า GC แบบดั้งเดิม

FUGC ไปไกลกว่าการรวบรวมขยะทั่วไปด้วยการสนับสนุนการปลดปล่อยหน่วยความจำอย่างชัดเจนผ่านฟังก์ชัน free() แบบดั้งเดิม เมื่อออบเจ็กต์ถูกปลดปล่อย การเข้าถึงทั้งหมดที่ตามมาจะติดกับดักทันที และตัวรวบรวมขยะจะเปลี่ยนเส้นทาง capability pointers ไปยังออบเจ็กต์ free singleton พิเศษ สิ่งนี้ช่วยป้องกันปัญหาทั่วไปที่โปรแกรมที่มีการรวบรวมขยะรั่วไหลหน่วยความจำเนื่องจาก dangling pointers ที่น่าจะถูกปลดปล่อยในการจัดการหน่วยความจำแบบแมนนวล

ระบบยังมี finalizers แบบ Java, weak references และ weak maps คล้ายกับ WeakMap ของ JavaScript คุณสมบัติเหล่านี้ให้รูปแบบการจัดการหน่วยความจำที่คุ้นเคยแก่นักพัฒนาในขณะที่รักษาการรับประกันความปลอดภัย

การรับประกันความปลอดภัยของหน่วยความจำ

  • Use-after-free: รับประกันการ trap เมื่อเข้าถึงออบเจ็กต์ที่ถูกปลดปล่อยแล้ว
  • Double-free: รับประกันการ trap เมื่อปลดปล่อยออบเจ็กต์ที่ถูกปลดปล่อยไปแล้ว
  • Memory leaks: การเรียกคืนออบเจ็กต์ที่ไม่สามารถเข้าถึงได้โดยอัตโนมัติ
  • Dangling pointers: เปลี่ยนเส้นทางไปยังออบเจ็กต์ singleton ที่ปลอดภัย

คุณสมบัติขั้นสูง

  • คิว finalizer (แบบ Java )
  • การอ้างอิงแบบอ่อน (weak references)
  • แผนที่แบบอ่อน (คล้าย WeakMap ของ JavaScript )
  • การสนับสนุนฟังก์ชัน free() แบบชัดเจนพร้อมการรับประกันความปลอดภัย

ความท้าทายในการนำไปใช้และความเป็นไปได้ในโลกจริง

สมาชิกในชุมชนได้แสดงความกังวลเกี่ยวกับความซับซ้อนของการนำ safepointing logic ไปใช้ โดยเฉพาะอย่างยิ่งฟังก์ชันการเข้า/ออกสำหรับฟังก์ชันดั้งเดิมที่อาจถูกบล็อก ระบบต้องประสานงานอย่างระมัดระวังระหว่างเธรดตัวรวบรวมขยะและเธรดแอปพลิเคชันโดยไม่เกิด race conditions หรือ deadlocks

99% ของโค้ด C/C++ ที่คุณใช้อยู่ตอนนี้ไม่ไวต่อประสิทธิภาพ มันถูกเขียนด้วย C หรือ C++ เพราะนั่นคือสิ่งที่มันถูกเขียนไว้ตั้งแต่แรก และไม่มีใครรำคาญที่จะเขียนเวอร์ชันที่ดีกว่าด้วยภาษาอื่น

แม้จะมีความท้าทายทางเทคนิค FUGC เป็นตัวแทนของหลักฐานการมีอยู่ที่การรวบรวมขยะที่ซับซ้อนสามารถทำงานในภาษาคล้าย C ได้ โครงการนี้แสดงให้เห็นว่าความปลอดภัยของหน่วยความจำไม่จำเป็นต้องละทิ้งการควบคุมระดับต่ำของ C แม้ว่าจะมาพร้อมกับความซับซ้อนและการแลกเปลี่ยนประสิทธิภาพที่นักพัฒนาต้องพิจารณาอย่างรอบคอบสำหรับกรณีการใช้งานเฉพาะของพวกเขา

อ้างอิง: Fil's Unbelievable Garbage Collector