თანამედროვე კომპიუტერებს აქვთ მრავალი დამუშავების ბირთვი. ვივარაუდოთ, რომ საკმარისია დამუშავება ისე, რომ თითოეული ბირთვი მუდმივად იყოს დაკავებული. მათ დაენიშნებათ გამოთვლითი სამუშაოების რიგი. ან ძაფები, რომლებიც უნდა დაასრულოს გრაფიკის მიერ.
ამ ძაფების შესრულებისას შესაძლებელია ახალი ძაფების ან სამუშაო ნივთების გაჩენა. ეს არის ცალკეული ძაფები, რომელთა დამუშავება შესაძლებელია ერთდროულად. მათ შეიძლება დასჭირდეთ შედეგების დაბრუნება ქვირითობის პროგრამებში ან დარჩეს სრულიად განცალკევებით განუსაზღვრელი ვადით. როგორც წესი, ეს შვილობილი ძაფები ენიჭება იმავე დამუშავების ბირთვს, როგორც მშობელს.
ეს ყველაფერი ვარაუდობს, რომ ყველა ბირთვი დაკავებულია. ეს მოხდება იმ შემთხვევაში, თუ ძაფები არ მთავრდება ან ახალი ძაფები წარმოიქმნება იმავე სიჩქარით ან უფრო სწრაფად, ვიდრე არსებული ძაფები. თუმცა რეალურ სამყაროში გრძელვადიანი დატვირთვა იშვიათად არის ასეთი მარტივი, განსაკუთრებით საბოლოო მომხმარებლის გამოთვლით მოწყობილობებში. საბოლოო ჯამში, დამუშავების ბირთვი, სავარაუდოდ, დაასრულებს ყველა დავალებას. როდესაც ეს ხდება, ნაცვლად იმისა, რომ უმოქმედოდ იჯდეს და დახარჯოს პოტენციურ შესრულებაზე, ის ამოწმებს სხვა დამუშავების ბირთვების სამუშაო რიგებს და იპარავს მათ სამუშაო ელემენტს.
უპირატესობები და უარყოფითი მხარეები
სამუშაოს მოპარვა ნიშნავს, რომ უმოქმედო დამუშავების ბირთვი აქტიურად მოიძიებს სამუშაოს მის დასასრულებლად. ეს ხელს უშლის მთლიანი პროცესორის პოტენციურად დიდი ნაწილის უმოქმედოდ დაჯდომას, რაც სასარგებლოა. სამუშაოს ქურდობას შეიძლება გარკვეული ხარჯები მოჰყვეს. მაგალითად, ახალი დამუშავების ბირთვს, სავარაუდოდ, მოუწევს შესაბამისი მონაცემების ჩატვირთვა თავის ქეშ მეხსიერებაში.
ამას შეიძლება დრო დასჭირდეს, განსაკუთრებით იმ შემთხვევაში, თუ ის უნდა იყოს მოთხოვნილი სისტემის ოპერატიული მეხსიერებიდან, ვიდრე ემსახურება საერთო ქეშის დონეს. შესაძლებელია, რომ თავდაპირველმა პროცესორმა შეძლოს ამ სამუშაო ელემენტის განახლება ამ ვადაში, რაც გამოიწვევს უფრო სწრაფ შესრულებას. ეს შეიძლება მოხდეს იმ შემთხვევაშიც კი, თუ დამუშავების ბირთვი, საიდანაც სამუშაო ნივთი მოიპარეს, არასოდეს დაწყებულა მისი დამუშავება. ზოგიერთი ქეშირებული მნიშვნელობა შეიძლება იყოს იდენტური მშობლისა და შვილის ძაფებს შორის.
იმპლემენტაციები
პროგრამირების რამდენიმე ენას აქვს გაშვების დრო, რომელსაც შეუძლია სამუშაოს დაგეგმვა უშუალოდ სპეციალურ პროცესორებზე. მაგალითად, Cilk პროგრამირების ენას, Rust Tokio-ს და .Net Task Parallel Library-ს შეუძლია ამის გაკეთება. ალტერნატიულად, ოპერაციული სისტემა შეიძლება იყოს პასუხისმგებელი პროცესორის რეალური დროის დაგეგმვაზე. პროგრამა უბრალოდ ამატებს ამოცანებს „მუშა ძაფების“ აუზში, რომლებიც თავად დაგეგმილია ოპერაციული სისტემის მიერ.
ეს ხდება სისტემებში, სადაც პროგრამას არ აქვს გამოყოფილი პირდაპირი წვდომა გადამამუშავებელ ბირთვებზე, მაგრამ უნდა გაიზიაროს წვდომა სხვა პროცესებთან. ამ სცენარში განსაკუთრებული სიფრთხილეა საჭირო იმისათვის, რომ ძაფი არ მოიპაროს განმეორებით, რადგან ის უმოქმედოა.
არსებობს სხვადასხვა მიდგომა იმის თაობაზე, თუ როგორ შეირჩევა სამუშაო ნივთები მოსაპარად. თავდაპირველ კონცეფციაში მიდგომა იყო სხვა შემთხვევითი ბირთვის არჩევა. თუ მას ჰქონდა ერთი ან მეტი სამუშაო ელემენტი მის რიგში, აიღეთ ბოლო. დამოკიდებულია იმაზე, თუ რა პრეფერენციით მოხდება ბავშვის პროცესი დაუყოვნებლივ შესრულებული საწყისი პროცესორის მიერ. ან, თუ ის გადაინაცვლებს პროცესორის რიგში და მშობელი პროცესი გაგრძელდება, მშობელი ან შვილის თემა მოიპარება.
ეს ყველაფერი შეიძლება შეჯამდეს, როგორც Work Stealing, დატვირთვის დაბალანსების ტექნიკა, რომელიც უზრუნველყოფს სიტყვების დატვირთვის თანაბრად გავრცელებას ხელმისაწვდომ პროცესორებს შორის. ამ გზით, ყველა პროცესორი აკეთებს რაღაცას დასახმარებლად.
დასკვნა
სამუშაოს მოპარვა არის პროცესი, რომელიც ავტომატურად ხდება მრავალბირთვიან პროცესორებში. თითოეულ ბირთვს აქვს დავალებების რიგი შესასრულებელი. როდესაც პროცესორი ასრულებს თავის დავალებებს, ის შემდეგ იპარავს სხვა დავალებას სხვა დამუშავების ბირთვის რიგიდან. ეს ხელს უშლის პროცესორს, რომ ზოგიერთი ბირთვი უმოქმედო იყოს, მაშინ როცა სხვებს ჯერ კიდევ აქვთ დავალებების რიგი.