En informàtica, un fil d'execució (thread en anglès) és la unitat més petita de processament que pot ser programada pels sistemes operatius, i que permet a un procés executar diferents tasques al mateix temps. Cada fil té un procés que ha de ser executat. Aquesta característica dona la possibilitat al programador de dissenyar un programa que executi diferents funcions concurrentment.

La tècnica de programació amb fils d'execució s'anomena multifil (multithreading en anglès) i permet simplificar el disseny d'aplicacions concurrents i millorar el rendiment de la creació de processos. Cadascun dels fils accedix a unes dades, quan una d'aquestes és utilitzada per dos o més fils es diu que la dada està en conflicte. Cada fil té una secció on s'accedix a estes variables, la qual s'anomena secció crítica. Tots el fils s'executen concurrentment. Aquesta característica és possible gràcies als canvis de context.

Un procés amb dos fils d'execució.

Els canvis de context es produeixen quan un fil que està al processador és eliminat i entra un altre. Fent canvis de context molt ràpidament donem la sensació de què tots els fils s'executen simultàniament.

En els sistemes multifil tipus de sistemes, un mateix procés pot estar format per múltiples fils d'execució. Els diferents fils que formen part d'un mateix procés, comparteixen certs recursos com l'espai de memòria, els arxius oberts, els permisos, etc. En canvi, cada fil consta de les seves pròpies instruccions, la seva pròpia pila d'execució, s'executen a diferents velocitats (cada fil té el seu propi registre PC) i tenen el seu propi estat d'execució.

Els fils d'execució, també són coneguts com a processos lleugers. L'origen del nom rau en el fet que els fils d'execució consumeixen menys recursos de sistema que els processos.

La majoria de llenguatges de programació moderns, disposen de llibreries específiques per tal de programar amb fils i altres com C o C++ han d'utilitzar les crides de sistema que donen aquest suport.

Un parell d'exemples típics on s'utilitzen fils són:

  • Aplicacions gràfiques: Un fil s'encarrega de la interfície gràfica d'usuari mentrestant un altre realitza les operacions.
  • Aplicacions client/servidor: el servidor crea múltiples fils per tal de donar servei a múltiples clients alhora.

En sistemes POSIX hi ha 2 llibreries per a treballar amb fils d'execució:

Exemple de fils d'execució en Linux modifica

Els fils d'execució no són processos en si, sinó que formen part d'un procés. Es pot dir que tots els fils d'execució d'un procés són germans perquè comparteixen el mateix procés. Podem observar aquest fet utilitzant l'ordre ps quan una aplicació que utilitza fils com Firefox s'està executant:

$ ps ax|grep firefox
6952 ? Sl 11:39 /usr/lib/firefox-3.0.4/firefox
...

Com podeu veure només hi ha un procés, però múltiples fils d'execució (que es poden mostrar amb l'opció H):

$ ps axH|grep firefox
6952 ? Sl 11:13 /usr/lib/firefox-3.0.4/firefox
6952 ? Sl 0:02 /usr/lib/firefox-3.0.4/firefox
6952 ? Sl 0:19 /usr/lib/firefox-3.0.4/firefox
6952 ? Sl 0:00 /usr/lib/firefox-3.0.4/firefox
6952 ? Sl 0:00 /usr/lib/firefox-3.0.4/firefox
6952 ? Sl 0:02 /usr/lib/firefox-3.0.4/firefox
24872 pts/6 S+ 0:00 grep firefox

Els fils s'identifiquen per la l de la columna STAT, i com podeu veure formen part tots del mateix procés(amb identificador de procés 6952)

Vegeu també modifica