En informática, la comunicación de procesos secuenciales ( CSP) es un lenguaje formal para describir patrones de interacción en sistemas concurrentes. Es un miembro de la familia de teorías matemáticas de concurrencia conocidas como álgebras de procesos, o cálculos de procesos, basadas en el paso de mensajes a través de canales. CSP fue muy influyente en el diseño del lenguaje de programación occam y también influyó en el diseño de lenguajes de programación como Limbo, RaftLib, Go, Crystal y core.async de Clojure.
La CSP fue descrita por primera vez en un artículo de 1978 por Tony Hoare, pero desde entonces ha evolucionado sustancialmente. CSP se ha aplicado prácticamente en la industria como una herramienta para especificar y verificar los aspectos concurrentes de una variedad de sistemas diferentes, como el Transputer T9000, así como un sistema de comercio electrónico seguro. La teoría de la CSP en sí misma también es todavía objeto de investigación activa, incluido el trabajo para aumentar su rango de aplicabilidad práctica (por ejemplo, aumentar la escala de los sistemas que se pueden analizar de manera manejable).
La versión de CSP presentada en el artículo original de Hoare de 1978 era esencialmente un lenguaje de programación concurrente en lugar de un cálculo de procesos. Tenía una sintaxis sustancialmente diferente a las versiones posteriores de CSP, no poseía una semántica definida matemáticamente y no podía representar el no determinismo ilimitado. Los programas en el CSP original se escribieron como una composición paralela de un número fijo de procesos secuenciales que se comunican entre sí estrictamente a través del paso de mensajes sincrónico. A diferencia de las versiones posteriores de CSP, a cada proceso se le asignó un nombre explícito y el origen o destino de un mensaje se definió especificando el nombre del proceso de envío o recepción previsto. Por ejemplo, el proceso
COPY = *[c:character; west?c → east!c]
recibe repetidamente un carácter del proceso named west
y envía ese carácter al proceso named east
. La composición paralela
[west::DISASSEMBLE || X::COPY || east::ASSEMBLE]
asigna los nombres west
al DISASSEMBLE
proceso, X
al COPY
proceso y east
al ASSEMBLE
proceso, y ejecuta estos tres procesos al mismo tiempo.
Tras la publicación de la versión original de CSP, Hoare, Stephen Brookes y AW Roscoe desarrollaron y refinaron la teoría de CSP en su forma algebraica de proceso moderna. El enfoque adoptado para desarrollar CSP en un álgebra de procesos fue influenciado por el trabajo de Robin Milner sobre el cálculo de sistemas de comunicación (CCS) y viceversa. La versión teórica de CSP se presentó inicialmente en un artículo de 1984 de Brookes, Hoare y Roscoe, y más tarde en el libro de Hoare Communicating Sequential Processes, que se publicó en 1985. En septiembre de 2006, ese libro seguía siendo el tercer libro de ciencias de la computación más citado. referencia de todos los tiempos según Citeseer (aunque una fuente poco fiable debido a la naturaleza de su muestreo). La teoría de la CSP ha sufrido algunos cambios menores desde la publicación del libro de Hoare. La mayoría de estos cambios fueron motivados por la llegada de herramientas automatizadas para el análisis y la verificación de procesos de CSP. The Theory and Practice of Concurrency de Roscoe describe esta nueva versión de CSP.
Una aplicación temprana e importante de CSP fue su uso para la especificación y verificación de los elementos de la INMOS T9000 Transputer, un complejo de procesador segmentado superescalar diseñado para soportar multiprocesamiento a gran escala. Se empleó CSP para verificar la corrección tanto de la canalización del procesador como del Procesador de canal virtual, que administraba las comunicaciones fuera del chip para el procesador.
La aplicación industrial de CSP al diseño de software generalmente se ha centrado en sistemas confiables y críticos para la seguridad. Por ejemplo, el Instituto de Sistemas Seguros de Bremen y Daimler-Benz Aerospace modelaron un sistema de gestión de fallas y una interfaz de aviónica (que consta de aproximadamente 23.000 líneas de código) para su uso en la Estación Espacial Internacional en CSP, y analizaron el modelo para confirmar que su diseño estaba libre de interbloqueo y bloqueo activo. El proceso de modelado y análisis pudo descubrir una serie de errores que habrían sido difíciles de detectar utilizando únicamente las pruebas. Del mismo modo, Praxis High Integrity Systems aplicó el modelado y análisis de CSP durante el desarrollo del software (aproximadamente 100.000 líneas de código) para que una autoridad de certificación de tarjetas inteligentes segura verificara que su diseño era seguro y no estaba bloqueado. Praxis afirma que el sistema tiene una tasa de defectos mucho menor que los sistemas comparables.
Dado que CSP es adecuado para modelar y analizar sistemas que incorporan intercambios de mensajes complejos, también se ha aplicado a la verificación de protocolos de seguridad y comunicaciones. Un ejemplo destacado de este tipo de aplicación es el uso de CSP y el verificador de refinamiento FDR de Lowe's para descubrir un ataque previamente desconocido en el protocolo de autenticación de clave pública Needham-Schroeder y luego desarrollar un protocolo corregido capaz de derrotar el ataque.
Como sugiere su nombre, CSP permite la descripción de sistemas en términos de procesos componentes que operan de forma independiente e interactúan entre sí únicamente a través de la comunicación de paso de mensajes. Sin embargo, la parte "secuencial" del nombre de CSP es ahora un nombre inapropiado, ya que la CSP moderna permite que los procesos de componentes se definan como procesos secuenciales y como la composición paralela de procesos más primitivos. Las relaciones entre los diferentes procesos y la forma en que cada proceso se comunica con su entorno se describen utilizando varios operadores algebraicos de procesos. Usando este enfoque algebraico, se pueden construir fácilmente descripciones de procesos bastante complejas a partir de unos pocos elementos primitivos.
CSP proporciona dos clases de primitivas en su álgebra de procesos:
CSP tiene una amplia gama de operadores algebraicos. Los principales son:
Uno de los ejemplos arquetípicos de CSP es una representación abstracta de una máquina expendedora de chocolate y sus interacciones con una persona que desea comprar chocolate. Esta máquina expendedora podrá realizar dos eventos diferentes, “moneda” y “choc” que representan la inserción del pago y la entrega de un chocolate respectivamente. Una máquina que exige el pago (solo en efectivo) antes de ofrecer un chocolate se puede escribir como:
Una persona que podría optar por utilizar una moneda o una tarjeta para realizar pagos podría modelarse como:
Estos dos procesos se pueden poner en paralelo, para que puedan interactuar entre sí. El comportamiento del proceso compuesto depende de los eventos en los que los dos procesos componentes deben sincronizarse. Por lo tanto,
mientras que si la sincronización solo fuera necesaria en "moneda", obtendríamos
Si abstraemos este último proceso compuesto ocultando los eventos "moneda" y "tarjeta", es decir
obtenemos el proceso no determinista
Este es un proceso que ofrece un evento "choc" y luego se detiene, o simplemente se detiene. En otras palabras, si tratamos la abstracción como una visión externa del sistema (por ejemplo, alguien que no ve la decisión tomada por la persona), se ha introducido el no determinismo.
La sintaxis de CSP define las formas "legales" en las que se pueden combinar procesos y eventos. Sea e un evento y X un conjunto de eventos. Entonces, la sintaxis básica de CSP se puede definir como: