runtime
Runtime ของภาษา Go เป็นโครงสร้างพื้นฐานหลักสำหรับการดำเนินการโปรแกรม Go รับผิดชอบการจัดการการจัดสรร内存การเก็บขยะการจัดตารางเวลา协程การตรวจสอบระบบและฟังก์ชันหลักอื่นๆ ของโปรแกรม ไม่เหมือนกับภาษาอื่น runtime ของ Go ผสานรวมอย่างใกล้ชิดกับโค้ดผู้ใช้ ซึ่งทำให้ Go สามารถรองรับการเขียนโปรแกรมพร้อมกันที่มีประสิทธิภาพและการจัดการ内存อัตโนมัติ
ส่วนประกอบหลัก
Runtime ของ Go ประกอบด้วยส่วนประกอบหลักหลายส่วนดังนี้:
ตัวจัดตารางเวลา GMP
ตัวจัดตารางเวลา GMP เป็นหนึ่งในส่วนประกอบที่สำคัญที่สุดของ Go runtime รับผิดชอบการจัดตาราง goroutine จำนวนมากไปยังเธรดระบบที่จำกัดอย่างสมเหตุสมผล GMP แทน:
- G (Goroutine):协程 เธรดเบาใน Go
- M (Machine): เธรดระบบ เธรดการดำเนินการในระดับระบบปฏิบัติการ
- P (Processor): โปรเซสเซอร์ ประกอบด้วยทรัพยากรที่จำเป็นสำหรับการรันโค้ด Go
การออกแบบตัวจัดตารางเวลา GMP ทำให้ Go สามารถรองรับ协程พร้อมกันนับพันอย่างมีประสิทธิภาพ เป็นรากฐานของคุณสมบัติความพร้อมใช้งานสูงของภาษา Go
ตัวจัดสรร内存
ตัวจัดสรร内存ของ Go รับผิดชอบการจัดการการจัดสรร heap内存 การออกแบบได้รับอิทธิพลอย่างลึกซึ้งจาก TCMalloc ของ Google ลักษณะสำคัญ:
- การออกแบบแคชหลายระดับ ลดการแข่งขันล็อก
- ใช้กลยุทธ์การจัดสรรที่แตกต่างกันตามขนาดอ็อบเจ็กต์
- ตัดสินใจโดยอัตโนมัติว่าอ็อบเจ็กต์จัดสรรบน stack หรือ heap
ตัวจัดสรร内存ทำงานร่วมกับตัวเก็บขยะอย่างใกล้ชิด ร่วมกัน實現การจัดการ内存ที่มีประสิทธิภาพ
ตัวเก็บขยะ
Go ใช้อัลกอริทึม Concurrent Mark-Sweep สำหรับเก็บขยะ ลักษณะสำคัญ:
- อัลกอริทึมการ标记สามสี
- เทคโนโลยี write barrier สำหรับเก็บขยะพร้อมกัน
- ความหน่วงต่ำ ส่วนใหญ่เวลา STW ต่ำกว่า 100 ไมโครวินาที
ตัวเก็บขยะของ Go ผ่านการปรับปรุงประสิทธิภาพมาหลายปี สามารถตอบสนองความต้องการประสิทธิภาพของสถานการณ์ธุรกิจส่วนใหญ่ได้
ตัวตรวจสอบระบบ
ตัวตรวจสอบระบบ (sysmon) เป็นเธรดตรวจสอบอิสระ รับผิดชอบ:
- การยึด协程ที่ทำงานเป็นเวลานาน
- ตรวจสอบว่าจำเป็นต้องทริกเกอร์การเก็บขยะหรือไม่
- ตรวจสอบสถานะระบบและทำการปรับ相应
มันทำงานอย่างต่อเนื่องในพื้นหลัง รับประกันการทำงานที่เสถียรของโปรแกรม Go
ข้อเสนอแนะการเรียนรู้
แนะนำให้เรียนรู้ความรู้เกี่ยวกับ runtime ตามลำดับต่อไปนี้:
- เรียนรู้ ตัวจัดตารางเวลา GMP ก่อน เข้าใจกลไกการจัดตารางเวลา协程
- จากนั้นเรียนรู้ ตัวจัดสรร内存 เข้าใจว่า内存จัดสรรอย่างไร
- แล้วเรียนรู้ ตัวเก็บขยะ เข้าใจว่า内存回收อย่างไร
- สุดท้ายเรียนรู้ ตัวตรวจสอบระบบ เข้าใจกลไกการตรวจสอบพื้นหลังของ runtime
