Se suele distinguir concurrencia
Entre ambos extremos caben muchos granos intermedios.
Una clasificación clásica de ordenadores paralelos es:
No hace falta que los procesos se ejecutan necesariamente en hardware distinto (multi-programación o ``multi-programming''). Se puede aprovechar de la posibilidad de multiplexar varios procesos en un solo procesador (multi-procesamiento o ``multi-processing''). El sistema operativo (muchas veces con la ayuda de hardware específico) realiza la ejecución de varios procesos de forma cuasi-paralelo distribuyendo el tiempo disponible a las secuencias diferentes (``time-sharing system'').
En este caso es imprecindible para el análisis del programa que el mecanismo de conmutación sea independiente del programa concurrente, aunque tome las decisiones a partir de las aplicaciones. En el caso contrario hay que incluir dicho mecanismo en el análisis del programa concurrente. Al desarrollar un programa concurrente, no se debe asumir ningún comportamiento específico del planificador (siendo la unidad que realiza la conmutación de los procesos).
Ejemplo: Ya vimos que si se asume una intercalación perfecta, el algoritmo de multiplicación resulta correcto.
Existen muchos tipos de arquitecturas de ordenadores. Algunas son diseñadas especialmente para la ejecución de programas concurrentes o paralelos (p.ej. los proyectos NYU, SB-PRAM, o Tera).
Sin embargo, no hace falta que se ejecute el programa en unidades similares para obtener concurrencia. La concurrencia está presente también en sistemas heterógenos, p.e., aquellos que solapan el trabajo de entrada y salida con el resto de las tareas (discos duros).
La comunicación y sincronización entre procesos funciona mediante una memoria común (``shared memory'') a la cual pueden acceder todos los procesadores a la vez o mediante el intercambio de mensajes usando una red conectando los diferentes procesadores u ordenadores (``distributed processing'').
Siempre hace falta un tipo de memoria común para realizar la comunicación entre procesos, solamente que en algunos casos dicha memoria no está accesible en forma directa al programador.
También existen mezclas de todo tipo de estos conceptos, p.e., un sistema que use multi-procesamiento con hilos y procesos en cada procesador de un sistema distribuido simulando una memoria común al nivel de la aplicación.