Subdividimos la tarea por realizar en trozos que se pueden resolver en paralelo. Dichos trozos llamamos procesos. Es decir, un proceso (en nuestro contexto) es
En la literatura, sobre todo en el ámbito de sistemas operativos, existen también los conceptos de hilos (``threads'') y de tareas (``tasks'' o ``jobs'') que son parecidos al concepto de proceso, aún que se distinguen en varios aspectos (por ejemplo, en el acceso a los recursos, en la vista de memoria, en la priorisación etc.). En nuestro contexto no vamos a diferenciar mucho más.
Solo destacamos el concepto de hilo que se usa casi siempre en la programación moderna. Un programa multi-hilo intercala varias secuencias de instrucciones que usan los mismos recursos (sobre todo aprovechan de una memoria común) bajo el techo de un sólo proceso en el sentido de unidad de control del sistema operativo, (que no se debe confundir con nuestro concepto abstracto de proceso). El cambio de contexto de un hilo al siguiente dentro del procesador se realiza rápidamente.
Un programa secuencial consiste en un sólo proceso.
En un programa concurrente trabaja un conjunto de procesos en paralelo los cuales cooperan para resolver un problema o realizar una tarea.
Dichos procesos pueden actuar en hardware diferente, es decir, en un ordenador paralelo, pero también es posible que se ejecuten en un solo procesador mediante de alguna técnica de simulación, por ejemplo, los hilos de Java se ejecutan cuasi-simultanemente en una sola máquina virtual de Java dando a cada hilo cierto tiempo de ejecución según algún algoritmo de planificación adecuado (dicha máquina virtual a su vez puede aprovechar de varios procesadores disponibles en el sistema).
La concurrencia describe un paralelismo potencial para la ejecución del programa.