Ce este furtul de muncă?

Calculatoarele moderne au mai multe nuclee de procesare. Presupunând că există suficientă procesare, astfel încât fiecare nucleu să poată rămâne ocupat continuu. li se va atribui o coadă de articole de lucru de calcul. Sau fire de completare de către programator.

În timpul executării acestor fire, este posibil să generați fire noi sau elemente de lucru. Acestea sunt fire separate care pot fi procesate simultan. Este posibil să fie nevoie să transmită rezultatele programelor de reproducere sau să rămână complet separați pe o perioadă nedeterminată. De obicei, aceste fire de execuție secundare sunt atribuite aceluiași nucleu de procesare ca și părintele.

Toate acestea presupun că toate nucleele sunt ținute ocupate. Acest lucru se va întâmpla dacă nu se termină firele de execuție sau firele noi sunt generate la aceeași rată sau mai rapid decât sfârșitul firelor existente. În lumea reală, însă, volumul de lucru pe termen lung este rareori atât de simplu, mai ales în cazul dispozitivelor de calcul ale utilizatorilor finali. În cele din urmă, un nucleu de procesare va finaliza probabil toate sarcinile atribuite. Când se întâmplă acest lucru, în loc să stea inactiv și să irosească performanța potențială, verifică în schimb cozile de lucru ale celorlalte nuclee de procesare și le fură un element de lucru.

Beneficii și dezavantaje

Furtul de muncă înseamnă că un nucleu de procesare inactiv va căuta în mod activ lucru pentru a fi finalizat. Acest lucru împiedică o parte potențial mare a procesorului general să stea inactiv, ceea ce este util. Furtul de muncă poate veni cu unele costuri, totuși. De exemplu, noul nucleu de procesare va trebui probabil să încarce orice date relevante în memoria sa cache.

Acest lucru poate dura timp, mai ales dacă trebuie să fie solicitat din RAM de sistem, mai degrabă decât să fie servit de un nivel cache partajat. Este posibil ca procesorul original să fi putut relua acel element de lucru în acel interval de timp, ceea ce duce la o execuție generală mai rapidă. Acest lucru poate fi chiar și dacă nucleul de procesare din care a fost furat articolul de lucru nu a început niciodată să-l proceseze. Unele valori stocate în cache pot fi identice între firele de execuție părinte și secundare.

Implementări

Mai multe limbaje de programare au timpi de execuție care pot programa lucrul direct pe procesoarele dedicate. De exemplu, limbajul de programare Cilk, runtime-ul Rust Tokio și biblioteca paralelă .Net Task pot face acest lucru. Alternativ, sistemul de operare poate fi responsabil de programarea timpului real al procesorului. Cu programul pur și simplu adăugarea de sarcini la un grup de „fir de lucru”, care sunt ele însele programate de sistemul de operare.

Acest lucru se întâmplă în sistemele în care programul nu are acces direct dedicat la nucleele de procesare, dar trebuie să partajeze accesul cu alte procese. Trebuie acordată atenție suplimentară în acest scenariu pentru a vă asigura că un fir nu este furat în mod repetat, deoarece este inactiv.

Există diferite abordări ale modului în care articolele de lucru sunt selectate pentru a fi furate. În conceptul original, abordarea a fost alegerea unui alt nucleu aleatoriu. Dacă avea unul sau mai multe elemente de lucru în coadă, luați-l pe ultimul. În funcție de preferința dacă un proces copil este executat imediat de procesorul de origine. Sau, dacă este împins în coada procesorului și procesul părinte continuă să fie executat, firul părinte sau copil va fi furat.

Totul poate fi rezumat ca Work Stealing, o tehnică de echilibrare a sarcinii care asigură că încărcarea cuvintelor este răspândită uniform între procesoarele disponibile. În acest fel, toți procesoarele fac ceva pentru a ajuta.

Concluzie

Furtul de muncă este un proces care are loc automat în procesoarele multicore. Fiecare nucleu are o coadă de sarcini de efectuat. Când un procesor își finalizează sarcinile, apoi fură o altă sarcină din coada unui alt nucleu de procesare. Acest lucru ajută la prevenirea ca procesorul să aibă unele nuclee inactive, în timp ce altele au încă o coadă de sarcini de efectuat.