En ciencias de la computación, concurrencia se refiere a la habilidad de distintas partes de un programa, algoritmo, o problema de ser ejecutado en desorden o en orden parcial, sin afectar el resultado final. Los cálculos (operaciones) pueden ser ejecutados en múltiples procesadores, o ejecutados en procesadores separados físicamente o virtualmente en distintos hilos de ejecución. Un sin número de modelos matemáticos han sido desarrollados para cálculos de la concurrencia en general incluyendo redes de Petri, procesos Calculi, el modelo máquina de accesos random en paralelo, el Modelo Actor y el Lenguaje Reo.
También concurrente significa un evento que ocurre con cierta regularidad.
Como los procesos en un sistema concurrente pueden interactuar entre ellos mismos mientras se están ejecutando, el número de posibles rutas de ejecución en el sistema puede ser extremadamente grande, y el resultado final puede ser indeterminado. El concurrente uso de recursos compartidos puede ser una fuente de indeterminación dirigida a asuntos como bloqueo mutuo e inanición (starvation).[1]
El diseño de sistemas concurrentes a menudo implican la búsqueda de técnicas confiables para coordinar su ejecución, el intercambio de información, asignación de memoria, y una ejecución programada para minimizar el tiempo de respuesta y maximizar el rendimiento o (cantidad de datos que se pueden transmitir por un canal u otro dispositivo de entrada).[2]
La teoría de la concurrencia ha sido un campo activo de investigación en Ciencias de la Computación. En una de las primeras propuestas el trabajo de Carl Adam Petri fue un paso inicial en los inicios de los 60'. Desde esos tiempos una amplia variedad de formalismos han sido desarrollados para dar ejemplos y razonar sobre la concurrencia.
Una serie de formalismos para ejemplificar y comprender sistemas concurrentes han sido desarrollados, incluyendo. [3]
Algunos de estos ejemplos de concurrencia están ante todo con la intención de sostener el razonamiento y la especificación, mientras otros pueden ser usados a través de todo el ciclo de desarrollo, incluyendo diseño, implementación, comprobación, experimentación y simulación de sistemas concurrentes. Algunos de estos están basados en el paso de mensajes mientras otros tiene diferente mecanismos para la concurrencia.
La proliferación de diferentes modelos de concurrencia ha motivado a algunos investigadores o científicos a unificar estos modelos teóricos. Por ejemplo, Lee y Sangiovanni-Vincentelli han demostrado que la entonces llamada "tagged-signal" puede ser usada para proporcionar un marco de trabajo común para definir el denotational semantics de una variedad de modelos de concurrencia diferentes,[5] mientras Nielsen, Sassone, and Winskel han demostrado que category theory puede ser usada para proporcionar un entendimiento similar al de los diferentes modelos.[6]
El teorema de la representación concurrente en el Modelo Actor proporciona una manera para representar los problemas concurrentes que están cercanos en el sentido de que no reciben comunicación del exterior. (Otros sistemas concurrentes, ejemplo: process calculi puede ser modelado en el Modelo Actor usando a two-phase commit protocol.[7])
En este sentido, S puede ser matemáticamente caracterizado en términos de todos sus posibles comportamientos.
Varios tipos de lógicas temporales[8] pueden ser usados para ayudar a razonar sobre los sistemas concurrentes. Algunas lógicas como la lógica temporal lineal y la lógica de árboles computacionales permiten decidir por cuales estados puede pasar el sistema concurrente. La principal meta de estas lógicas es en la escritura de especificaciones para los sistemas concurrentes.
La programación concurrente envuelve lenguajes de programación y algoritmos usados para implementar los sistemas concurrentes. La programación concurrente es considerada más general que la programación paralela porque puede envolver comunicación de patrones dinámicamente. Los sistemas paralelos siempre tienen un sistema de comunicación bien construido. La meta final de la programación concurrente incluye exactitud, rendimiento y robustez. Sistemas concurrentes como los Sistemas Operativos y sistemas de manejo de bases de datos están generalmente diseñados para operar indefinidamente, incluyendo recuperación automática de las fallas, y no terminar su ejecución inesperadamente. Algunos sistemas concurrentes implementan una concurrencia transparente, en el cual las entidades de concurrencia computacional por un único recurso compartido, pero las complejidades de las mismas están escondidas del programador.
Como ellas usan recursos compartidos, los sistemas concurrentes en general requieren la inclusión de un tipo de arbiter en algún lugar en la implementación (normalmente en el hardware), para controlar los accesos a esos recursos. El uso arbitrario introduce la posibilidad de indeterminacy in concurrent computation que tiene mayores implicaciones en la práctica, incluyendo la correctitud y el rendimiento.
Algunos modelos de programación concurrente incluyen coprocesses y deterministic concurrency. En estos modelos, hilos de control explícitamente mantienen esos pequeños espacios de tiempos, ya sea al sistema o a otro proceso.