Sobes.tech
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-ების.

სქედულატორის მუშაობის პრინციპი:

  1. Gorutines (G) შექმნილია და დამატებულია გლობალურ ან ადგილობრივ runnable რიგში.
  2. M ოპერაციული სისტემის ნაკადები დაკავშირებულია P-ებთან. P-ების რაოდენობა ჩვეულებრივ შეესაბამება CPU-ების რაოდენობას (GOMAXPROCS).
  3. P იღებს goroutine-ებს თავის ადგილობრივ რიგიდან. თუ ადგილობრივი რიგი ცარიელია, P ცდილობს "გატაცებას" (steal) სხვა P-ების რიგებიდან ან გლობალური რიგიდან.
  4. M ასრულებს goroutine-ს.
  5. როდესაც goroutine ბლოკდება (მაგალითად, არხიდან მონაცემების გარეშე წაკითხვა ან სისტემური ზარის შესრულება), M-ები გამორთულია P-დან, და P ხდება ხელმისაწვდომი სხვა goroutine-ებისთვის. ბლოკირებული goroutine-ები გადადიან მოლოდინის მდგომარეობაში. როდესაც ბლოკი იხსნება, goroutine-ები კვლავ ხდება runnable და იდება რიგში.
  6. თუ M ბლოკდება სისტემურ ზარაზე, იგი არ ინარჩუნებს P-ს. შეიძლება შექმნათ ახალი M ან გამოიყენოთ არსებული, რათა P-ებმა განაგრძონ სხვა goroutine-ების შესრულება.

ეს მიდგომა ეფექტურად იყენებს პროცესორის რესურსებს და ადვილად მასშტაბურია პარალელური დავალებებისთვის, დამალული ოპერაციული სისტემის ნაკადების მართვის სირთულეები პროგრამისტისგან.

// Goroutine-ის შექმნის მაგალითი
func myFunc() {
	// Goroutine-ის კოდი
}

func main() {
	go myFunc() // Goroutine-ის გაშვება
	// ძირითადი პროგრამა პარალელურად აგრძელებს მუშაობას
}