¿Cuál es la diferencia entre programación concurrente y programación paralela?


346

¿Cuál es la diferencia entre programación concurrente y programación paralela? Le pregunté a google pero no encontré nada que me ayudara a entender esa diferencia. ¿Podrías 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 programa" vs "la ejecución paralela es una propiedad de la máquina" no es suficiente para mí - Todavía no puedo decir qué es qué.


Respuestas:


310

Si su programa usa hilos (programación concurrente), no necesariamente se ejecutará como tal (ejecución paralela), ya que depende de si la máquina puede manejar varios hilos.

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

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

Hilos en una máquina roscada :

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

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


34
La ejecución paralela y la programación paralela no son lo mismo. La respuesta de Jon Harrop es correcta. Pero parece que la pregunta en sí confunde ejecución paralela y programación paralela.
Blaisorblade

3
La capacidad de ejecutar subprocesos en paralelo depende de algo más que la máquina. Por ejemplo, OCaml (y Python?) Ejecuta subprocesos simultáneamente pero no en paralelo debido a un bloqueo global para el recolector de basura.
Jon Harrop

1
La programación paralela no es un subconjunto de programación concurrente, según este blog ; tu respuesta no tiene eso en cuenta, ¿qué opinas sobre esta afirmación?
Kevin

1
@ Kevin: Creo que "más general" significa superconjunto. Estoy de acuerdo en que está mal.
Jon Harrop

1
Esta respuesta es buena para visualizar la diferencia entre la ejecución simultánea y paralela, pero no para la pregunta original del póster sobre programación .
Reorx

396

Programación concurrentese refiere a 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 programas concurrentes son típicamente tanto el rendimiento como la latencia. Los programas concurrentes a menudo están vinculados a E / S pero no siempre, por ejemplo, los recolectores de basura concurrentes están completamente en la CPU. El ejemplo pedagógico de un programa concurrente es un rastreador web. Este programa inicia solicitudes de páginas web y acepta las respuestas simultáneamente a medida 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 programa. Esta característica puede dificultar la depuración de programas concurrentes.Erlang , flujos de trabajo asincrónicos F # y Scala's biblioteca Akka son quizás los enfoques más prometedores para la programación altamente concurrente.

Programación multinúcleoEs un caso especial de programación paralela. La programación paralela se refiere a operaciones que se superponen con el objetivo específico de mejorar el rendimiento. Las dificultades de la programación concurrente se evaden haciendo que el flujo de control sea determinista. Por lo general, los programas generan conjuntos de tareas secundarias que se ejecutan en paralelo y la tarea principal solo continúa una vez que finaliza cada subtarea. Esto hace que los programas paralelos sean mucho más fáciles de depurar que los programas concurrentes. La parte difícil de la programación paralela es la optimización del rendimiento con respecto a problemas como la granularidad y la comunicación. Esto último sigue siendo un problema en el contexto de los multinúcleos porque hay un costo considerable asociado con la transferencia de datos de un caché a otro.Cilk es quizás el enfoque más prometedor para la programación paralela de alto rendimiento en multinúcleos y se ha adoptado tanto en los bloques de creación roscados de Intel como en la biblioteca paralela de tareas de Microsoft (en .NET 4).


18
"La parte difícil de la programación paralela ... como la granularidad y la comunicación". Si las tareas paralelas necesitan comunicarse, ¿eso no las hace concurrentes?
Justin M. Keyes

13
"Si las tareas paralelas necesitan comunicarse, ¿eso no las hace concurrentes?". Wow, gran pregunta! No necesariamente no. Las supercomputadoras a menudo se programan con operaciones paralelas masivas seguidas de una redistribución global de datos y más paralelismo masivo. Entonces, hay paralelismo y comunicación, pero no hay concurrencia real de la que hablar. En este contexto, estaba pensando más en el paralelismo multinúcleo donde la comunicación significa complejidad de caché, por ejemplo, la comunicación requerida para la coherencia de caché. Aunque eso es concurrente, tampoco es directamente visible.
Jon Harrop

43
@BoppityBop Solo porque puedo decir en un dibujo lo que dijo en una novela no hace que mi respuesta sea menos correcta. Simplemente más fácil de leer para aquellos que realmente no saben la respuesta. Lo cual supongo que es el punto de venir aquí. Puede escribir un libro en el idioma utilizado en esta publicación, pero eso será absolutamente absurdo para la mayoría de los lectores, ya que probablemente no buscó en Google esta pregunta si ya sabe la mitad de lo que Jon escribió.
Tor Valamo

