A modern számítógépek több processzormaggal rendelkeznek. Feltéve, hogy elegendő a feldolgozás ahhoz, hogy minden mag folyamatosan elfoglalt maradhasson. hozzá kell rendelni egy sor számítási munkaelemet. Vagy az ütemező által befejezendő szálak.
A szálak végrehajtása során lehetőség nyílik új szálak vagy munkaelemek létrehozására. Ezek különálló szálak, amelyek egyidejűleg feldolgozhatók. Előfordulhat, hogy az eredményeket vissza kell szolgáltatniuk az ívási programoknak, vagy korlátlan ideig teljesen külön kell maradniuk. Ezek a gyermekszálak általában ugyanahhoz a feldolgozási maghoz vannak hozzárendelve, mint a szülő.
Mindez azt feltételezi, hogy az összes mag foglalt. Ez akkor történik meg, ha nem ér véget a szál, vagy új szálak jönnek létre ugyanolyan sebességgel vagy gyorsabban, mint a meglévő szálak véget érnek. A való világban azonban a hosszú távú munkaterhelés ritkán ilyen egyszerű, különösen a végfelhasználói számítástechnikai eszközökben. Végül egy feldolgozó mag valószínűleg elvégzi az összes hozzárendelt feladatot. Amikor ez megtörténik, ahelyett, hogy tétlenül ülne és pazarolná a potenciális teljesítményt, ellenőrzi a többi feldolgozómag munkasorát, és ellop tőlük egy munkaelemet.
Előnyök és hátrányok
A munkalopás azt jelenti, hogy egy tétlen feldolgozómag aktívan keresi a munkát a befejezéshez. Ez megakadályozza, hogy a teljes processzor potenciálisan nagy része tétlenül álljon, ami hasznos. A munkalopás azonban bizonyos költségekkel járhat. Például az új feldolgozó magnak valószínűleg minden releváns adatot be kell töltenie a gyorsítótárba.
Ez időbe telhet, különösen akkor, ha a rendszer RAM-jából kell kérni, nem pedig megosztott gyorsítótár-szinten. Lehetséges, hogy az eredeti processzor képes lett volna folytatni az adott munkaelemet ezen az időn belül, ami gyorsabb általános végrehajtást eredményezett. Ez akkor is előfordulhat, ha a feldolgozási mag, amelyből a munkadarabot ellopták, soha nem kezdte volna el feldolgozni. Egyes gyorsítótárazott értékek azonosak lehetnek a szülő- és a gyermekszálak között.
Megvalósítások
Számos programozási nyelv rendelkezik futtatókörnyezetekkel, amelyek közvetlenül a dedikált processzorokon ütemezhetik a munkát. Például a Cilk programozási nyelv, a Rust Tokio futtatókörnyezet és a .Net Task Parallel Library képes erre. Alternatív megoldásként az operációs rendszer felelős a tényleges processzoridő ütemezéséért. A program egyszerűen hozzáadja a feladatokat a „munkaszálak” készletéhez, amelyeket az operációs rendszer ütemez.
Ez olyan rendszerekben történik, ahol a programnak nincs dedikált közvetlen hozzáférése a feldolgozómagokhoz, de meg kell osztania a hozzáférést más folyamatokkal. Ebben a forgatókönyvben fokozottan ügyelni kell arra, hogy egy szálat ne lopjanak el ismételten, miközben tétlenül áll.
Különféle megközelítések léteznek arra vonatkozóan, hogy a munkatárgyakat hogyan választják ki ellopni. Az eredeti koncepcióban a megközelítés egy másik véletlenszerű mag kiválasztására irányult. Ha egy vagy több munkaelem volt a sorban, vegye az utolsót. Attól függően, hogy az utódfolyamatot az eredeti processzor azonnal végrehajtja-e. Vagy ha a processzor sorába tolják, és a szülőfolyamat továbbra is végrehajtásra kerül, a szülő- vagy gyermekszálat ellopják.
Mindez összefoglalható: Work Stealing, egy terheléselosztási technika, amely biztosítja, hogy a szóterhelés egyenletesen oszlik el a rendelkezésre álló processzorok között. Így minden processzor tesz valamit, hogy segítsen.
Következtetés
A munkalopás egy olyan folyamat, amely automatikusan megtörténik a többmagos CPU-kban. Minden magnak van egy sor végrehajtandó feladat. Amikor egy processzor befejezi a feladatait, akkor ellop egy másik feladatot egy másik processzormag sorából. Ez segít megakadályozni, hogy a processzor egyes magjai tétlenül üljenek, míg másoknak még mindig sora álljon a feladatok elvégzésében.