Fire de execuție în CPU și diferența sa cu procesele software

Computerele nu mai sunt ca începuturile lor care rulează un proces și, mulțumesc, au acum capacitatea de a rula un număr imens de programe în paralel. Unele dintre ele le vedem în jocurile noastre, altele sunt invizibile, dar acolo sunt, fiind executate de Procesor. Există o relație între procesele software-ului și firele de execuție cu cele ale hardware-ului?

Adesea auzim sau citim firul conceptului de execuție atunci când auzim despre procesoare noi, dar și în lumea software-ului. De aceea am decis să explicăm diferențele dintre care sunt procesele sau firele de execuție în software și echivalenții lor semnificativi în hardware.

Procese în software

Fire de execuție în CPU

În cea mai simplă definiție, un program nu este altceva decât o succesiune de instrucțiuni ordonate secvențial în memorie, care sunt procesate de CPU, dar realitatea este mai complexă. Oricine are puține cunoștințe de programare va ști că această definiție corespunde diferitelor procese care sunt executate într-un program, în care fiecare proces intercomunicează cu celelalte și se găsește într-o parte a memoriei.

Astăzi avem un număr mare de programe care rulează pe computerul nostru și, prin urmare, un număr mult mai mare de procese, care luptă pentru a accesa resursele procesorului de executat. Cu atât de multe procese în același timp, este nevoie de un conductor pentru a se ocupa de gestionarea lor. Această lucrare se află în mâinile sistemului de operare, care, ca și cum ar fi un sistem de control al traficului într-un oraș mare, este însărcinat cu gestionarea și planificarea diferitelor procese care urmează să fie executate.

Cu toate acestea, procesele software sunt adesea denumite fire de execuție și nu este o definiție proastă dacă luăm în considerare natura lor, dar definiția nu coincide în ambele lumi, deci sunt adesea confuze și acest lucru duce la mai multe neînțelegeri despre modul în care funcționează hardware și software cu mai multe fire. De aceea, în acest articol am decis să apelăm firele proceselor software pentru a le diferenția de cele ale hardware-ului.

Conceptul de balon sau stop într-un procesor

Burbuja Procesos

O balonare sau oprire în execuție are loc atunci când un proces care execută CPU dintr-un anumit motiv nu poate continua, dar nici nu a fost terminat în sistemul de operare. Din acest motiv, sistemele de operare au capacitatea de a suspenda un fir de execuție atunci când CPU-ul nu poate continua și de a atribui lucrarea unui alt nucleu disponibil.

În lumea hardware-ului a apărut la începutul anilor 2000 ceea ce numim multithreading cu Hyperthreading-ul Pentium IV. Trucul a fost duplicarea unității de control a procesorului, care este responsabilă cu capturarea și decodarea. Cu aceasta s-a realizat că sistemul de operare va ajunge să vadă CPU ca și cum ar fi două CPU-uri diferite și a atribuit sarcina celei de-a doua unități de control. Acest lucru nu dublează puterea, dar când CPU-ul în sine s-a blocat într-un fir de execuție, a trecut imediat la celălalt pentru a profita de timpul de nefuncționare care a avut loc și pentru a obține mai multe performanțe de la procesoare.

Multithreading la nivel hardware prin duplicarea unității de control, care este cea mai complexă parte a unui procesor modern, crește complet consumul de energie. Prin urmare, CPU-urile pentru smartphone-uri și tablete nu au hardware multi-threading în CPU-urile lor.

Performanța depinde de sistemul de operare

Procese sistem operativ

Deși CPU-urile pot executa două fire de execuție pe nucleu, sistemul de operare este responsabil pentru gestionarea diferitelor procese. Și astăzi, numărul de procese care rulează pe un sistem de operare este mai mare decât numărul de nuclee pe care un CPU le poate rula simultan.

Prin urmare, deoarece sistemul de operare este însărcinat cu gestionarea diferitelor procese, acesta este și cel însărcinat cu atribuirea acestora. Aceasta este o sarcină foarte ușoară dacă vorbim despre un sistem omogen în care fiecare nucleu are aceeași putere. Dar, într-un sistem total eterogen cu nuclee de puteri diferite, aceasta este o complicație pentru sistemul de operare. Motivul pentru aceasta este că are nevoie de o modalitate de a măsura care este greutatea de calcul a fiecărui proces și acest lucru nu se măsoară doar prin ceea ce ocupă în memorie, ci prin complexitatea instrucțiunilor și algoritmilor.

Saltul către nucleele hibride a avut loc deja în lumea ARM procesoare unde sisteme de operare precum iOS și Android au trebuit să se adapteze la utilizarea nucleelor ​​de diferite performanțe care lucrează simultan. În același timp, unitatea de control a proiectelor viitoare a trebuit să fie și mai complicată în x86. Obiectivul? Că fiecare proces din software este executat în firul corespunzător al hardware-ului și că CPU în sine are mai multă independență în executarea proceselor.

Cum este executarea proceselor pe GPU-uri?

GPU TFLOPS Velocidad

GPU-urile din unitățile lor shader execută, de asemenea, programe, dar programele lor nu sunt secvențiale, mai degrabă fiecare fir de execuție este alcătuit dintr-o instrucțiune și datele sale, care au trei condiții diferite:

  • Datele se găsesc lângă instrucțiune și pot fi executate direct.
  • Instrucțiunea găsește adresa de memorie a datelor și trebuie să aștepte ca datele să ajungă din memorie în registrele unității shader.
  • Datele depind de execuția unui fir de execuție anterior.

Dar a GPU nu rulează un sistem de operare care poate gestiona diferitele fire. Soluția? Toate GPU-urile folosesc un algoritm în planificatorul fiecărei unități shader, echivalentul unității de control. Acest algoritm se numește Round-Robin și constă în acordarea unui timp de execuție în cicluri de ceas fiecărui fir de execuție / instrucțiune. Dacă acest lucru nu a fost rezolvat în acel timp, acesta merge la coadă și se execută următoarea instrucțiune din listă.

Programele shader nu sunt compilate în cod, datorită faptului că există diferențe substanțiale în ISA internă a fiecărui GPU, controlerul este însărcinat cu compilarea și ambalarea diferitelor fire de execuție, dar codul programului este însărcinat cu gestionarea lor. . Deci, este o paradigmă diferită de modul în care procesorul execută diferitele procese.