La programación conjunta es el principio por el cual los sistemas concurrentes programan procesos relacionados para que se ejecuten en diferentes procesadores al mismo tiempo (en paralelo ). Existen varias implementaciones específicas para lograrlo.
Si una aplicación consta de una colección de procesos que trabajan en estrecha colaboración y si algunos de los procesos, pero no todos, están programados para su ejecución, los procesos en ejecución pueden intentar comunicarse con los que no se están ejecutando, lo que provocará que se bloqueen. Finalmente, los demás procesos se programarán para su ejecución, pero para ese momento la situación puede revertirse de modo que estos procesos también se bloqueen mientras esperan interacciones con otros. Como resultado, la aplicación avanza a un ritmo de, como máximo, una interacción entre procesos por intervalo de tiempo y tendrá un bajo rendimiento y una alta latencia .
La co-programación consta de dos ideas:
Algunas técnicas de coprogramación presentan fragmentos de procesos que no se ejecutan simultáneamente con el resto del conjunto coprogramado. Estos algoritmos suelen minimizar la aparición de estos fragmentos. La programación en grupo es una variante más estricta de la coprogramación que no permite fragmentos en absoluto.
Los investigadores han clasificado tres tipos de co-programación: co-programación explícita , co-programación local y co-programación implícita o dinámica . [1]
La programación conjunta explícita requiere que todo el procesamiento se realice al mismo tiempo y, por lo general, se implementa mediante una programación global en todos los procesadores. Un algoritmo específico se conoce como programación conjunta .
La programación local permite que los procesadores individuales programen el procesamiento de forma independiente.
La programación conjunta dinámica (o implícita) es una forma de programación conjunta en la que los procesadores individuales aún pueden programar el procesamiento de forma independiente, pero toman decisiones de programación en cooperación con otros procesadores.
El término "coprogramación" fue introducido por Ousterhout (1982). La definición original es que el conjunto de trabajo del proceso debe estar coprogramado (programado para su ejecución simultánea) para que el programa paralelo pueda avanzar .