Si definisce algoritmo il procedimento logico seguito per risolvere un determinato problema. Tale algoritmo può essere descritto tramite un opportuno formalismo (chiamato linguaggio di programmazione), in modo da poter essere eseguito su un elaboratore. Tale codifica di un algoritmo, espressa tramite un linguaggio di programmazione è detta programma.
L'esecuzione di un programma può essere di tipo sequenziale, oppure può essere composta da più attività che eseguono in parallelo. In questo secondo caso (programma concorrente), le varie attività che eseguono in parallelo devono essere opportunamente sincronizzate fra loro e necessitano di comunicare e cooperare al fine di portare a termine il proprio scopo. Il modo in cui tali attività concorrenti cooperano e comunicano le distingue fra processi e thread.
I processi sono caratterizzati da un insieme di risorse private, fra cui gli spazi di memoria, per cui un processo non può accedere allo spazio di memoria di un altro per comunicare con esso. Per questo motivo, i processi si sincronizzano e comunicano fra loro tramite scambio di messaggi. Viceversa i thread condividono varie risorse, fra cui lo spazio di memoria, per cui possono comunicare tramite memoria comune, e sincronizzarsi tramite semafori.