¿Cuál es la diferencia entre la progtwigción simultánea y la progtwigción paralela?

¿Cuál es la diferencia entre la progtwigción simultánea y la progtwigción en paralelo? Le pregunté a google pero no encontré nada que me ayudara a entender esa diferencia. ¿Podría darme un ejemplo para ambos?

Por ahora encontré esta explicación: http://www.linux-mag.com/id/7411 – pero “la concurrencia es una propiedad del progtwig” vs “la ejecución en paralelo es una propiedad de la máquina” no es suficiente para mí – Todavía no puedo decir qué es qué.

Si progtwig utilizando subprocesos (progtwigción concurrente), no necesariamente se ejecutará como tal (ejecución paralela), ya que depende de si la máquina puede manejar varios subprocesos.

Aquí hay un ejemplo visual. Hilos en una máquina sin rosca:

-- -- -- / \ >---- -- -- -- -- ---->> 

Hilos en una máquina roscada:

  ------ / \ >-------------->> 

Los guiones representan código ejecutado. Como puede ver, ambos se separan y se ejecutan por separado, pero la máquina enhebrada puede ejecutar varias piezas separadas a la vez.

La progtwigción simultánea considera las operaciones que parecen superponerse y se ocupa principalmente de la complejidad que surge debido al flujo de control no determinista. Los costos cuantitativos asociados con los progtwigs concurrentes suelen ser de rendimiento y latencia. Los progtwigs simultáneos a menudo están vinculados a IO, pero no siempre, p. Ej., Los recolectores de basura concurrentes están completamente en la CPU. El ejemplo pedagógico de un progtwig simultáneo es un rastreador web. Este progtwig inicia las solicitudes de páginas web y acepta las respuestas al mismo tiempo que los resultados de las descargas están disponibles, acumulando un conjunto de páginas que ya han sido visitadas. El flujo de control no es determinista porque las respuestas no se reciben necesariamente en el mismo orden cada vez que se ejecuta el progtwig. Esta característica puede dificultar la depuración de progtwigs concurrentes. Algunas aplicaciones son fundamentalmente concurrentes, por ejemplo, los servidores web deben manejar las conexiones de los clientes al mismo tiempo. Erlang es quizás el lenguaje más prometedor para la progtwigción altamente concurrente.

La progtwigción en paralelo se refiere a las operaciones que se superponen para el objective específico de mejorar el rendimiento. Las dificultades de la progtwigción concurrente se eluden al hacer que el control sea determinista. Normalmente, los progtwigs crean conjuntos de tareas secundarias que se ejecutan en paralelo y la tarea primaria solo continúa una vez que ha finalizado cada subtarea. Esto hace que los progtwigs paralelos sean mucho más fáciles de depurar. La parte más difícil de la progtwigción paralela es la optimización del rendimiento con respecto a problemas tales como la granularidad y la comunicación. Este último sigue siendo un problema en el contexto de las multinúcleas porque existe un costo considerable asociado con la transferencia de datos de una memoria caché a otra. La multiplicación matricial-matriz densa es un ejemplo pedagógico de progtwigción paralela y se puede resolver de manera eficiente utilizando el algoritmo de división y conquista de Straasen y atacando los sub-problemas en paralelo. Cilk es quizás el lenguaje más prometedor para la progtwigción paralela de alto rendimiento en computadoras con memoria compartida (incluidas las multinúcleas).

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Concurrente = Dos colas y una máquina de café.

Paralelo = Dos colas y dos cafeteras.

Interpretando la pregunta original como computación paralela / concurrente en lugar de progtwigción .

En el cómputo concurrente, dos cálculos avanzan independientemente el uno del otro. El segundo cálculo no tiene que esperar hasta que el primero haya terminado para avanzar. Sin embargo, no establece el mecanismo de cómo se logra esto. En la configuración de un solo núcleo, se requiere suspender y alternar entre subprocesos (también llamado multirresidido preventivo ).

En computación paralela, dos cálculos avanzan simultáneamente , es decir, literalmente al mismo tiempo. Esto no es posible con una sola CPU y, en su lugar, requiere una configuración de múltiples núcleos.

suspendiendo y tomando turnos versus computación paralela

De acuerdo con: “Parallel vs Concurrent in Node.js” .

Creo que la progtwigción simultánea se refiere a la progtwigción multiproceso, que consiste en dejar que su progtwig ejecute varios hilos, excluidos de los detalles del hardware.

La progtwigción paralela se refiere específicamente al diseño de los algoritmos de su progtwig para aprovechar la ejecución paralela disponible. Por ejemplo, puede ejecutar en paralelo dos twigs de algunos algoritmos con la expectativa de que golpeará el resultado antes (en promedio) de lo que sería si primero verificara el primero y luego el segundo.

En vista del procesador, se puede describir con esta imagen

