Съвременните компютри имат множество процесорни ядра. Ако приемем, че има достатъчно обработка, така че всяко ядро да може да остане непрекъснато заето. ще им бъде назначена опашка от изчислителни работни елементи. Или нишки за завършване от планировчика.
По време на изпълнението на тези нишки е възможно да създадете нови нишки или работни елементи. Това са отделни нишки, които могат да се обработват едновременно. Може да се наложи да върнат резултатите обратно към програмите за хвърляне на хайвера или да останат напълно отделени за неопределено време. Обикновено тези дъщерни нишки се присвояват на същото процесорно ядро като родителя.
Всичко това предполага, че всички ядра са заети. Това ще се случи, ако никоя нишка не приключи или нови нишки се генерират със същата скорост или по-бързо от края на съществуващите нишки. В реалния свят обаче дългосрочното работно натоварване рядко е толкова просто, особено в изчислителните устройства за крайни потребители. В крайна сметка процесорното ядро вероятно ще изпълни всички възложени задачи. Когато това се случи, вместо да седи бездействащ и да губи потенциална производителност, той вместо това проверява работните опашки на другите процесорни ядра и краде работен елемент от тях.
Предимства и недостатъци
Кражбата на работа означава, че неактивно обработващо ядро активно ще търси работа, която да завърши. Това предотвратява потенциално голяма част от общия процесор да остане неактивен, което е полезно. Кражбата на работа обаче може да доведе до известни разходи. Например, новото ядро за обработка вероятно ще трябва да зареди всички подходящи данни в своята кеш памет.
Това може да отнеме време, особено ако трябва да бъде поискано от системната RAM, вместо да се обслужва от ниво на споделен кеш. Възможно е оригиналният процесор да може да възобнови този работен елемент в този период от време, което да доведе до по-бързо цялостно изпълнение. Това дори може да се случи, ако процесорното ядро, от което е бил откраднат работният елемент, никога не е започнало да го обработва. Някои кеширани стойности може да са идентични между родителските и дъщерните нишки.
Реализации
Няколко езика за програмиране имат времена за изпълнение, които могат да планират работа директно на специални процесори. Например езикът за програмиране Cilk, Rust Tokio runtime и .Net Task Parallel Library могат да направят това. Като алтернатива, операционната система може да отговаря за планирането на действителното процесорно време. С програмата просто добавяне на задачи към набор от „работни нишки“, които сами по себе си са планирани от операционната система.
Това се случва в системи, където програмата няма специален директен достъп до процесорните ядра, но трябва да споделя достъп с други процеси. При този сценарий трябва да се внимава изключително много, за да се гарантира, че дадена нишка няма многократно да бъде открадната, докато не се използва.
Има различни подходи за това как работните предмети се избират за кражба. В първоначалната концепция подходът беше да се избере друго произволно ядро. Ако има един или повече работни елементи в опашката си, вземете последния. В зависимост от предпочитанието дали дъщерен процес се изпълнява незабавно от първоначалния процесор. Или, ако бъде избутан в опашката на процесора и родителският процес продължава да се изпълнява, родителската или дъщерната нишка ще бъде открадната.
Всичко това може да се обобщи като кражба на работа, техника за балансиране на натоварването, която гарантира, че натоварването на думите се разпределя равномерно между наличните процесори. По този начин всички процесори правят нещо, за да помогнат.
Заключение
Кражбата на работа е процес, който се случва автоматично в многоядрените процесори. Всяко ядро има опашка от задачи за изпълнение. Когато процесорът изпълни задачите си, той открадва друга задача от опашката на друго процесорно ядро. Това помага да се предотврати някои ядра на процесора да стоят празни, докато други все още имат опашка от задачи за изпълнение.