Сучасні комп'ютери мають кілька процесорних ядер. Припустимо, що достатньо обробки, щоб кожне ядро могло постійно бути зайнятим. їм буде призначено чергу обчислювальних завдань. Або потоки для завершення планувальником.
Під час виконання цих потоків можна створювати нові потоки або робочі елементи. Це окремі потоки, які можна обробляти одночасно. Їм може знадобитися передати результати програмам породження або залишатися повністю відокремленими на невизначений термін. Як правило, ці дочірні потоки призначаються тому ж ядру обробки, що й батьківський.
Все це передбачає, що всі ядра зайняті. Це станеться, якщо жоден з потоків не завершується або нові потоки створюються з такою ж швидкістю або швидше, ніж завершуються існуючі потоки. Однак у реальному світі довгострокове робоче навантаження рідко буває таким простим, особливо в обчислювальних пристроях кінцевих користувачів. Зрештою ядро обробки, швидше за все, виконає всі призначені завдання. Коли це трапляється, замість того, щоб сидіти без діла та витрачати потенційну продуктивність, він натомість перевіряє робочі черги інших процесорних ядер і викрадає з них робочий елемент.
Переваги та недоліки
Викрадення роботи означає, що неактивне ядро обробки буде активно шукати роботу для виконання. Це запобігає бездіяльності потенційно великої частини процесора, що є корисним. Проте крадіжка роботи може призвести до певних витрат. Наприклад, нове процесорне ядро, ймовірно, має завантажувати будь-які відповідні дані у свою кеш-пам’ять.
Це може зайняти час, особливо якщо його потрібно запитувати з системної оперативної пам’яті, а не обслуговувати рівень спільного кешу. Цілком можливо, що оригінальний процесор міг би відновити цей робочий елемент за цей проміжок часу, що призвело б до швидшого загального виконання. Це може бути навіть у тому випадку, якщо ядро обробки, з якого було вкрадено робочий елемент, ніколи не починало його обробку. Деякі кешовані значення можуть бути ідентичними між батьківським і дочірнім потоками.
Реалізації
Кілька мов програмування мають середовища виконання, які можуть планувати роботу безпосередньо на виділених процесорах. Наприклад, мова програмування Cilk, середовище виконання Rust Tokio та бібліотека .Net Task Parallel Library можуть це зробити. Крім того, операційна система може відповідати за планування фактичного процесорного часу. Програма просто додає завдання до пулу «робочих потоків», які самі плануються операційною системою.
Це трапляється в системах, де програма не має виділеного прямого доступу до процесорних ядер, але має ділитися доступом з іншими процесами. У цьому сценарії потрібно бути особливо обережним, щоб переконатися, що потік не буде повторно викрадено, коли він простоює.
Існують різні підходи до того, як відбираються робочі предмети для крадіжки. У початковій концепції підхід полягав у виборі іншого випадкового ядра. Якщо в черзі є один або кілька робочих елементів, візьміть останній. Залежно від уподобання, чи дочірній процес негайно виконується вихідним процесором. Або, якщо його відправлено до черги процесора, а батьківський процес продовжує виконуватися, батьківський або дочірній потік буде вкрадено.
Усе це можна описати як крадіжку роботи, техніку балансування навантаження, яка забезпечує рівномірний розподіл навантаження між доступними процесорами. Таким чином, усі процесори роблять щось, щоб допомогти.
Висновок
Крадіжка роботи — це процес, який відбувається автоматично в багатоядерних процесорах. Кожне ядро має чергу завдань для виконання. Коли процесор виконує свої завдання, він потім викрадає інше завдання з черги іншого процесорного ядра. Це допомагає запобігти тому, що деякі ядра процесора простоюють, а інші все ще мають чергу завдань для виконання.