Parallel Extensions (din engleză - „Parallel extensions”) este o bibliotecă de paralelism gestionată dezvoltată ca rezultat al colaborării dintre Microsoft Research și grupul CLR [1] de la Microsoft . Biblioteca a fost lansată în versiunea 4.0 a .NET Framework [2] . Este format din două părți: Parallel LINQ (PLINQ) și Task Parallel Library (TPL) [3] [4] . De asemenea, constă dintr-un set de structuri de date de coordonare (CDS) - seturi de structuri de date utilizate pentru sincronizarea și coordonarea execuției sarcinilor paralele [5] .
PLINQ sau Parallel LINQ [6] paralelizează execuția interogărilor împotriva obiectelor (LINQ for Objects) și a datelor XML [7] (LINQ for XML). PLINQ este conceput pentru a detecta paralelismul datelor folosind interogări [3] . PLINQ poate paraleliza orice calcul pe obiecte implementate ca interogări. Cu toate acestea, obiectele trebuie să implementeze interfața IParallelEnumerable, care este definită de PLINQ însuși. Intern, folosește TPL [5] pentru a executa .
Biblioteca paralelă a sarcinilor ( TPL [8] ) este componenta paralelism a sarcinilor a extensiilor paralele .NET [9] . Oferă construcții paralele, cum ar fi bucle paralele Forși ForEach, folosind apeluri de metode normale și delegați , astfel încât construcțiile pot fi utilizate din orice limbaj CLI . Lucrarea de generare și terminare a unui fir de execuție , precum și de scalare a numărului de fire de execuție în funcție de numărul de procesoare disponibile, este realizată de biblioteca însăși [4] folosind planificatorul de captură graduală [10] .
TPL include, de asemenea, alte constructe, cum ar fi Task și Future . O sarcină este o acțiune care poate fi efectuată independent de restul programului. În acest sens, este echivalent din punct de vedere semantic cu un fir de execuție, cu excepția faptului că este un obiect mai ușor și nu implică suprasarcina creării unui fir de execuție a sistemului de operare. Activitățile sunt puse în coadă de obiectul Task Manager și programate să ruleze pe mai multe fire de execuție ale sistemului de operare dintr-un pool de atunci când le vine rândul.
Viitorul este o sarcină care returnează un rezultat. Rezultatul este evaluat pe un thread de fundal încapsulat de obiectul Viitorul și stocat în tampon până când [4] este primit . Dacă se încearcă obținerea rezultatului înainte ca acesta să fie calculat, atunci firul solicitant se va bloca până când rezultatul este disponibil [9] .
Un alt construct TPL este clasa Parallel . TPL oferă o formă de bază de paralelism structurat prin trei metode statice din clasa Parallel:
Paralel.Invocare Execută o serie de delegați de acțiune în paralel și apoi așteaptă finalizarea acestora Paralel.Pentru Echivalentul paralel al unei bucle for în C# Paralel.PentruFiecare Echivalentul paralel al unei bucle foreach în C#Conceptul de bază al extensiilor paralele .NET este Задача, care este un mic bloc de cod, de obicei reprezentat ca o funcție lambda , care poate fi executat independent. Atât PLINQ, cât și API-ul TPL oferă metode pentru crearea de sarcini - PLINQ împarte interogarea în sarcini mai mici, în timp ce metodele , și Parallel.Forîmpart Parallel.ForEachbucla Parallel.Invokeîn sarcini.
PFX include un obiect Диспетчер задачcare programează sarcini pentru a rula. Managerul de activități conține o coadă globală de sarcini care sunt apoi executate. De asemenea, încapsulează mai multe fire în care sunt executate sarcini. În mod implicit, sunt create atâtea fire de execuție câte procesoare (sau nuclee de procesor) există în sistem, deși acest număr poate fi modificat manual. Fiecare fir este asociat cu o coadă de sarcini specifică firului de execuție. În timp ce este inactiv, fiecare thread preia un lot de sarcini și le pune în propria coadă locală, unde sunt apoi executate pe rând. Dacă coada globală este goală, firul de execuție va căuta Sarcini în cozile colegilor săi și va ridica Sarcinile care au fost în coadă pentru cel mai mult timp ( Captură treptată a sarcinilor ). Când sunt executate, sarcinile vor fi executate independent, în timp ce schimbarea stării unei sarcini nu depinde de celelalte. Ca rezultat, dacă folosesc o resursă partajată, trebuie să fie sincronizate manual folosind blocări sau alte construcții.
.NET | |
---|---|
Implementări | |
Arhitectură | |
Infrastructură | |
Limbi Microsoft | |
Alte limbi | |
Fundamente Windows | |
Componente | |
Comparații |
|
Tehnologii viitoare | |
Resurse informaționale |