Fir (informatică)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Un proces cu două fire

Un fir [1] sau un fir de execuție , în informatică , este o subdiviziune a unui proces în două sau mai multe fire (instanțe) sau subprocese care sunt rulate concomitent de un monoprocesor (monothreading) sau multiprocesor ( multithreading ) sau sistem de procesare multicore .

Definiții

Implementarea specifică a thread-urilor și proceselor depinde de sistemul de operare , dar, în general, un thread este conținut într-un proces și mai multe thread-uri conținute în același proces partajează unele resurse, spațiul de adrese al procesului, în timp ce diferite procese nu le partajează. resurse.

Un fir este compus în esență din trei elemente: contor de programe , valori în registre și stivă. Resursele partajate cu celelalte fire ale aceleiași sarcini sunt în esență secțiunea de cod, secțiunea de date și resursele sistemului de operare .

În arhitecturile cu un singur procesor, când CPU execută alternativ instrucțiuni de la fire diferite, vorbim de divizarea timpului multithreading : comutarea între fire are loc de obicei atât de frecvent încât îi dă utilizatorului impresia că toate sarcinile rulează simultan. Pe de altă parte, în arhitecturile multi-procesor, firele sunt executate simultan, adică, în paralel, fiecare pe un nucleu distinct.

Când acțiunile sunt efectuate la nivelul firului, toate informațiile de stare referitoare la execuție sunt păstrate în structuri de date la nivel de fir. Cu toate acestea, există multe acțiuni care afectează toate firele dintr-un proces pe care sistemul de operare trebuie să le gestioneze la nivel de proces. Suspendarea și încetarea unui proces aparțin acestui tip de acțiune. În ambele cazuri, eliminarea spațiului de adrese din memorie afectează toate firele care partajează acel spațiu de adrese și, prin urmare, toate intră împreună în starea suspendată sau terminată.

La fel ca procesele, firele au, de asemenea, o stare de execuție și se pot sincroniza între ele. Stările unui fir sunt gata , rulează și sunt blocate .

Există patru operații de bază asociate cu modificările stării firului.

  • Creație: Când este creat un proces, este creat și un fir. Ulterior, un fir poate crea un alt fir către care trebuie să furnizeze indicatorul de instrucțiuni și argumente: se creează un context pentru registre și stive, iar noul fir este pus în coada gata .
  • Blocare: atunci când un fir trebuie să aștepte un anumit eveniment, acesta intră în starea blocată (salvând registrele utilizatorului, contorul programului și indicatorul stivei )
  • Deblocare: Când apare evenimentul pentru care procesul a fost plasat în starea blocată, firul trece la starea de pregătire.
  • Încheiere: Când un fir își termină sarcina, contextul său de înregistrare și stivele sunt alocate.

Aplicații

Aplicațiile tipice ale thread-urilor sunt paralelizarea unui program pentru a profita de procesoarele multi-core moderne și / sau nucleele multi-thread: de fapt, un singur thread poate rula pe un singur nucleu la un moment dat, dar un nucleu dacă este echipat cu HT ( Hyper- Threading) sau SMT (Multithreading simultan) pot executa 2 fire.

În interfețele utilizator , firele sunt utilizate pe scară largă pentru a evita înghețarea interfeței atunci când programul efectuează o altă sarcină în fundal . De exemplu, un browser web poate derula printr-o pagină web chiar dacă încărcarea acesteia nu este finalizată; în mod similar, comenzile unui player media sunt de asemenea accesibile în timp ce playerul redă un film.

Principalul avantaj al firelor este în performanță: operațiuni precum crearea, terminarea și comutarea între două fire ale unui proces necesită mai puțin timp decât crearea, terminarea și comutarea proceselor.

Subiectele îmbunătățesc, de asemenea, eficiența comunicării între programele care rulează. În majoritatea sistemelor de operare, comunicarea între procese independente necesită intervenția nucleului pentru a oferi un mecanism de comunicare și protecție. În schimb, deoarece firele partajează memorie și fișiere în cadrul aceluiași proces, pot comunica între ele fără a apela nucleul.

Dificultate

Programarea concurentă , adică scrierea aplicațiilor multithread, are reputația de a fi o tehnică destul de dificilă. În realitate, utilizarea unui fir nu implică dificultăți particulare în sine: dificultatea constă de obicei în sincronizarea accesului la resurse prin diferite fire care acționează în concurență asupra acelorași resurse. Dacă aveți două sau mai multe fire care accesează aceleași date în același timp poate duce la rezultate neașteptate și nedorite. De fapt, fără aplicarea unor tehnici de programare particulare, nu este posibil să se prevadă într-un mod determinist, în momentul execuției, când acel fir specific va fi executat: progresia lor depinde de prioritățile decise de programatorul sistemului de operare și nu de către programator.

De fapt, mai multe fire pot accesa aceeași variabilă și pot modifica conținutul sau valoarea acesteia. Deși acest lucru nu se întâmplă în același timp, deoarece accesul la o variabilă, care este de fapt stocată în memoria RAM , este inerent limitat la cel mult o unitate, se poate întâmpla ca un fir să schimbe valoarea unei variabile, în timp ce un alt fir să are nevoie de vechea valoare stocată în ea. Prin urmare, tehnici de sincronizare precum excluderea reciprocă sunt utilizate pentru a rezolva problema.

Ca rezultat, în mod ideal, un fir de execuție ar trebui să execute cod cât mai independent posibil de restul programului. Mai mult, erorile de sincronizare între fire sunt adesea foarte greu de detectat, deoarece apariția lor depinde în esență de mediul în care rulează programul.

Sincronizarea unui fir cu altul este în mod normal necesară pentru a le permite să comunice între ele și să returneze rezultatele unei funcții la procesul principal; în mod normal se face prin mutex .

Notă

  1. ^ Lit., „venă”.

Elemente conexe

Alte proiecte

linkuri externe

Controlul autorității LCCN (EN) sh97002264 · GND (DE) 4377482-9 · BNF (FR) cb133204714 (data)
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT