Middle
რა არის დროის შესრულება (runtime) და როგორ მუშაობს გრაფიკი (scheduler)?
sobes.tech AI
პასუხი AI-სგან
Go-ის დროის (runtime) გარემოა, სადაც მიმდინარეობს Go პროგრამების შესრულება. იგი მოიცავს:
- მეხსიერების მართვა: Garbage collector-ი ავტომატურად მართავს მეხსიერების განაწილებას და გათავისუფლებას.
- შედგინების (scheduler): მართავს gorutines-ების შესრულებას ოპერაციული სისტემის ნაკადებზე.
- სისტემური ზარები: უზრუნველყოფს ინტერფეისს ოპერაციული სისტემასთან ურთიერთქმედებისთვის.
- სინქრონიზაციის primitives: არხები, მუტექსები და სხვა მექანიზმები gorutines-ების კოორდინაციისთვის.
Go-ის სქედულატორი ახორციელებს M:N მოდელს (რამდენიმე goroutine-ი ერთზე მეტი ოპერაციული სისტემის ნაკადზე). მისი ძირითადი კომპონენტები:
- G (Goroutine): მსუბუქი შესრულების ნაკადი, ძირითადად ფუნქციის აბსტრაქცია.
- M (Machine): ოპერაციული სისტემის ნაკადი, სადაც მუშაობს Go პროგრამები.
- P (Processor): ლოგიკური პროცესორი, დაკავშირებული ოპერაციული სისტემის ნაკადთან. ინახავს ადგილობრივ
runnableრიგს gorutines-ების.
სქედულატორის მუშაობის პრინციპი:
- Gorutines (G) შექმნილია და დამატებულია გლობალურ ან ადგილობრივ
runnableრიგში. - M ოპერაციული სისტემის ნაკადები დაკავშირებულია P-ებთან. P-ების რაოდენობა ჩვეულებრივ შეესაბამება CPU-ების რაოდენობას (
GOMAXPROCS). - P იღებს goroutine-ებს თავის ადგილობრივ რიგიდან. თუ ადგილობრივი რიგი ცარიელია, P ცდილობს "გატაცებას" (steal) სხვა P-ების რიგებიდან ან გლობალური რიგიდან.
- M ასრულებს goroutine-ს.
- როდესაც goroutine ბლოკდება (მაგალითად, არხიდან მონაცემების გარეშე წაკითხვა ან სისტემური ზარის შესრულება), M-ები გამორთულია P-დან, და P ხდება ხელმისაწვდომი სხვა goroutine-ებისთვის. ბლოკირებული goroutine-ები გადადიან მოლოდინის მდგომარეობაში. როდესაც ბლოკი იხსნება, goroutine-ები კვლავ ხდება
runnableდა იდება რიგში. - თუ M ბლოკდება სისტემურ ზარაზე, იგი არ ინარჩუნებს P-ს. შეიძლება შექმნათ ახალი M ან გამოიყენოთ არსებული, რათა P-ებმა განაგრძონ სხვა goroutine-ების შესრულება.
ეს მიდგომა ეფექტურად იყენებს პროცესორის რესურსებს და ადვილად მასშტაბურია პარალელური დავალებებისთვის, დამალული ოპერაციული სისტემის ნაკადების მართვის სირთულეები პროგრამისტისგან.
// Goroutine-ის შექმნის მაგალითი
func myFunc() {
// Goroutine-ის კოდი
}
func main() {
go myFunc() // Goroutine-ის გაშვება
// ძირითადი პროგრამა პარალელურად აგრძელებს მუშაობას
}