1.4. Programes i processos
Els ordinadors executen programes que són llistats d’instruccions que indiquen com processar un conjunt de dades.
Podem dividir els llenguatges de programació entre:
- Baix nivell: assembladors i de màquina. Propers al codi binari.
- Alt nivell: fàcils de llegir i entendre (per exemple, C, PHP, Python o Java).
Així mateix, podem diferenciar els llenguatges d’alt nivell compilats o interpretats.
Un programa escrit amb un llenguatge de programació compilat, per poder executar-se, necessita ser abans processat per un compilador adequat, i traduït a llenguatge màquina (binari). Els compiladors són programes encarregats de dur a terme l’anàlisi lèxica, sintàctica i semàntica del codi. Un cop superada aquesta etapa de verificació, el compilador genera un fitxer objecte que ha de ser enllaçat amb diverses llibreries de funcions del sistema per generar un fitxer executable binari. L’usuari pot executar aquest arxiu quan calgui. La depuració dels programes compilats és costosa, i és rendible només en els casos en què el rendiment òptim d’aquests, en termes de temps d’execució i espai de memòria, és capital.
Per executar tasques més senzilles és possible dissenyar prototips (en anglès, scripts) emprant llenguatges orientats a la producció ràpida de programes, com Perl o Python, llenguatges interpretats. Aquests llenguatges de scripting posseeixen un joc d’instruccions específicament dissenyat per facilitar l’adquisició i tractament de fitxers de text. Els seus intèrprets processen els programes a instrucció, saltant-se d’aquesta manera la creació d’un fitxer binari. A canvi, el seu rendiment, en comparació amb els fitxers executables, és menor.
Un cop l’usuari decideix executar un programa, el SO ha de crear una entitat lògica associada a aquest codi a la qual dotar de recursos suficients per desenvolupar la seva activitat (processador, memòria i accés a dispositius). Aquesta metodologia permet executar de forma concurrent diverses instàncies de la mateixa aplicació sense més inconvenient que els propis de la compartició d’alguns recursos (fàcilment esmenables dins del programa, utilitzant noms únics per als fitxers i altres dispositius).
Atès que només un procés pot estar simultàniament en possessió de la CPU, s’ha de realitzar una planificació òptima per decidir en cada moment a quin procés li correspon el seu ús. Malgrat que la compartició del processador sembla una seriosa limitació, és en realitat un gran avantatge, ja que un procés gasta una fracció important del seu temps esperant per accedir a altres dispositius més lents. Per tant, superposant l’ús de la CPU amb les esperes dels processos s’aconsegueix simular un treball en paral·lel, quan realment només existeix un processador.
Les estacions de treball actuals estan dotades de multiprocessadors, això és, nodes amb dos, quatre o més processadors dins de la mateixa màquina. Gràcies a aquesta ampliació dels recursos disponibles, el SO, mitjançant les llibreries de disseny de programes apropiades, pot fer treballar els seus programes en paral·lel, permetent que determinats fragments d’aquests treballin independentment sobre diferents conjunts de dades en diferents processadors. Cada unitat de codi executable en paral·lel dins del procés rep el nom de fil d’execució (en anglès, thread). En un sistema amb una única CPU, el SO també és capaç de planificar diversos threads per simular paral·lelisme, sempre que la càrrega de treball de la màquina no sigui excessiva.