En vista del procesador, se puede describir con esta imagen

En vista del procesador, se puede describir con esta imagen

Encontré este contenido en algún blog. Pensé que es útil y relevante.

Concurrencia y paralelismo NO son lo mismo. Dos tareas T1 y T2 son concurrentes si el orden en el que las dos tareas se ejecutan en el tiempo no está predeterminado,

T1 puede ejecutarse y finalizar antes de que T2, T2 se ejecuten y finalicen antes de que T1, T1 y T2 puedan ejecutarse simultáneamente en la misma instancia de tiempo (paralelismo), T1 y T2 se pueden ejecutar alternativamente, … Si dos hilos concurrentes el SO está progtwigdo para ejecutarse en un procesador de núcleo único no SMT que no sea CMP, puede obtener concurrencia pero no paralelismo. El paralelismo es posible en sistemas multinúcleo, multiprocesador o distribuidos.

La simultaneidad a menudo se denomina propiedad de un progtwig, y ​​es un concepto más general que el paralelismo.

Fuente: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming

En la progtwigción, la concurrencia es la composición de procesos de ejecución independiente, mientras que el paralelismo es la ejecución simultánea de cálculos (posiblemente relacionados).
– Andrew Gerrand –

Y

La concurrencia es la composición de cálculos que se ejecutan de forma independiente. La concurrencia es una forma de estructurar el software, particularmente como una forma de escribir código limpio que interactúa bien con el mundo real. No es paralelismo.

La concurrencia no es paralelismo, aunque permite el paralelismo. Si solo tiene un procesador, su progtwig aún puede ser simultáneo pero no puede ser paralelo. Por otro lado, un progtwig simultáneo bien escrito podría ejecutarse eficientemente en paralelo en un multiprocesador. Esa propiedad podría ser importante …
– Rob Pike –

Para comprender la diferencia, recomiendo ver este video de Rob Pike (uno de los creadores de Golang). ‘La concurrencia no es paralelismo’

la progtwigción paralela ocurre cuando el código se está ejecutando al mismo tiempo y cada ejecución es independiente de la otra. Por lo tanto, generalmente no hay una preocupación sobre las variables compartidas y eso porque no sucederá.

Sin embargo, la progtwigción simultánea consiste en que el código se ejecute mediante diferentes procesos / hilos que comparten variables y tal, por lo tanto, en la progtwigción concurrente debemos establecer algún tipo de regla para decidir qué proceso / hilo ejecuta primero, queremos esto para estar seguros de que ser consecuentes y que podamos saber con certeza qué sucederá. Si no hay control y todos los subprocesos calculan en el mismo momento y almacenan cosas en las mismas variables, ¿cómo sabremos qué esperar al final? Tal vez un hilo es más rápido que el otro, tal vez uno de los hilos incluso se detuvo en el medio de su ejecución y otro continuó un cálculo diferente con una variable corrupta (aún no completamente calculada), las posibilidades son infinitas. Es en estas situaciones que normalmente usamos progtwigción concurrente en lugar de paralela.

Son dos frases que describen lo mismo desde puntos de vista (muy ligeramente) diferentes. La progtwigción paralela describe la situación desde el punto de vista del hardware: hay al menos dos procesadores (posiblemente dentro de un solo paquete físico) trabajando en un problema en paralelo. La progtwigción simultánea describe cosas más desde el punto de vista del software: dos o más acciones pueden suceder exactamente al mismo tiempo (concurrentemente).

El problema aquí es que las personas están tratando de usar las dos frases para dibujar una distinción clara cuando ninguna realmente existe. La realidad es que la línea divisoria que intentan dibujar ha sido borrosa e indistinta durante décadas, y se ha vuelto cada vez más indistinta con el tiempo.

Lo que están tratando de discutir es el hecho de que alguna vez, la mayoría de las computadoras tenían una sola CPU. Cuando ejecutó múltiples procesos (o subprocesos) en esa única CPU, la CPU solo estaba ejecutando realmente una instrucción de uno de esos subprocesos a la vez. La aparición de simultaneidad era una ilusión: la CPU cambiaba entre ejecutar instrucciones de diferentes hilos lo suficientemente rápido como para la percepción humana (a la que algo menos de 100 ms parece instantáneo) parecía que estaba haciendo muchas cosas a la vez.

El contraste obvio a esto es una computadora con varias CPU, o una CPU con varios núcleos, por lo que la máquina está ejecutando instrucciones de múltiples hilos y / o procesos al mismo tiempo; el código que ejecuta uno no puede / no tiene ningún efecto en la ejecución del código en el otro.