18
La imagen fue muy útil para mí, alguien bastante nuevo en el tema, y ​​la descripción de @JonHarrop fue útil para mí, alguien que aprecia el lenguaje correcto, aunque sea técnico. Ambas respuestas contribuyeron a mi comprensión más completa. ¡Todos ganamos! (aunque aprecio la distinción hecha entre ejecución paralela y programación paralela)
Sammaron

3
"Erlang es quizás el próximo idioma más prometedor ...". Interesante elección de palabras, ya que Erlang tiene ~ 30 años y fue de código abierto en 1998.
steinar

151

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

Concurrente = Dos colas y una cafetera.

Paralelo = Dos colas y dos cafeteras.


99
Incorrecto y engañoso. Concurrente = permitir una o más colas (composición no determinista). Paralelo = tener más de una cola para hacer que cualquiera de ellas sea más corta que la original si no está vacía (eficiencia asintótica).
FrankHB

El código concurrente requiere dos o más procesadores (o "máquinas de café"). Por lo tanto, esta respuesta es esencialmente incorrecta.
Geoffrey Anderson el

66
@GeoffreyAnderson No, no lo hace. Por ejemplo, los subprocesos y los procesos se ejecutan simultáneamente en una sola máquina central.
Jon Harrop

@FrankHB: eche un vistazo a stackoverflow.com/a/57223044/1406510 y mire el enlace de origen, en el sitio de Oracle, por lo que no puede estar equivocado, pero nuestro entendimiento puede estarlo. Así que es hora de repensar. Cambié mi punto de vista después de leer eso.
nanosoft

@GeoffreyAnderson: consulte stackoverflow.com/a/57223044/1406510. Contiene un enlace del oráculo y establece claramente qué es qué. Así que necesitamos alinearnos con él.
nanosoft

40

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

En el cómputo concurrente, dos cómputos avanzan independientemente uno del otro. El segundo cálculo no tiene que esperar hasta que finalice el primero para que avance. 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 subprocesamiento múltiple preventivo ).

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

Imágenes del artículo: "Paralelo vs concurrente en Node.js"

suspender y tomar turnos versus computación paralela



21

Creo que la programación concurrente se refiere a la programación multiproceso que consiste en dejar que su programa ejecute múltiples hilos, abstraídos de los detalles del hardware.

La programación paralela se refiere al diseño específico de los algoritmos de su programa para aprovechar la ejecución paralela disponible. Por ejemplo, puede ejecutar en paralelo dos ramas de algunos algoritmos con la expectativa de que alcanzará el resultado antes (en promedio) de lo que lo haría si primero verificara la primera y luego la segunda rama.


2
Para decirlo de otra manera, ejecutar dos cosas en paralelo puede hacer que se hagan el doble de rápido. La ejecución de dos cosas al mismo tiempo aún podría tomar la misma cantidad de tiempo que hacer primero una y luego la otra si sólo hay una CPU posterior reparto de tiempos y vuelta entre la ejecución de un poco de la primera y luego un poco de la segunda, etc.
user189169

14

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

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

T1 puede ejecutarse y finalizar antes de T2, T2 puede ejecutarse y finalizar antes de T1, T1 y T2 pueden ejecutarse simultáneamente en el mismo caso de tiempo (paralelismo), T1 y T2 pueden ejecutarse alternativamente, ... Si dos hilos concurrentes si el SO los programa para ejecutarse en un procesador de un solo núcleo no SMT no CMP, puede obtener concurrencia pero no paralelismo. El paralelismo es posible en sistemas multinúcleo, multiprocesador o distribuidos.

La concurrencia a menudo se conoce como una propiedad de un programa y es un concepto más general que el paralelismo.

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


9

Son dos frases que describen lo mismo desde puntos de vista (muy ligeramente) diferentes. La programació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 programación concurrente es describir las cosas más desde el punto de vista del software: dos o más acciones pueden suceder exactamente al mismo tiempo (simultáneamente).

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

Lo que intentan discutir es el hecho de que una 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 concurrencia fue una ilusión: la CPU cambió entre ejecutar instrucciones de diferentes subprocesos lo suficientemente rápido como para que 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 de esto es una computadora con múltiples CPU, o una CPU con múltiples núcleos, por lo que la máquina está ejecutando instrucciones de múltiples hilos y / o procesos al mismo tiempo; la ejecución de código uno no puede / no tiene ningún efecto en la ejecución de código en el otro.

Ahora el problema: una distinción tan limpia casi nunca ha existido. Los diseñadores de computadoras en realidad son 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, tomaba mucho tiempo (en términos de ciclos de CPU) terminar. En lugar de dejar la CPU inactiva mientras sucedía eso, descubrieron varias formas de permitir que un proceso / hilo realice una solicitud de E / S, y dejar que el código de algún otro proceso / hilo se ejecute en la CPU mientras se completa la solicitud de E / S.

Entonces, mucho antes de que las CPU de varios núcleos se convirtieran en la norma, tuvimos operaciones de múltiples subprocesos que ocurrieron en paralelo.

Sin embargo, esa es solo la punta del iceberg. Hace décadas, las computadoras comenzaron a proporcionar otro nivel de paralelismo también. Nuevamente, siendo 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 desde la misma secuencia al mismo tiempo. Un primer ejemplo que se hizo bastante conocido fue el Control Data 6600. Esta fue (por un margen bastante amplio) la computadora más rápida del mundo cuando se introdujo en 1964, y gran parte de la misma arquitectura básica sigue en uso hoy en día. Rastreaba los recursos utilizados por cada instrucción y tenía un conjunto de unidades de ejecución que ejecutaban instrucciones tan pronto como los recursos de los que dependían estaban disponibles, muy similar al diseño de los procesadores Intel / AMD más recientes.

Pero (como solían decir los comerciales) espera, eso no es todo. 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 subprocesos simultáneamente, utilizando una combinación de algunos recursos que son independientes para cada subproceso y algunos recursos que se comparten entre los subprocesos. 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 los recursos necesarios estén disponibles.

Luego, por supuesto, llegamos a sistemas modernos con múltiples núcleos. Aquí las cosas son obvias, ¿verdad? Tenemos N (en algún lugar entre 2 y 256 más o menos, en este momento) núcleos separados, que pueden ejecutar instrucciones al mismo tiempo, por lo que tenemos un caso claro de paralelismo real: la ejecución de instrucciones en un proceso / hilo no lo hace t afecta la ejecución de instrucciones 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).

Para resumir: los escenarios simples que a las personas les gusta contrastar entre recursos compartidos y recursos independientes prácticamente nunca suceden en la vida real. Con todos los recursos compartidos, terminamos con algo como MS-DOS, donde solo podemos ejecutar un programa a la vez, y tenemos que dejar de ejecutar uno antes de poder ejecutar el otro. Con recursos completamente independientes, tenemos N computadoras que ejecutan MS-DOS (sin siquiera una red para conectarlas) sin capacidad de compartir nada entre ellas (porque si incluso podemos compartir un archivo, bueno, ese es un recurso compartido, un 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 lo son en absoluto) tiene al menos alguna capacidad para llevar a cabo al menos algunas operaciones independientes simultáneamente, y casi cualquier cosa más sofisticada que MS-DOS ha aprovechado eso al menos algun grado.

La división agradable y limpia entre "concurrente" y "paralelo" que a la gente le gusta dibujar simplemente no existe, y casi nunca existe. Lo que a la gente le gusta clasificar como "concurrente" generalmente todavía implica al menos uno y, a menudo, más tipos diferentes 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 usa un recurso que se comparte entre los dos.

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


6
  • Concurrent programminges, en un sentido general, referirse a entornos en los que 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 programminges referirse específicamente a la ejecución simultánea de tareas concurrentes en diferentes procesadores. Por lo tanto, toda la programación paralela es concurrente, pero no toda la programación concurrente es paralela.

Fuente: Programación de PThreads: un estándar POSIX para un mejor multiprocesamiento, Buttlar, Farrell, Nichols


5

En programación, la concurrencia es la composición de procesos que se ejecutan independientemente, 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 independientemente. 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 programa aún puede ser concurrente pero no puede ser paralelo. Por otro lado, un programa concurrente bien escrito podría ejecutarse eficientemente en paralelo en un multiprocesador. Esa propiedad podría ser importante ...
- Rob Pike -

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


El enlace de vimeo no funciona aquí es el enlace de youtube youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

La programación paralela ocurre cuando el código se ejecuta al mismo tiempo y cada ejecución es independiente de la otra. Por lo tanto, generalmente no existe una preocupación por las variables compartidas, y tal porque eso probablemente no sucederá.

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


5

La programación clásica de tareas puede ser serial , paralela o concurrente .

  • Serie : las tareas deben ejecutarse una tras otra en un orden conocido engañado o no funcionará. Suficientemente fácil.

  • Paralelo : las tareas deben ejecutarse al mismo tiempo o no funcionará.

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

    Intenta evitar esto o tendremos lágrimas a la hora del té.

  • Concurrente : no nos importa. Sin embargo, no somos descuidados: lo hemos analizado y no importa; Por lo tanto, podemos ejecutar cualquier tarea utilizando cualquier instalación disponible en cualquier momento. Días felices.

A menudo, la programación disponible cambia en eventos conocidos que llamamos un cambio de estado.

La gente suele pensar que se trata de software, pero en realidad es un concepto de diseño de sistemas que precede a las computadoras; Los sistemas de software fueron un poco lentos en la adopción, muy pocos lenguajes de software incluso intentan abordar el problema. Puede intentar buscar el ocpu del lenguaje de la computadora está interesado, .

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

  • el verbo: lo que estás haciendo (operación o algoritmo)
  • el sustantivo: para qué lo está haciendo (datos o interfaz)
  • cuando - iniciación, horario, cambios de estado
  • cómo - serial, paralelo, concurrente
  • donde: una vez que sabes cuándo suceden las cosas, puedes decir dónde pueden suceder y no antes.
  • ¿Por qué? ¿Es esta la forma de hacerlo? ¿Hay otras formas y, lo que es más importante, una mejor ? ¿Qué pasa si no lo haces?

Buena suerte.


8
Veo gorras por todas partes
Bruno Penteado

10
Esta respuesta es más complicada que los temas de concurrencia y paralelismo juntos.
Kai Sellgren

3

Entendí que la diferencia era:

1) Simultáneo: se ejecuta en tándem con recursos compartidos 2) Paralelo: se ejecuta de lado a lado con diferentes recursos

Por lo tanto, puede tener dos cosas sucediendo al mismo tiempo independientemente una de la otra, incluso si se unen en los puntos (2) o dos cosas que se basan en las mismas reservas a lo largo de las operaciones que se ejecutan (1).


3

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

  • En la computación concurrente, un programa es uno en el que múltiples tareas pueden estar en progreso en cualquier instante.
  • En computación paralela, un programa es aquel en el que múltiples tareas cooperan estrechamente para resolver un problema.

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

Fuente : Introducción a la programación paralela, Peter Pacheco.


1

Fuente de concurrencia y paralelismo

En un proceso multiproceso en un único procesador, el procesador puede cambiar los recursos de ejecución entre subprocesos, lo que resulta en una ejecución concurrente .

En el mismo proceso multiproceso en un entorno multiprocesador de memoria compartida, cada subproceso en el proceso puede ejecutarse en un procesador separado al mismo tiempo, lo que resulta en una ejecución paralela .

Cuando el proceso tiene menos o tantos subprocesos como procesadores, el sistema de soporte de subprocesos junto con el entorno operativo garantiza que cada subproceso se ejecute en un procesador diferente.

Por ejemplo, en una multiplicación matricial que tiene el mismo número de subprocesos y procesadores, cada subproceso (y cada procesador) calcula una fila del resultado.


Esta fuente solo muestra un caso especial de la implementación : una forma especializada de subprocesamiento múltiple. Sí, ni siquiera cubre la historia completa de subprocesos múltiples, por ejemplo, el modelo de subprocesos de espacio de usuario M: N y el papel de la programación de subprocesos. El subprocesamiento es solo una forma especializada de implementación en el sentido de la arquitectura del sistema (SO, VM, CPU con HT habilitado, etc.) y / o la interfaz de programación. Existen más, como el paralelismo a nivel de instrucción en la implementación de una CPU moderna que no expone interfaz de programación y no tiene nada que ver con hilos.
FrankHB

@FrankHB: Le agradecería si pudiera compartir enlaces auténticos sobre su contenido. Realmente me gustaría explorar si hay más. Mi comprensión actual es bastante simplista: ejecutar una aplicación multiproceso en cualquier arquitectura de SO con un mecanismo de programación de subprocesos dado es paralelo o concurrente, ¿es la pregunta? Incluso si le dio el espacio de usuario M: N: ¿cómo se da cuenta de que el RUN es paralelo o concurrente?
nanosoft

He escrito una respuesta para discutir los problemas en diferentes abstracciones.
FrankHB

Ejecutar una aplicación multiproceso es en realidad bastante complejo en comparación con la abstracción básica, ya que "ejecutar" es una acción general adecuada para muchas abstracciones. Hay muchos detalles que deben haber sido complementados por el modelo de subprocesos en la implementación (típicamente, tanto la especificación del lenguaje como la implementación del lenguaje en tiempo de ejecución utilizado para programar la aplicación) en la abstracción básica.
FrankHB

0

Diferentes personas hablan sobre diferentes tipos de concurrencia y paralelismo en muchos casos específicos diferentes, por lo que se necesitan algunas abstracciones para cubrir su naturaleza común.

La abstracción básica se realiza en informática, donde tanto la concurrencia como el paralelismo se atribuyen a las propiedades de los programas . Aquí, los programas son descripciones formalizadas de la informática. Dichos programas no necesitan estar en ningún lenguaje o codificación en particular, que es específico de la implementación. La existencia de API / ABI / ISA / OS es irrelevante para dicho nivel de abstracción. Seguramente se necesitará un conocimiento específico de implementación más detallado (como el modelo de subprocesos) para realizar trabajos de programación concretos, el espíritu detrás de la abstracción básica no cambia.

Un segundo hecho importante es que, como las propiedades generales, la concurrencia y el paralelismo pueden coexistir en muchas abstracciones diferentes .

Para la distinción general, vea la respuesta relevante para la visión básica de concurrencia v. Paralelismo. (También hay algunos enlaces que contienen algunas fuentes adicionales).

La programación concurrente y la programación paralela son técnicas para implementar tales propiedades generales con algunos sistemas que exponen la programabilidad. Los sistemas suelen ser lenguajes de programación y sus implementaciones.

Un lenguaje de programación puede exponer las propiedades previstas por reglas semánticas incorporadas. En la mayoría de los casos, tales reglas especifican las evaluaciones de estructuras de lenguaje específicas (por ejemplo, expresiones) haciendo que el cómputo involucrado sea efectivamente concurrente o paralelo. (Más específicamente, los efectos computacionales implicados en las evaluaciones pueden reflejar perfectamente estas propiedades). Sin embargo, la semántica de lenguaje concurrente / paralelo es esencialmente compleja y no es necesaria para trabajos prácticos (para implementar algoritmos eficientes concurrentes / paralelos como soluciones de problemas realistas). ) Por lo tanto, la mayoría de los lenguajes tradicionales adoptan un enfoque más conservador y simple: suponiendo que la semántica de la evaluación es totalmente secuencial y serial, y luego proporcionan primitivas opcionales para permitir algunosde los cálculos son concurrentes y paralelos. Estas primitivas pueden ser palabras clave o construcciones de procedimiento ("funciones") admitidas por el lenguaje. Se implementan en función de la interacción con los entornos alojados (SO o interfaz de hardware "bare metal"), generalmente opacos (no se pueden derivar utilizando el lenguaje de manera portátil) al idioma. Por lo tanto, en este tipo particular de abstracciones de alto nivel vistas por los programadores, nada es concurrente / paralelo además de estas primitivas "mágicas" y programas que dependen de estas primitivas; los programadores pueden disfrutar de una experiencia de programación menos propensa a errores cuando las propiedades de concurrencia / paralelismo no están tan interesadas.

Aunque las primitivas abstraen el complejo en las abstracciones de más alto nivel, las implementaciones aún tienen la complejidad adicional que no está expuesta por la función del lenguaje. Por lo tanto, se necesitan algunas abstracciones de nivel medio. Un ejemplo típico es el enhebrado . El subproceso permite uno o más subprocesos de ejecución (o simplemente subprocesos ; a veces también se denomina proceso , que no es necesariamente el concepto de una tarea programada en un sistema operativo) compatible con la implementación del lenguaje (el tiempo de ejecución). Por lo general, los subprocesos se programan de manera preventiva, por lo que un subproceso no necesita saber nada sobre otros subprocesos. Por lo tanto, los hilos son naturales para implementar el paralelismo siempre que no compartan nada (los recursos críticos): simplemente descomponga los cálculos en diferentes subprocesos, una vez que la implementación subyacente permite la superposición de los recursos de cálculo durante la ejecución, funciona. Los subprocesos también están sujetos a accesos concurrentes de recursos compartidos: solo acceder a los recursos en cualquier orden cumple con las restricciones mínimas requeridas por el algoritmo, y la implementación eventualmente determinará cuándo acceder. En tales casos, algunas operaciones de sincronización pueden ser necesarias. Algunos lenguajes tratan las operaciones de enhebrado y sincronización como parte de la abstracción de alto nivel y los exponen como primitivos, mientras que otros lenguajes solo fomentan primitivos relativamente más de alto nivel (como futuros / promesas ).

Bajo el nivel de subprocesos específicos del idioma, viene la multitarea del entorno de alojamiento subyacente (generalmente, un sistema operativo). La multitarea preventiva a nivel del sistema operativo se utiliza para implementar (subprocesamiento) multitarea. En algunos entornos como Windows NT, las unidades básicas de programación (las tareas) también son "hilos". Para diferenciarlos con la implementación de los subprocesos del espacio de usuario mencionados anteriormente, se denominan subprocesos del núcleo, donde "núcleo" significa el núcleo del sistema operativo (sin embargo, estrictamente hablando, esto no es del todo cierto para Windows NT; el núcleo "real" es el NT ejecutivo) . Los subprocesos del núcleo no siempre se asignan 1: 1 a los subprocesos del espacio de usuario, aunque la asignación 1: 1 a menudo reduce la mayoría de los gastos generales de la asignación. Dado que los hilos del kernel son pesados ​​(involucrando llamadas al sistema) para crear / destruir / comunicar,hilos verdesen el espacio de usuario para superar los problemas de sobrecarga a costa de la sobrecarga de mapeo. La elección del mapeo depende del paradigma de programación esperado en la abstracción de alto nivel. Por ejemplo, cuando se esperaba que una gran cantidad de hilos de espacio de usuario se ejecutaran simultáneamente (como Erlang ), la asignación 1: 1 nunca es factible.

La base de la multitarea del sistema operativo es la multitarea de nivel ISA proporcionada por el núcleo lógico del procesador. Esta suele ser la interfaz pública de más bajo nivel para programadores. Debajo de este nivel, puede existir SMT . Esta es una forma de subprocesamiento múltiple de bajo nivel implementado por el hardware, pero podría decirse que todavía es algo programable, aunque generalmente solo es accesible por el fabricante del procesador. Tenga en cuenta que el diseño del hardware aparentemente refleja paralelismo, pero también existe un mecanismo de programación concurrente para hacer que los recursos internos del hardware se utilicen de manera eficiente.

En cada nivel de "subprocesamiento" mencionado anteriormente, están involucrados tanto la concurrencia como el paralelismo. Aunque las interfaces de programación varían dramáticamente, todas están sujetas a las propiedades reveladas por la abstracción básica al principio.


0

Solo compartiendo un ejemplo que ayuda a resaltar la distinción:

Programación en paralelo: supongamos que desea implementar el algoritmo de clasificación por fusión . Cada vez que divide el problema en dos subproblemas, puede tener dos hilos que los resuelvan. Sin embargo, para realizar el paso de fusión, debe esperar a que estos dos subprocesos finalicen, ya que la fusión requiere ambas soluciones secundarias. Esta "espera obligatoria" hace de este un programa paralelo.

Programa concurrente: supongamos que desea comprimir n archivos de texto y generar un archivo comprimido para cada uno de ellos. Puede tener desde 2 (hasta n) subprocesos que manejan cada uno comprimiendo un subconjunto de los archivos. Cuando se termina cada subproceso, se acaba de hacer, no tiene que esperar ni hacer nada más. Entonces, dado que las diferentes tareas se realizan de forma intercalada en "cualquier orden arbitrario", el programa es concurrente pero no paralelo.

Como alguien más mencionó, cada programa paralelo es concurrente (tiene que serlo de hecho), pero no al revés.


0

Trataré de explicarlo en mi propio estilo, puede que no sea en términos informáticos, pero te da una idea general.

Tomemos un ejemplo, digamos quehaceres domésticos: limpiar platos, sacar basura, cortar el césped, etc., también tenemos 3 personas (hilos) A, B, C para hacerlos

Simultáneamente: los tres individuos comienzan diferentes tareas independientemente, es decir,

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Aquí, el orden de las tareas es indeterminado y las respuestas dependen de la cantidad de trabajo

Paralelo: aquí, si queremos mejorar el rendimiento, podemos asignar a varias personas a la tarea individual, por ejemplo, limpiar platos, asignamos dos personas, A enjabonar los platos y B lavar los platos, lo que podría mejorar el rendimiento.

limpiando los platos:

A --> soaping the dishes
B --> washing the dishes

pronto

Espero que esto te dé una idea! ahora pase a los términos técnicos que se explican en las otras respuestas;)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.