Disclaimer
โพสต์นี้เน้นพูดถึงภาษา Go 1.24 บนระบบปฏิบัติการ Linux ที่ใช้สถาปัตยกรรม ARM เป็นหลัก
อาจไม่ได้ครอบคลุมรายละเอียดเฉพาะ platform สำหรับระบบปฏิบัติการหรือสถาปัตยกรรมอื่น ๆ
เนื้อหาที่เขียนมาจากแหล่งข้อมูลอื่นรวมกับความเข้าใจส่วนตัวเกี่ยวกับ Go
ดังนั้นอาจจะไม่เป๊ะ 100% ก็ได้นะครับ ถ้าใครเห็นอะไรผิด หรือมีอะไรแนะนำก็ฝากไว้ในคอมเมนต์ได้เลย 😄
Introduction
⚠️ โพสต์นี้เขียนโดยสมมุติว่าคุณมีพื้นฐานเรื่อง Go concurrency อยู่แล้ว (เช่น goroutines, channels ฯลฯ) ถ้ายังใหม่กับพวกนี้ แนะนำให้ลองอ่านเบื้องต้นก่อน แล้วค่อยกลับมาอ่านต่อครับ
ภาษา Go เปิดตัวตั้งแต่ปี 2009 และค่อย ๆ ได้รับความนิยมเรื่อยมา โดยเฉพาะในสายงานที่เน้นการเขียนโปรแกรมแบบ concurrent
Go ถูกออกแบบมาให้ เรียบง่าย, ประสิทธิภาพดี, และ ใช้งานง่าย โดยเฉพาะเรื่องการจัดการ concurrency
Concurrency model ของ Go สร้างขึ้นรอบ ๆ แนวคิดที่เรียกว่า goroutine — ซึ่งเป็น thread แบบเบา ๆ (lightweight thread) ที่จัดการโดย Go runtime ใน user space
Go ยังมี primitive ที่ช่วยให้ sync ข้อมูลง่าย เช่น channels ซึ่งทำให้เขียน concurrent code ได้ไม่ยาก
นอกจากนี้ Go ยังใช้เทคนิคระดับลึกเพื่อให้โปรแกรมที่เน้น I/O ทำงานได้อย่างมีประสิทธิภาพ
การเข้าใจ Go scheduler เป็นสิ่งสำคัญมากสำหรับคนเขียน Go
เพราะจะช่วยให้เขียนโปรแกรม concurrent ได้ดีขึ้น และยังช่วยเวลาต้อง debug หรือจูน performance ได้อย่างแม่นยำ
ในโพสต์นี้ เราจะมาดูกันว่า Go scheduler พัฒนามายังไง และโค้ดที่เราเขียนใน Go จริง ๆ แล้วไปเกิดอะไรขึ้นเบื้องหลังบ้าง