Ahora el problema: una distinción tan clara casi nunca ha existido. Los diseñadores de computadoras son realmente bastante inteligentes, por lo que notaron hace mucho tiempo que (por ejemplo) cuando necesitabas leer algunos datos de un dispositivo de E / S como un disco, transcurrió mucho tiempo (en términos de ciclos de CPU) para terminar. En lugar de dejar la CPU inactiva mientras ocurría eso, descubrieron varias formas de permitir que un proceso / hilo realizara una solicitud de E / S, y dejar que el código de otro proceso / subproceso se ejecutara en la CPU mientras se completaba la solicitud de E / S.

Por lo tanto, mucho antes de que las CPU multinúcleo se convirtieran en la norma, tuvimos operaciones de múltiples hilos que ocurrían en paralelo.

Aunque eso es solo la punta del iceberg. Décadas atrás, las computadoras también comenzaron a proporcionar otro nivel de paralelismo. Una vez más, al ser personas bastante inteligentes, los diseñadores de computadoras notaron que, en muchos casos, tenían instrucciones que no se afectaban entre sí, por lo que era posible ejecutar más de una instrucción de la misma secuencia al mismo tiempo. Un primer ejemplo que se hizo bastante conocido fue el Control Data 6600. Este fue (por un margen bastante amplio) la computadora más rápida en la tierra cuando se introdujo en 1964, y gran parte de la misma architecture básica sigue en uso en la actualidad. Rastreó los recursos utilizados por cada instrucción, y tenía un conjunto de unidades de ejecución que ejecutaba las instrucciones tan pronto como estaban disponibles los recursos de los que dependían, muy similar al diseño de los procesadores Intel / AMD más recientes.

Pero (como decían los comerciales) espera, eso no es todo. Todavía hay otro elemento de diseño para agregar aún más confusión. Se le han dado varios nombres diferentes (por ejemplo, “Hyperthreading”, “SMT”, “CMP”), pero todos se refieren a la misma idea básica: una CPU que puede ejecutar múltiples hilos simultáneamente, usando una combinación de algunos recursos que son independientes para cada hilo y algunos recursos que se comparten entre los hilos. En un caso típico, esto se combina con el paralelismo de nivel de instrucción descrito anteriormente. Para hacer eso, tenemos dos (o más) conjuntos de registros arquitectónicos. Luego tenemos un conjunto de unidades de ejecución que pueden ejecutar instrucciones tan pronto como estén disponibles los recursos necesarios. Estos a menudo se combinan bien porque las instrucciones de las transmisiones separadas casi nunca dependen de los mismos recursos.

Luego, por supuesto, llegamos a sistemas modernos con múltiples núcleos. Aquí las cosas son obvias, ¿verdad? Tenemos N (entre 2 y 256 o más, por el momento) núcleos separados, que pueden ejecutar instrucciones al mismo tiempo, por lo que tenemos un claro caso de paralelismo real: ejecutar instrucciones en un proceso / thread doesn ‘ afecto las instrucciones de ejecución en otro.

Especie de. Incluso aquí tenemos algunos recursos independientes (registros, unidades de ejecución, al menos un nivel de caché) y algunos recursos compartidos (generalmente al menos el nivel más bajo de caché, y definitivamente los controladores de memoria y el ancho de banda a la memoria).

En resumen: los escenarios simples que a las personas les gusta contrastar entre los recursos compartidos y los recursos independientes prácticamente nunca ocurren en la vida real. Con todos los recursos compartidos, terminamos con algo así como MS-DOS, donde solo podemos ejecutar un progtwig a la vez, y tenemos que dejar de ejecutar uno antes de que podamos ejecutar el otro en absoluto. Con recursos completamente independientes, tenemos N computadoras que ejecutan MS-DOS (sin siquiera una red para conectarlas) sin posibilidad de compartir nada entre ellas (porque si podemos compartir un archivo, bueno, ese es un recurso compartido, violación de la premisa básica de que nada se comparte).

Cada caso interesante implica una combinación de recursos independientes y recursos compartidos. Cada computadora razonablemente moderna (y muchas que no son para nada modernas) tiene al menos alguna capacidad para llevar a cabo al menos algunas operaciones independientes al mismo tiempo, y casi cualquier cosa más sofisticada que MS-DOS se ha aprovechado de eso al menos algun grado.

La agradable y limpia división entre “concurrente” y “paralelo” que a las personas les gusta dibujar simplemente no existe, y casi nunca lo ha hecho. Lo que a la gente le gusta clasificar como “concurrente” usualmente todavía involucra al menos uno y a menudo más diferentes tipos de ejecución paralela. Lo que les gusta clasificar como “paralelo” a menudo implica compartir recursos y (por ejemplo) un proceso que bloquea la ejecución de otro mientras se usa un recurso compartido entre los dos.

Las personas que intentan establecer una clara distinción entre “paralelo” y “concurrente” viven en una fantasía de computadoras que nunca existieron realmente.

Entendí la diferencia de ser:

1) Simultáneo: ejecutándose en tándem utilizando recursos compartidos 2) Paralelo: ejecutándose uno al lado del otro utilizando diferentes recursos

De modo que puede tener dos cosas al mismo tiempo independientes una de la otra, incluso si se unen en puntos (2) o dos cosas que se basan en las mismas reservas en todas las operaciones que se están ejecutando (1).

1. Definiciones:

La progtwigción clásica de tareas puede ser SERIAL , PARALLEL o CONCURRENT

SERIAL: análisis muestra que las tareas DEBEN ejecutarse una después de la otra en una secuencia de secuencia conocida o no funcionará .

Es decir: lo suficientemente fácil, podemos vivir con esto

PARALLEL: análisis muestra que las tareas DEBEN ejecutarse al mismo tiempo O no funcionarán .

  • Cualquier falla en cualquiera de las tareas, funcionalmente o en el tiempo, dará como resultado una falla total del sistema.
  • Todas las tareas deben tener un sentido común de tiempo confiable.

Es decir: trate de evitar esto o tendremos lágrimas por la hora del té.

CONCURRENT. El análisis muestra que NO NECESITAMOS CUIDADO . No somos descuidados, lo hemos analizado y no importa; por lo tanto, podemos ejecutar cualquier tarea utilizando cualquier recurso disponible en cualquier momento.

Es decir: DÍAS FELICES


A menudo, la progtwigción disponible cambia en eventos conocidos a los que llamé cambio de estado.


2. Esto no es un {Software | Progtwigción} Característica, pero un enfoque de Diseño de Sistemas :

La gente a menudo piensa que se trata de software, pero de hecho es un concepto de diseño de sistemas que es anterior a las computadoras

Los sistemas de software fueron un poco lentos en la adopción, muy pocos lenguajes de software siquiera intentan abordar el problema.

Puede intentar buscar el idioma de occam si está interesado en un buen bash.

( occam tiene muchas características principalmente innovadoras (si no insuperables), incluido soporte de lenguaje explícito para los constructores de ejecución de PAR y SER code-parts que otros lenguajes sufren principalmente de tener en la era posterior de Matrices de Procesadores Paralelos Masivos disponibles en los últimos años, reinventando la rueda InMOS Transputers utilizada hace más de 35 años (!!!))


3. Qué buen diseño de sistemas se ocupa de cubrir:

De manera sucinta, el diseño de sistemas aborda lo siguiente:

EL VERBO – ¿Qué estás haciendo? ( operación o algoritmo )

EL SUSTANTIVO – ¿A qué te lo estás haciendo? ( Datos o interfaz )

CUANDO – Inicio, progtwig, cambios de estado, SERIAL , PARALLEL , CONCURRENT

DÓNDE – Una vez que sabes cuándo suceden las cosas, puedes decir dónde pueden pasar y no antes.

¿POR QUÉ? ¿Es esta una manera de hacerlo? ¿Hay otras formas? ¿Hay una mejor manera?

.. y por último pero no menos importante … ¿QUÉ SUCEDE SI NO LO HACES?


4. Ejemplos visuales de enfoques PARALELOS vs. SERIALES :

Arquitecturas Parallel recientes disponibles en 2014 en acción en matrices de 16-, 64-, 1024-paralelo RISC uP-s

Cuarto de siglo atrás – una parte de la verdadera historia paralela con el video de demostración de la CPU Inmos Transputer de principios de la década de 1990

Buena suerte

  • Concurrent programming es, en un sentido general, para referirse a entornos en los cuales las tareas que definimos pueden ocurrir en cualquier orden. Una tarea puede ocurrir antes o después de otra, y algunas o todas las tareas se pueden realizar al mismo tiempo.

  • Parallel programming se refiere específicamente a la ejecución simultánea de tareas concurrentes en diferentes procesadores. Por lo tanto, toda la progtwigción paralela es concurrente, pero no toda la progtwigción simultánea es paralela.

Fuente: PThreads Programming – Un estándar POSIX para un mejor multiprocesamiento, Buttlar, Farrell, Nichols

Aunque no hay un acuerdo completo sobre la distinción entre los términos paralelos y concurrentes , muchos autores hacen las siguientes distinciones:

  • En la informática concurrente, un progtwig es aquel en el que múltiples tareas pueden estar en progreso en cualquier momento.
  • En computación paralela, un progtwig es aquel en el que múltiples tareas cooperan estrechamente para resolver un problema.

Por lo tanto, los progtwigs paralelos son concurrentes, pero un progtwig como un sistema operativo multitarea también es concurrente, incluso cuando se ejecuta en una máquina con un solo núcleo, ya que varias tareas pueden estar en progreso en cualquier momento.

Fuente : Una introducción a la progtwigción paralela, Peter Pacheco