El crecimiento simultáneo de la disponibilidad de big data y del número de usuarios simultáneos en Internet ejerce una presión especial sobre la necesidad de llevar a cabo tareas informáticas «en paralelo», o de forma simultánea. La computación paralela y distribuida se da en muchas áreas temáticas diferentes de la informática, como los algoritmos, la arquitectura de ordenadores, las redes, los sistemas operativos y la ingeniería de software. A principios del siglo XXI se produjo un crecimiento explosivo en el diseño de multiprocesadores y otras estrategias para que las aplicaciones complejas se ejecuten más rápidamente. La computación paralela y distribuida se basa en conceptos de sistemas fundamentales, como la concurrencia, la exclusión mutua, la consistencia en la manipulación del estado/memoria, el paso de mensajes y los modelos de memoria compartida.
Crear un multiprocesador a partir de una serie de CPUs individuales requiere enlaces físicos y un mecanismo de comunicación entre los procesadores para que puedan operar en paralelo. Los multiprocesadores estrechamente acoplados comparten la memoria y, por tanto, pueden comunicarse almacenando información en la memoria accesible para todos los procesadores. Los multiprocesadores poco acoplados, incluidas las redes informáticas, se comunican enviándose mensajes entre sí a través de los enlaces físicos. Los informáticos han investigado varias arquitecturas de multiprocesadores. Por ejemplo, se examinan las posibles configuraciones en las que se pueden enlazar cientos o incluso miles de procesadores para encontrar la geometría que permita el rendimiento más eficiente del sistema. Una topología muy estudiada es la del hipercubo, en la que cada procesador está conectado directamente a un número fijo de vecinos: dos para el cuadrado bidimensional, tres para el cubo tridimensional y, de forma similar, para los hipercubos de mayor dimensión. Los informáticos también investigan métodos para realizar cálculos en estas máquinas multiprocesadoras (por ejemplo, algoritmos para aprovechar al máximo la arquitectura y técnicas para evitar conflictos en la transmisión de datos). El software residente en la máquina que hace posible el uso de una determinada máquina, en particular su sistema operativo, es parte integrante de esta investigación.
La concurrencia se refiere a la ejecución de más de un procedimiento al mismo tiempo (quizás con el acceso de datos compartidos), ya sea de forma verdaderamente simultánea (como en un multiprocesador) o en un orden intercalado imprevisible. Los lenguajes de programación modernos, como Java, incluyen tanto la encapsulación como características denominadas «hilos» que permiten al programador definir la sincronización que se produce entre los procedimientos o tareas concurrentes.
Dos cuestiones importantes en el control de la concurrencia se conocen como deadlocks y race conditions. El bloqueo se produce cuando un recurso retenido indefinidamente por un proceso es solicitado por otros dos o más procesos simultáneamente. Como resultado, ninguno de los procesos que solicitan el recurso puede continuar; están bloqueados, esperando que el recurso sea liberado. Un sistema operativo puede manejar esta situación con varias técnicas de prevención o de detección y recuperación. Una condición de carrera, por otro lado, ocurre cuando dos o más procesos concurrentes asignan un valor diferente a una variable, y el resultado depende de qué proceso asigna la variable primero (o último).
Prevenir los bloqueos y las condiciones de carrera es fundamentalmente importante, ya que asegura la integridad de la aplicación subyacente. Una estrategia general de prevención se llama sincronización de procesos. La sincronización requiere que un proceso espere a que otro complete alguna operación antes de continuar. Por ejemplo, un proceso (un escritor) puede estar escribiendo datos en una determinada área de memoria principal, mientras que otro proceso (un lector) puede querer leer datos de esa área. El lector y el escritor deben estar sincronizados para que el escritor no sobrescriba los datos existentes hasta que el lector los haya procesado. Del mismo modo, el lector no debe empezar a leer hasta que los datos se hayan escrito en el área.
Con la llegada de las redes, la computación distribuida se hizo factible. Una computación distribuida es aquella que es llevada a cabo por un grupo de ordenadores conectados que trabajan de forma cooperativa. Este tipo de computación suele requerir un sistema operativo distribuido para gestionar los recursos distribuidos. Las preocupaciones más importantes son el reparto de la carga de trabajo, que intenta aprovechar el acceso a múltiples ordenadores para completar los trabajos más rápidamente; la migración de tareas, que apoya el reparto de la carga de trabajo distribuyendo eficientemente los trabajos entre las máquinas; y la replicación automática de tareas, que se produce en diferentes sitios para una mayor fiabilidad.