multithreading - procesos - ¿Concurrencia no es paralelismo?
programacion multihilo python (1)
Lo que significa Rob Pike
Cuando tiene en mente la forma abstracta de un algoritmo, debe elegir si lo implementará con Message Passing o Shared Memory o quizás Hybrid. También deberá considerar el tipo de acceso a la memoria (NUMA, UMA, etc.) y la Topología utilizada (Hipercubo, Toro, Anillo, Malla, Árbol, etc.)
Esto parece mucho trabajo para alguien que solo quiere algo, tal vez incluso simple, hecho de manera paralela (por ejemplo, paralelo para).
Y es mucho trabajo, especialmente si cambia la topología (para que pueda tener todas sus ventajas).
Así que escribe el código paralelo (ya sea simple o complejo) y la máquina virtual o compilador elegirá lo que parece ser la mejor manera de hacerlo, ¡ incluso ejecutándolo de una manera secuencial! (Un ejemplo sería la biblioteca paralela de tareas para .net)
Importante EDITAR:
Debo mencionar que estoy hablando de la concurrencia en un programa / algoritmo y no entre programas independientes que se ejecutan en un sistema.
Tu dijiste eso
Es bien entendido que la concurrencia es la descomposición de un problema complejo en componentes más pequeños. Si no puede dividir correctamente algo en partes más pequeñas, es difícil resolverlo utilizando la concurrencia
pero es incorrecto porque los componentes más pequeños pueden depender entre sí de forma secuencial para completarse, por lo que incluso si se divide en componentes pequeños, no significa que se logre concurrencia / paralelismo.
En todas mis clases de algoritmos paralelos y distribuidos (tanto en BS como en MS) nunca hablamos de " concurrencia que obtuvimos y ahora veamos cómo obtener el paralelismo ". Si usa la palabra concurrencia para describir y algoritmo, implica paralelismo y viceversa.
En la literatura también encontrarás una delgada línea entre distribuida y paralela.
Desde un punto de vista algorítmico, puede utilizar la concurrencia, el paralelismo y la distribución, y se obtiene la misma idea.
Desde el punto de vista de la implementación, si dice "paralelismo", por lo general desea un programa que se ejecuta en la computadora local o en un clúster (comunicación de memoria compartida) y "distribuido" cuando ejecuta el programa en una cuadrícula (comunicación de paso de mensajes) .
Ahora, tanto distribuido como paralelismo implican concurrencia.
Creo que debería ser más escéptico sobre el significado preciso de estos términos porque incluso en la literatura (y hablo de personas que realmente contribuyeron a este campo y no solo de la creación de algún lenguaje) se utilizan para expresar el concepto abstracto.
La concurrencia en un algoritmo (ya sea un programa) significa tener piezas de código que pueden ejecutarse independientemente de otras piezas de código, incluso si eventualmente esperarán otras piezas de código (verifique la Ley de Amdahl para ver exactamente la implicación de esto).
Entonces, siempre que tenga concurrencia en un algoritmo / programa, también tiene paralelismo.
Creo que es mejor simplemente implementar algunos algoritmos paralelos Y distribuidos para entender mejor la idea detrás de esto. Si conoce C / C ++, puede usar OpenMPI para implementaciones distribuidas (Message Passing) y OpenMP para implementaciones paralelas (memoria compartida).
EDITAR:
También podría referirse a la concurrencia como el principio abstracto y paralela a la forma en que se implementa [memoria compartida, paso de mensajes, híbrido entre ambos; Tipo de acceso a memoria (numa, uma, etc)].
Here hay diapositivas de Rob Pike sobre esto. Cada vez que paso por esto me siento como un imbécil. No soy capaz de entender la esencia de esto. Es bien entendido que la concurrencia es la descomposición de un problema complejo en componentes más pequeños. Si no puede dividir correctamente algo en partes más pequeñas, es difícil resolverlo utilizando la concurrencia.
Pero no hay mucho detalle en las diapositivas sobre cómo obtener el paralelismo una vez que haya alcanzado la concurrencia. En la diapositiva de la lección (núm. 52), dice Concurrencia - "Tal vez incluso paralelo". Pero la pregunta es: ¿ cuándo y cómo la concurrencia puede llevar al paralelismo de manera correcta y eficiente?
Mi conjetura es que, bajo el capó, Rob está señalando que los desarrolladores deberían trabajar en el nivel de concurrencia, y el paralelismo debería ser una preocupación del lenguaje / vm (¿gomaxprocs?). Solo preocuparse por la descomposición inteligente en unidades más pequeñas, preocupado solo por la concurrencia correcta, el "sistema" se encargará del paralelismo.
Por favor, arrojar algo de luz.