La concurrencia se refiere a la capacidad de un sistema de ejecutar múltiples tareas mediante ejecución simultánea o compartiendo el tiempo (cambio de contexto), compartiendo recursos y gestionando interacciones. La concurrencia mejora la capacidad de respuesta, el rendimiento y la escalabilidad en la informática moderna, incluyendo: [1] [2] [3] [4] [5]
La concurrencia es un concepto más amplio que abarca varias ideas relacionadas, entre ellas: [1] [2] [3] [4] [5]
Debido a que los cálculos en un sistema concurrente pueden interactuar entre sí mientras se ejecutan, la cantidad de posibles rutas de ejecución en el sistema puede ser extremadamente grande y el resultado puede ser indeterminado . El uso concurrente de recursos compartidos puede ser una fuente de indeterminación que genere problemas como bloqueos y escasez de recursos . [7]
El diseño de sistemas concurrentes a menudo implica encontrar técnicas confiables para coordinar su ejecución, intercambio de datos, asignación de memoria y programación de ejecución para minimizar el tiempo de respuesta y maximizar el rendimiento . [8]
La teoría de la concurrencia ha sido un campo de investigación activo en la informática teórica . Una de las primeras propuestas fue el trabajo seminal de Carl Adam Petri sobre las redes de Petri a principios de los años 1960. En los años posteriores, se ha desarrollado una amplia variedad de formalismos para modelar y razonar sobre la concurrencia.
Se han desarrollado varios formalismos para modelar y comprender sistemas concurrentes, entre ellos: [9]
Algunos de estos modelos de concurrencia están pensados principalmente para respaldar el razonamiento y la especificación, mientras que otros pueden utilizarse durante todo el ciclo de desarrollo, incluidos el diseño, la implementación, la prueba, las pruebas y la simulación de sistemas concurrentes. Algunos de ellos se basan en el paso de mensajes , mientras que otros tienen diferentes mecanismos de concurrencia.
La proliferación de diferentes modelos de concurrencia ha motivado a algunos investigadores a desarrollar formas de unificar estos diferentes modelos teóricos. Por ejemplo, Lee y Sangiovanni-Vincentelli han demostrado que se puede utilizar un modelo denominado "tagged-signal" para proporcionar un marco común para definir la semántica denotacional de una variedad de diferentes modelos de concurrencia, [11] mientras que Nielsen, Sassone y Winskel han demostrado que la teoría de categorías se puede utilizar para proporcionar una comprensión unificada similar de diferentes modelos. [12]
El teorema de representación de concurrencia en el modelo de actor proporciona una forma bastante general de representar sistemas concurrentes que están cerrados en el sentido de que no reciben comunicaciones del exterior. (Otros sistemas de concurrencia, por ejemplo, los cálculos de procesos se pueden modelar en el modelo de actor utilizando un protocolo de confirmación de dos fases . [13] ) La denotación matemática denotada por un sistema cerrado S se construye con aproximaciones cada vez mejores a partir de un comportamiento inicial llamado ⊥ S utilizando una progresión de función de aproximación de comportamiento S para construir una denotación (que significa ) para S de la siguiente manera: [14]
De esta manera, S puede caracterizarse matemáticamente en términos de todos sus posibles comportamientos.
Se pueden utilizar varios tipos de lógica temporal [15] para ayudar a razonar sobre sistemas concurrentes. Algunas de estas lógicas, como la lógica temporal lineal y la lógica de árbol de cálculo , permiten realizar afirmaciones sobre las secuencias de estados por las que puede pasar un sistema concurrente. Otras, como la lógica de árbol de cálculo de acciones, la lógica de Hennessy-Milner y la lógica temporal de acciones de Lamport , construyen sus afirmaciones a partir de secuencias de acciones (cambios de estado). La principal aplicación de estas lógicas es la redacción de especificaciones para sistemas concurrentes. [7]
La programación concurrente abarca lenguajes de programación y algoritmos utilizados para implementar sistemas concurrentes. La programación concurrente suele considerarse [ ¿por quién? ] como más general que la programación paralela porque puede implicar patrones arbitrarios y dinámicos de comunicación e interacción, mientras que los sistemas paralelos generalmente [ ¿según quién? ] tienen un patrón de comunicaciones predefinido y bien estructurado. Los objetivos básicos de la programación concurrente incluyen la corrección , el rendimiento y la robustez . Los sistemas concurrentes como los sistemas operativos y los sistemas de gestión de bases de datos generalmente están diseñados [¿ por quién? ] para funcionar indefinidamente, incluida la recuperación automática de fallas, y no terminar inesperadamente (ver Control de concurrencia ). Algunos [ ejemplo necesario ] sistemas concurrentes implementan una forma de concurrencia transparente, en la que las entidades computacionales concurrentes pueden competir y compartir un solo recurso, pero las complejidades de esta competencia y compartición están protegidas del programador.
Debido a que utilizan recursos compartidos, los sistemas concurrentes en general [ ¿según quién? ] requieren la inclusión de algún tipo de [ ejemplo necesario ] árbitro en algún lugar de su implementación (a menudo en el hardware subyacente), para controlar el acceso a esos recursos. El uso de árbitros introduce la posibilidad de indeterminación en el cálculo concurrente , lo que tiene importantes implicaciones para la práctica, incluida la corrección y el rendimiento. Por ejemplo, el arbitraje introduce un no determinismo ilimitado que plantea problemas con la verificación de modelos porque causa una explosión en el espacio de estados e incluso puede hacer que los modelos tengan un número infinito de estados.
Algunos modelos de programación concurrente incluyen coprocesos y concurrencia determinista . En estos modelos, los hilos de control ceden explícitamente sus porciones de tiempo, ya sea al sistema o a otro proceso.
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )