2010-02-07 15 views
9

Actualmente estoy escribiendo un gran programa C++ de múltiples hilos (> 50K LOC).¿Alguna vez se han utilizado procesos secuenciales de comunicación en programas grandes C++ de múltiples hilos?

Como tal, me he sentido motivado a leer muchas técnicas para manejar código de subprocesos múltiples. Una de las teorías que he encontrado para ser muy interesante es:

http://en.wikipedia.org/wiki/Communicating_sequential_processes

Y es inventado por un hombre poco conocido, que ha hecho otras contribuciones no triviales a la programación concurrente.

Sin embargo, ¿se usa CSP en la práctica? ¿Alguien puede señalar cualquier aplicación grande escrita en un estilo CSP?

Gracias!

+2

lol @ 50k loc ser grandes –

+0

[PySCP] (http://code.google .com/p/pycsp /) parece una implementación práctica viable de CSP. Algunos ejemplos están incluidos. Aunque, por el momento, se dice que se usa solo con fines educativos. – spacediver

Respuesta

8

CSP, como cálculo de proceso, es fundamentalmente una cuestión teórica que nos permite formalizar y estudiar algunos aspectos de un programa paralelo.

Si por el contrario desea una teoría que permite construir programas distribuidos, entonces usted debe echar un vistazo a parallel structured programming.

programación estructural paralelo es la base de la investigación HPC actual (computación de alto rendimiento) y proporciona a usted una metodología sobre la forma de abordar y programas paralelos de diseño (esencialmente, diagramas de flujo de la comunicación de los nodos de computación) y sistemas de tiempo de ejecución a los implementa.

Una idea central en la programación estructurada en paralelo es esqueleto algorítmico, desarrollado inicialmente por Murray Cole. Un esqueleto es algo así como un patrón de diseño paralelo con un modelo de costo asociado y (generalmente) un sistema de tiempo de ejecución que lo admite. Un esqueleto modelos, estudio y admite una clase de algoritmos paralelos que tienen una cierta "forma".

Como un ejemplo notable, mapreduce (popularizada por Google) es sólo una especie de esqueleto que se ocupan de paralelismo de datos, donde un cálculo puede ser descrito por una mapa fase (aplicar una función f para todos los elementos que componer los datos de entrada) y reducir la fase (tomar todos los elementos transformados y "combinarlos" usando un operador asociativo +).

La idea de la programación estructurada paralela me pareció útil tanto en el aspecto teórico como en el práctico, por lo que le sugiero echarle un vistazo.

Una palabra sobre multi-threading: dado que los esqueletos abordan el paralelismo masivo, generalmente se implementan en memoria distribuida en lugar de compartirse. Intel ha desarrollado una herramienta, TBB, que se ocupa de la multiproceso y (parcialmente) sigue el marco de programación estructurado en paralelo. Es una biblioteca C++, por lo que probablemente solo pueda comenzar a utilizarla en sus proyectos.

+1

Lo curioso es que CSP ahora es el mecanismo simultáneo más popular que se usa en la programación :) – nXqd

0

Este estilo es omnipresente en Unix, donde muchas herramientas están diseñadas para procesar desde estándar hasta estándar. No tengo ningún conocimiento de primera mano de los sistemas grandes que se construyen de esa manera, pero he visto muchos sistemas pequeños que son

por ejemplo, esta línea de comando simple utiliza (al menos) 3 procesos.

cat list-1 list-2 list-3 | sort | uniq > final.list 
+0

Sí, pero la tubería no está entre procesos, no entre subprocesos como los que el OP está preguntando. – Omnifarious

+0

El documento con el que se vincula es sobre procesos. –

+2

CSP como teoría no se preocupa por la distinción entre hilos y programas. La pregunta tal como está formulada sigue siendo válida: ¿se usa la teoría de CSP en la práctica, en programas de subprocesos múltiples? – MSalters

0

Este sistema sólo es de tamaño moderado, pero escribió un procesador de protocolo que despoja de e interpreta sucesivas capas de protocolo en un mensaje que utiliza un estilo muy similar a este. Era un sistema orientado a eventos que usaba algo parecido al enhebrado cooperativo, pero podría haber usado multihilo bastante fácilmente con un par de ajustes adicionales.

El programa es propietario (desafortunadamente) por lo que no puedo mostrar el código fuente.

En mi opinión, este estilo es útil para algunas cosas, pero por lo general se combina mejor con algunas otras técnicas. A menudo hay una parte central de su programa que representa un cuello de botella de procesamiento, y la aplicación de varias técnicas de aumento de concurrencia es probable que produzca las mayores ganancias.

0

Microsoft tenía una tecnología llamada ActiveMovie (si mal no recuerdo) que procesaba secuencialmente las transmisiones de audio y video. Los datos pasaron de un filtro a otro para pasar de formato de entrada a salida (y fuente/sumidero). Tal vez ese es un ejemplo práctico?

+0

en realidad, un subproceso se utiliza para enviar datos a lo largo de toda la cadena de filtros. –

6

Sí y no. La idea básica de CSP se usa bastante. Por ejemplo, las colas seguras para subprocesos de una forma u otra se utilizan con frecuencia como mecanismo de comunicación principal (a menudo solamente) para crear una interconexión de procesos individuales (subprocesos).

Hoare siendo Hoare, sin embargo, hay bastante más en su teoría original que eso. Inventó una notación para hablar sobre los procesos, definió un conjunto específico de señales que pueden enviarse entre los procesos, y así sucesivamente. Desde entonces, la notación se ha perfeccionado de varias maneras, se ha trabajado bastante para probar varios aspectos, y así sucesivamente.

La aplicación de ese modelo relativamente formal de CSP (en comparación con solo la idea general) es mucho menos común. Se ha utilizado en algunos sistemas en los que se consideraba que la alta fiabilidad era extremadamente importante, pero pocos programadores parecen interesados ​​en aprender (otra más) en notación de diseño formal.

Cuando he diseñado sistemas como este, generalmente he usado un enfoque que es menos riguroso, pero (al menos para mí) más fácil de entender: un diagrama bastante simple, con cuadros que representan los procesos y flechas que representan las líneas de comunicación. Dudo que realmente pueda ofrecer mucho en el camino de una prueba sobre la mayoría de los diseños (y admitiré que no he diseñado realmente un gran sistema de esta manera), pero no obstante funcionó razonablemente bien.

0

El artículo de Wikipedia me parece como una gran cantidad de símbolos divertidos utilizados para representar conceptos algo peatonales. Para programas muy grandes o extensibles, el formalismo puede ser muy importante para verificar cómo se les permite a los (sub) procesos interactuar.

Para un programa de clase de línea de 50,000, probablemente será mejor que lo haga como mejor le parezca.

En general, seguir ideas como estas es una buena idea en términos de rendimiento. Los hilos persistentes que procesan datos en etapas tenderán a no contender, y explotarán bien la ubicación de los datos. Además, es fácil estrangular los hilos para evitar que los datos se acumulen, ya que una etapa rápida alimenta a una etapa lenta: simplemente bloquea la rápida si su buffer de salida crece demasiado.

3

Eche un vistazo al sitio web de una empresa llamada Verum. Su tecnología ASD se basa en CSP y es utilizada por compañías como Philips Healthcare, Ericsson y semiconductores NXP para crear software para todo tipo de equipos y aplicaciones de alta tecnología.

Para responder a su pregunta: Sí, CSP se utiliza en proyectos de software grandes en la vida real.

La revelación completa: hago el trabajo independiente para Verum

0

Un poco fuera de tema, pero para mi tesis utilicé un marco herramienta llamada TERRA/LUNA que tiene como objetivo para el desarrollo de software para sistemas de control embebido, pero se utiliza en gran medida para todas las clases del desarrollo de software en mi instituto (así que solo uso académico aquí). TERRA es un editor gráfico de CSP y arquitectura de software y LUNA es el nombre de una biblioteca C++ para construcciones basadas en CSP y el complemento que encontrará en TERRA para generar código C++ a partir de sus modelos CSP. Resulta muy útil en combinación con FDR3 (un comprobador de refinamiento de CSP) para detectar cualquier tipo de bloqueo (muerto/vida/etc.) o incluso creación de perfiles.

0

respuesta a una pregunta muy antigua, sin embargo, parece importante que uno

No es Go donde CSP son una parte fundamental de la lengua. En el FAQ to Go, los autores escriben:

La simultaneidad y la programación de subprocesos múltiples tienen una reputación de dificultad. Creemos que esto se debe en parte a diseños complejos como pthreads y en parte a un énfasis excesivo en detalles de bajo nivel como mutexes, variables de condición y barreras de memoria. Las interfaces de nivel superior permiten un código mucho más simple, incluso si todavía hay mutexes y otros bajo las cubiertas.

Uno de los modelos más exitosos para proporcionar soporte lingüístico de alto nivel para la concurrencia proviene de los Procesos secuenciales de comunicación de Hoare o CSP. Occam y Erlang son dos idiomas bien conocidos que se derivan de CSP. Las primitivas de concurrencia de Go derivan de una parte diferente del árbol genealógico cuya contribución principal es la poderosa noción de canales como objetos de primera clase. La experiencia con varios idiomas anteriores ha demostrado que el modelo de CSP encaja bien en un marco de lenguaje de procedimientos.

Los proyectos ejecutados en Go son:

Cuestiones relacionadas