Nowoczesne komputery mają wiele rdzeni przetwarzających. Zakładając, że jest wystarczająco dużo przetwarzania, aby każdy rdzeń mógł być stale zajęty. zostanie im przypisana kolejka obliczeniowych elementów pracy. Lub wątki do ukończenia przez harmonogram.
Podczas wykonywania tych wątków możliwe jest tworzenie nowych wątków lub elementów roboczych. Są to oddzielne wątki, które mogą być przetwarzane jednocześnie. Mogą potrzebować przekazać wyniki z powrotem do programów tarła lub pozostać całkowicie oddzielone przez czas nieokreślony. Zazwyczaj te wątki podrzędne są przypisane do tego samego rdzenia przetwarzania co rodzic.
Wszystko to zakłada, że wszystkie rdzenie są zajęte. Stanie się tak, jeśli żaden wątek się nie kończy lub nowe wątki są odradzane w tym samym tempie lub szybciej niż kończą się istniejące wątki. Jednak w prawdziwym świecie długoterminowe obciążenie pracą rzadko jest tak proste, zwłaszcza w przypadku urządzeń komputerowych użytkowników końcowych. W końcu rdzeń przetwarzający prawdopodobnie wykona wszystkie przydzielone zadania. Kiedy tak się dzieje, zamiast siedzieć bezczynnie i marnować potencjalną wydajność, zamiast tego sprawdza kolejki robocze innych rdzeni przetwarzania i kradnie im element roboczy.
Korzyści i wady
Kradzież pracy oznacza, że bezczynny rdzeń przetwarzający będzie aktywnie poszukiwał pracy, aby ją wykonać. Zapobiega to bezczynności potencjalnie dużej części całego procesora, co jest pomocne. Kradzież pracy może jednak wiązać się z pewnymi kosztami. Na przykład nowy rdzeń przetwarzania prawdopodobnie będzie musiał załadować odpowiednie dane do swojej pamięci podręcznej.
Może to zająć trochę czasu, zwłaszcza jeśli trzeba zażądać tego z systemowej pamięci RAM, a nie z udostępnionej warstwy pamięci podręcznej. Możliwe, że oryginalny procesor byłby w stanie wznowić ten element pracy w tym czasie, co prowadziłoby do szybszego ogólnego wykonania. Może się tak zdarzyć nawet wtedy, gdy rdzeń przetwarzania, z którego skradziono element pracy, nigdy nie zaczął go przetwarzać. Niektóre wartości w pamięci podręcznej mogą być identyczne w wątkach nadrzędnych i podrzędnych.
Realizacje
Kilka języków programowania ma środowiska wykonawcze, które mogą planować pracę bezpośrednio na dedykowanych procesorach. Na przykład język programowania Cilk, środowisko uruchomieniowe Rust Tokio i biblioteka równoległa zadań .Net mogą to zrobić. Alternatywnie system operacyjny może być odpowiedzialny za planowanie rzeczywistego czasu procesora. Dzięki programowi po prostu dodaje zadania do puli „wątków roboczych”, które same są zaplanowane przez system operacyjny.
Dzieje się tak w systemach, w których program nie ma dedykowanego bezpośredniego dostępu do rdzeni przetwarzania, ale musi współdzielić dostęp z innymi procesami. W tym scenariuszu należy zachować szczególną ostrożność, aby upewnić się, że wątek nie zostanie wielokrotnie skradziony, gdy jest bezczynny.
Istnieją różne podejścia do wybierania elementów pracy do kradzieży. W pierwotnej koncepcji podejście polegało na wybraniu innego losowego rdzenia. Jeśli w kolejce znajduje się jeden lub więcej elementów roboczych, weź ostatni. W zależności od preferencji dotyczących tego, czy proces potomny jest natychmiast wykonywany przez procesor inicjujący. Lub, jeśli zostanie przeniesiony do kolejki procesora, a proces nadrzędny będzie nadal wykonywany, wątek nadrzędny lub podrzędny zostanie skradziony.
Wszystko to można podsumować jako kradzież pracy, technikę równoważenia obciążenia, która zapewnia równomierne rozłożenie obciążenia słów między dostępne procesory. W ten sposób wszystkie procesory robią coś, aby pomóc.
Wniosek
Kradzież pracy to proces, który odbywa się automatycznie w wielordzeniowych procesorach. Każdy rdzeń ma kolejkę zadań do wykonania. Kiedy procesor kończy swoje zadania, kradnie kolejne zadanie z kolejki innego rdzenia przetwarzania. Pomaga to zapobiec sytuacji, w której niektóre rdzenie procesora pozostają bezczynne, podczas gdy inne wciąż mają kolejkę zadań do wykonania.