Middle+
გაამბე გო-ში გორუტინების მართვის მოდელზე (GMP).
sobes.tech AI
პასუხი AI-სგან
Go-ის დაგეგმვა მართავს გორუტინებს, ოპერაციული სისტემის ნაკადებს და ლოგიკურ პროცესორებს GMP მოდელის გამოყენებით:
- G (Goroutine): მსუბუქი, დამოუკიდებელი შესრულების ერთეული. შეიცავს სტეკს, ინსტრუქციის მაჩვენებელს და სხვა მდგომარეობის ინფორმაციას. მრავალი გორუტინა შეიძლება მუშაობდეს ერთ ოპერაციული სისტემის ნაკადზე.
- M (Machine): ოპერაციული სისტემის ნაკადი. ასრულებს გორუტინის კოდის შესრულებას. მრავალი M შეიძლება იყოს ხელმისაწვდომი დაგეგმვისთვის.
- P (Processor): ლოგიკური პროცესორი. უზრუნველყოფს კონტექსტს გორუტინის შესრულებისთვის. შეიცავს ადგილობრივ გორუტინების რიგს, რომლებიც მზად არიან შესრულებისთვის ამ M-ზე. P-ის რაოდენობა ჩვეულებრივ შეესაბამება
runtime.NumCPU()-ს.
ურთიერთქმედება:
- გორუტინა (G) შექმნილია და მოთავსებულია გლობალურ ან ადგილობრივ P-ის რიგში.
- თავისუფალი M ითხოვს P-ს. თუ P ხელმისაწვდომია, M მასთან მიერთდება.
- M იღებს გორუტინას ადგილობრივ რიგიდან და იწყებს მისი შესრულებას.
- თუ გორუტინა ბლოკირდება (მაგალითად, I/O-ს მოლოდინში), M გამორთულია P-დან („hand off“). P რჩება ხელმისაწვდომი სხვა M-ისთვის ან გეგმავს სხვა გორუტინას თავის რიგში.
- როდესაც ბლოკირებული გორუტინა მზად არის განახლებისთვის, ის ისევ მოთავსდება P-ის რიგში ან გლობალურ რიგში.
- M შეიძლება შეიქმნას დაგეგმვის მიერ საჭიროების შემთხვევაში (მაგალითად, თუ ყველა არსებული M ბლოკირებულია) ან წაიშალოს არაქტივობის დროს.
Preemption (შედარებითი გადართვა): დაგეგმვა შეუძლია გორუტინის შესრულების შეჩერება გარკვეული დროის შემდეგ (time slice), რათა გარანტირებული იყოს სამართლიანი პროცესორის დრო სხვა გორუტინებისთვის.
Work Stealing (სამუშაოს მოპარვა): თუ P-ის ადგილობრივ რიგში გორუტინების რაოდენობა ამოიწურა, ის შეიძლება სცადოს „გატეხოს“ გორუტინები გლობალურ რიგიდან ან სხვა P-ის რიგებიდან.