Τι είναι η κλοπή εργασίας;

Οι σύγχρονοι υπολογιστές έχουν πολλαπλούς πυρήνες επεξεργασίας. Υποθέτοντας ότι υπάρχει αρκετή επεξεργασία έτσι ώστε κάθε πυρήνας να μπορεί να παραμένει συνεχώς απασχολημένος. θα τους ανατεθεί μια ουρά υπολογιστικών στοιχείων εργασίας. Ή νήματα για συμπλήρωση από τον προγραμματιστή.

Κατά την εκτέλεση αυτών των νημάτων, είναι δυνατή η δημιουργία νέων νημάτων ή στοιχείων εργασίας. Αυτά είναι ξεχωριστά νήματα που μπορούν να υποβληθούν σε επεξεργασία ταυτόχρονα. Μπορεί να χρειαστεί να ανατροφοδοτήσουν τα αποτελέσματα στα προγράμματα αναπαραγωγής ή να παραμείνουν εντελώς ξεχωριστά επ' αόριστον. Συνήθως, αυτά τα θυγατρικά νήματα εκχωρούνται στον ίδιο πυρήνα επεξεργασίας με το γονικό.

Όλα αυτά προϋποθέτουν ότι όλοι οι πυρήνες παραμένουν απασχολημένοι. Αυτό θα συμβεί εάν κανένα νήμα δεν τελειώνει ή αν δημιουργηθούν νέα νήματα με τον ίδιο ρυθμό ή ταχύτερα από το τέλος των υπαρχόντων νημάτων. Στον πραγματικό κόσμο, ωστόσο, ο μακροπρόθεσμος φόρτος εργασίας είναι σπάνια τόσο απλός, ειδικά σε υπολογιστικές συσκευές τελικού χρήστη. Τελικά, ένας πυρήνας επεξεργασίας πιθανότατα θα ολοκληρώσει όλες τις εργασίες που έχουν ανατεθεί. Όταν συμβαίνει αυτό, αντί να κάθεται σε αδράνεια και να σπαταλά την πιθανή απόδοση, ελέγχει τις ουρές εργασίας των άλλων πυρήνων επεξεργασίας και κλέβει ένα αντικείμενο εργασίας από αυτούς.

Οφέλη και μειονεκτήματα

Η κλοπή εργασίας σημαίνει ότι ένας πυρήνας επεξεργασίας σε αδράνεια θα αναζητήσει ενεργά εργασία για να ολοκληρωθεί. Αυτό εμποδίζει ένα δυνητικά μεγάλο τμήμα του συνολικού επεξεργαστή να παραμείνει σε αδράνεια, κάτι που είναι χρήσιμο. Ωστόσο, η κλοπή εργασίας μπορεί να έχει κάποιο κόστος. Για παράδειγμα, ο νέος πυρήνας επεξεργασίας πιθανότατα θα πρέπει να φορτώσει τυχόν σχετικά δεδομένα στην κρυφή μνήμη του.

Αυτό μπορεί να πάρει χρόνο, ειδικά αν πρέπει να ζητηθεί από τη μνήμη RAM του συστήματος αντί να εξυπηρετηθεί από ένα κοινό επίπεδο προσωρινής μνήμης. Είναι πιθανό ο αρχικός επεξεργαστής να ήταν σε θέση να συνεχίσει αυτό το αντικείμενο εργασίας σε αυτό το χρονικό πλαίσιο, οδηγώντας σε ταχύτερη συνολική εκτέλεση. Αυτό μπορεί να συμβεί ακόμη και αν ο πυρήνας επεξεργασίας από τον οποίο κλάπηκε το αντικείμενο εργασίας δεν είχε ποτέ ξεκινήσει την επεξεργασία του. Ορισμένες τιμές προσωρινής αποθήκευσης ενδέχεται να είναι πανομοιότυπες μεταξύ των γονικών και θυγατρικών νημάτων.

Υλοποιήσεις

Πολλές γλώσσες προγραμματισμού έχουν χρόνους εκτέλεσης που μπορούν να προγραμματίσουν εργασίες απευθείας σε αποκλειστικούς επεξεργαστές. Για παράδειγμα, η γλώσσα προγραμματισμού Cilk, ο χρόνος εκτέλεσης Rust Tokio και η .Net Task Parallel Library μπορούν να το κάνουν αυτό. Εναλλακτικά, το λειτουργικό σύστημα μπορεί να είναι υπεύθυνο για τον προγραμματισμό του πραγματικού χρόνου του επεξεργαστή. Με το πρόγραμμα απλώς προσθέτει εργασίες σε μια δεξαμενή «εργαζομένων νημάτων», τα οποία είναι προγραμματισμένα από το λειτουργικό σύστημα.

Αυτό συμβαίνει σε συστήματα όπου το πρόγραμμα δεν έχει αποκλειστική άμεση πρόσβαση σε πυρήνες επεξεργασίας αλλά πρέπει να μοιράζεται την πρόσβαση με άλλες διεργασίες. Πρέπει να δοθεί ιδιαίτερη προσοχή σε αυτό το σενάριο για να διασφαλιστεί ότι ένα νήμα δεν κλαπεί επανειλημμένα καθώς παραμένει αδρανές.

Υπάρχουν διάφορες προσεγγίσεις για τον τρόπο με τον οποίο επιλέγονται τα αντικείμενα εργασίας για κλοπή. Στην αρχική ιδέα, η προσέγγιση ήταν να επιλεγεί ένας άλλος τυχαίος πυρήνας. Εάν είχε ένα ή περισσότερα αντικείμενα εργασίας στην ουρά του, πάρτε το τελευταίο. Ανάλογα με την προτίμηση για το εάν μια θυγατρική διεργασία εκτελείται αμέσως από τον αρχικό επεξεργαστή. Ή, εάν προωθηθεί στην ουρά του επεξεργαστή και η γονική διαδικασία συνεχίσει να εκτελείται, το γονικό ή το θυγατρικό νήμα θα κλαπεί.

Όλα μπορούν να συνοψιστούν ως Work Stealing, μια τεχνική εξισορρόπησης φορτίου που διασφαλίζει ότι το word load κατανέμεται ομοιόμορφα μεταξύ των διαθέσιμων επεξεργαστών. Με αυτόν τον τρόπο, όλοι οι επεξεργαστές κάνουν κάτι για να βοηθήσουν.

συμπέρασμα

Η κλοπή εργασίας είναι μια διαδικασία που συμβαίνει αυτόματα σε πολυπύρηνες CPU. Κάθε πυρήνας έχει μια ουρά εργασιών για εκτέλεση. Όταν ένας επεξεργαστής ολοκληρώσει τις εργασίες του, στη συνέχεια κλέβει μια άλλη εργασία από την ουρά ενός άλλου πυρήνα επεξεργασίας. Αυτό βοηθά να αποτρέψει τον επεξεργαστή από το να έχει ορισμένους πυρήνες σε αδράνεια, ενώ άλλοι έχουν ακόμα μια ουρά εργασιών για εκτέλεση.