Skip to content

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 ตามลำดับต่อไปนี้:

  1. เรียนรู้ ตัวจัดตารางเวลา GMP ก่อน เข้าใจกลไกการจัดตารางเวลา协程
  2. จากนั้นเรียนรู้ ตัวจัดสรร内存 เข้าใจว่า内存จัดสรรอย่างไร
  3. แล้วเรียนรู้ ตัวเก็บขยะ เข้าใจว่า内存回收อย่างไร
  4. สุดท้ายเรียนรู้ ตัวตรวจสอบระบบ เข้าใจกลไกการตรวจสอบพื้นหลังของ runtime

Golang by www.golangdev.cn edit