De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

La computación concurrente es una forma de computación en la que se ejecutan varios cálculos al mismo tiempo, durante períodos de tiempo superpuestos, en lugar de secuencialmente , y uno se completa antes de que comience el siguiente.

Ésta es una propiedad de un sistema, ya sea un programa , una computadora o una red, donde hay un punto de ejecución separado o "hilo de control" para cada proceso. Un sistema concurrente es aquel en el que un cálculo puede avanzar sin esperar a que se completen todos los demás cálculos. [1]

La computación concurrente es una forma de programación modular . En su paradigma un cálculo global se factoriza en subcomputaciones que se pueden ejecutar concurrentemente. Los pioneros en el campo de la computación concurrente incluyen a Edsger Dijkstra , Per Brinch Hansen y CAR Hoare .

Introducción [ editar ]

El concepto de computación concurrente se confunde frecuentemente con el concepto relacionado pero distinto de computación paralela , [2] [3] aunque ambos pueden describirse como "múltiples procesos que se ejecutan durante el mismo período de tiempo ". En la computación paralela, la ejecución ocurre en el mismo instante físico: por ejemplo, en procesadores separados de una máquina multiprocesador , con el objetivo de acelerar los cálculos; la computación en paralelo es imposible en un solo procesador (de un núcleo ), ya que solo uno el cálculo puede ocurrir en cualquier instante (durante cualquier ciclo de reloj). [a] Por el contrario, la computación concurrente consta de tiempos de vida de los procesossuperposición, pero la ejecución no tiene por qué ocurrir en el mismo instante. El objetivo aquí es modelar procesos en el mundo exterior que suceden al mismo tiempo, como que varios clientes accedan a un servidor al mismo tiempo. Estructurar los sistemas de software como compuestos de múltiples partes comunicantes concurrentes puede ser útil para abordar la complejidad, independientemente de si las partes se pueden ejecutar en paralelo. [4] : 1

Por ejemplo, los procesos concurrentes se pueden ejecutar en un núcleo intercalando los pasos de ejecución de cada proceso a través de segmentos de tiempo compartido : solo se ejecuta un proceso a la vez, y si no se completa durante su segmento de tiempo, se pausa , otro proceso comienza o se reanuda, y luego se reanuda el proceso original. De esta manera, varios procesos están a mitad de camino de la ejecución en un solo instante, pero solo se está ejecutando un proceso en ese instante. [ cita requerida ]

Los cálculos simultáneos se pueden ejecutar en paralelo, [2] [5] por ejemplo, asignando cada proceso a un procesador o núcleo de procesador separado, o distribuyendo un cálculo a través de una red. Sin embargo, en general, los lenguajes, herramientas y técnicas para la programación paralela pueden no ser adecuados para la programación concurrente y viceversa. [ cita requerida ]

El momento exacto en que se ejecutan las tareas en un sistema concurrente depende de la programación , y las tareas no siempre deben ejecutarse al mismo tiempo. Por ejemplo, dadas dos tareas, T1 y T2: [ cita requerida ]

  • T1 se puede ejecutar y terminar antes que T2 o viceversa (en serie y secuencial)
  • T1 y T2 se pueden ejecutar alternativamente (en serie y concurrentes)
  • T1 y T2 pueden ejecutarse simultáneamente en el mismo instante de tiempo (paralelo y concurrente)

La palabra "secuencial" se utiliza como antónimo de "concurrente" y "paralelo"; cuando estos se distinguen explícitamente, concurrente / secuencial y paralelo / serie se utilizan como pares opuestos. [6] Un programa en el que las tareas se ejecutan de una en una (en serie, sin paralelismo), sin intercalado (en secuencia, sin concurrencia: ninguna tarea comienza hasta que finaliza la tarea anterior) se denomina programa en serie . Un conjunto de tareas que se pueden programar en serie se puede serializar , lo que simplifica el control de concurrencia . [ cita requerida ]

Coordinar el acceso a los recursos compartidos [ editar ]

El principal desafío en el diseño de programas concurrentes es el control de la concurrencia : garantizar la secuencia correcta de las interacciones o comunicaciones entre diferentes ejecuciones computacionales y coordinar el acceso a los recursos que se comparten entre las ejecuciones. [5] Los problemas potenciales incluyen condiciones de carrera , puntos muertos y escasez de recursos . Por ejemplo, considere el siguiente algoritmo para realizar retiros de una cuenta corriente representada por el recurso compartido balance:

bool  retirar ( int  retiro ){ si  ( saldo  > =  retiro ) { saldo  - =  retiro ; devuelve  verdadero ; }  devolver  falso ;}

Supongamos que balance = 500dos subprocesos simultáneos realizan las llamadas withdraw(300)y withdraw(350). Si la línea 3 en ambas operaciones se ejecuta antes de la línea 5, ambas operaciones encontrarán que se balance >= withdrawalevalúa truey la ejecución procederá a restar el monto del retiro. Sin embargo, dado que ambos procesos realizan sus retiros, el monto total retirado terminará siendo mayor que el saldo original. Este tipo de problemas con recursos compartidos se benefician del uso de control de concurrencia o algoritmos sin bloqueo .

Ventajas [ editar ]

Las ventajas de la computación concurrente incluyen:

  • Mayor rendimiento del programa: la ejecución paralela de un programa concurrente permite que el número de tareas completadas en un tiempo determinado aumente proporcionalmente al número de procesadores de acuerdo con la ley de Gustafson.
  • Alta capacidad de respuesta para entrada / salida: los programas intensivos en entrada / salida esperan principalmente a que se completen las operaciones de entrada o salida. La programación concurrente permite el tiempo que se gastaría esperando para ser utilizado para otra tarea. [ cita requerida ]
  • Estructura de programa más apropiada: algunos problemas y dominios de problemas se adaptan bien a la representación como tareas o procesos concurrentes. [ cita requerida ]

Modelos [ editar ]

Los modelos para comprender y analizar sistemas informáticos concurrentes incluyen:

  • Modelo de actor
    • Modelo de capacidad de objetos para la seguridad
  • Autómata de entrada / salida
  • Memoria transaccional de software (STM)
  • Redes de Petri
  • Procesar cálculos como
    • Cálculo ambiental
    • Cálculo de sistemas de comunicación (CCS)
    • Comunicación de procesos secuenciales (CSP)
    • Cálculo de unión
    • π-cálculo

Implementación [ editar ]

Se pueden usar varios métodos diferentes para implementar programas concurrentes, como implementar cada ejecución computacional como un proceso del sistema operativo , o implementar los procesos computacionales como un conjunto de subprocesos dentro de un solo proceso del sistema operativo.

Interacción y comunicación [ editar ]

En algunos sistemas informáticos concurrentes, la comunicación entre los componentes concurrentes está oculta al programador (por ejemplo, mediante el uso de futuros ), mientras que en otros debe manejarse explícitamente. La comunicación explícita se puede dividir en dos clases:

Comunicación de memoria compartida
Los componentes concurrentes se comunican alterando el contenido de las ubicaciones de la memoria compartida (ejemplificado por Java y C # ). Este estilo de programación concurrente generalmente necesita el uso de alguna forma de bloqueo (por ejemplo, mutex , semáforos o monitores ) para coordinar entre subprocesos. Un programa que implementa correctamente cualquiera de estos se dice que es seguro para subprocesos .
Comunicación de paso de mensajes
Los componentes concurrentes se comunican mediante el intercambio de mensajes (ejemplificados por MPI , Go , Scala , Erlang y occam ). El intercambio de mensajes puede realizarse de forma asíncrona, o puede utilizar un estilo de "encuentro" sincrónico en el que el remitente bloquea hasta que se recibe el mensaje. El paso de mensajes asincrónico puede ser confiable o poco confiable (a veces denominado "enviar y rezar"). La concurrencia de paso de mensajes tiende a ser mucho más fácil de razonar que la concurrencia de memoria compartida y, por lo general, se considera una forma más robusta de programación concurrente. [ cita requerida ]Se encuentra disponible una amplia variedad de teorías matemáticas para comprender y analizar los sistemas de transmisión de mensajes, incluido el modelo de actor y varios cálculos de procesos . El paso de mensajes se puede implementar de manera eficiente a través del multiprocesamiento simétrico , con o sin coherencia de caché de memoria compartida .

La memoria compartida y la simultaneidad de paso de mensajes tienen características de rendimiento diferentes. Normalmente (aunque no siempre), la sobrecarga de memoria por proceso y la sobrecarga de conmutación de tareas es menor en un sistema de paso de mensajes, pero la sobrecarga de paso de mensajes es mayor que para una llamada a procedimiento. Estas diferencias a menudo se ven superadas por otros factores de desempeño.

Historia [ editar ]

La computación concurrente se desarrolló a partir de trabajos anteriores sobre ferrocarriles y telegrafía , del siglo XIX y principios del XX, y algunos términos datan de este período, como los semáforos. Estos surgieron para abordar la cuestión de cómo manejar múltiples trenes en el mismo sistema ferroviario (evitando colisiones y maximizando la eficiencia) y cómo manejar múltiples transmisiones a través de un conjunto dado de cables (mejorando la eficiencia), como mediante la multiplexación por división de tiempo (década de 1870). ).

El estudio académico de los algoritmos concurrentes se inició en la década de 1960, y se le atribuye a Dijkstra (1965) ser el primer artículo en este campo, identificando y resolviendo la exclusión mutua . [7]

Prevalencia [ editar ]

La concurrencia es omnipresente en la informática y se produce desde hardware de bajo nivel en un solo chip hasta redes mundiales. A continuación se ofrecen ejemplos.

A nivel de lenguaje de programación:

  • Canal
  • Coroutine
  • Futuros y promesas

A nivel del sistema operativo:

  • Equipo multitarea , incluyendo tanto la multitarea cooperativa y multitarea preventiva
    • Tiempo compartido , que reemplazó el procesamiento por lotes secuencial de trabajos con el uso concurrente de un sistema
  • Proceso
  • Hilo

A nivel de red, los sistemas en red son generalmente concurrentes por su naturaleza, ya que consisten en dispositivos separados.

Idiomas que admiten la programación simultánea [ editar ]

Los lenguajes de programación concurrentes son lenguajes de programación que utilizan construcciones de lenguaje para la concurrencia . Estas construcciones pueden involucrar subprocesos múltiples , soporte para computación distribuida , transmisión de mensajes , recursos compartidos (incluida la memoria compartida ) o futuros y promesas . A veces, estos lenguajes se describen como lenguajes orientados a la concurrencia o lenguajes de programación orientados a la concurrencia (COPL). [8]

Hoy en día, los lenguajes de programación más utilizados que tienen construcciones específicas para la concurrencia son Java y C # . Ambos lenguajes utilizan fundamentalmente un modelo de simultaneidad de memoria compartida, con bloqueo proporcionado por monitores (aunque los modelos de paso de mensajes pueden y se han implementado sobre el modelo de memoria compartida subyacente). De los lenguajes que utilizan un modelo de concurrencia de paso de mensajes, Erlang es probablemente el más utilizado en la industria en la actualidad. [ cita requerida ]

Muchos lenguajes de programación concurrentes se han desarrollado más como lenguajes de investigación (por ejemplo, Pict ) que como lenguajes para uso en producción. Sin embargo, lenguajes como Erlang , Limbo y occam han tenido un uso industrial en varias ocasiones en los últimos 20 años. Los idiomas en los que la concurrencia juega un papel importante incluyen:

  • Ada: propósito general, con soporte nativo para el paso de mensajes y la simultaneidad basada en monitores
  • Alef: concurrente, con hilos y paso de mensajes, para la programación del sistema en las primeras versiones de Plan 9 de Bell Labs.
  • Alice: extensión al ML estándar , agrega soporte para la concurrencia a través de futuros
  • Ateji PX: extensión a Java con primitivas paralelas inspiradas en el cálculo π
  • Axum : específico de dominio, concurrente, basado en el modelo de actor y .NET Common Language Runtime utilizando una sintaxis similar a C
  • BMDFM: máquina de flujo de datos modular binario
  • C ++ —std :: hilo
  • Cω (C omega): para investigación, extiende C #, usa comunicación asincrónica
  • C #: admite la computación simultánea mediante bloqueo, rendimiento, también desde la versión 5.0 de palabras clave async y await introducidas
  • Clojure : dialecto funcional moderno de Lisp en la plataforma Java
  • Limpieza concurrente : programación funcional, similar a Haskell
  • Colecciones concurrentes (CnC): logra un paralelismo implícito independiente del modelo de memoria al definir explícitamente el flujo de datos y el control
  • Haskell concurrente: lenguaje funcional puro y perezoso que opera procesos concurrentes en la memoria compartida
  • ML concurrente: extensión concurrente de ML estándar
  • Pascal concurrente, por Per Brinch Hansen
  • Curry
  • D : lenguaje de programación de sistema de múltiples paradigmas con soporte explícito para programación concurrente ( modelo de actor )
  • E: utiliza promesas para evitar interbloqueos.
  • ECMAScript: utiliza promesas para operaciones asincrónicas
  • Eiffel —a través de su mecanismo SCOOP basado en los conceptos de Design by Contract
  • Elixir: lenguaje de metaprogramación dinámico y funcional que se ejecuta en Erlang VM.
  • Erlang: utiliza el paso de mensajes asincrónicos sin compartir nada.
  • FAUST : funcional en tiempo real, para el procesamiento de señales, el compilador proporciona paralelización automática a través de OpenMP o un programador de robo de trabajo específico
  • Fortran - coarrays y do concurrent son parte del estándar Fortran 2008
  • Go: para la programación del sistema, con un modelo de programación concurrente basado en CSP
  • Haskell: lenguaje de programación funcional simultáneo y paralelo [9]
  • Hume: funcional, concurrente, para entornos de espacio y tiempo limitados donde los procesos de autómatas se describen mediante patrones de canales síncronos y paso de mensajes.
  • Io: simultaneidad basada en actores
  • Janus : presenta distintos interrogadores y cajeros de variables lógicas, canales de bolsa; es puramente declarativo
  • Java : clase de hilo o interfaz ejecutable
  • Julia - "primitivas de programación concurrente: tareas, espera asíncrona, canales". [10]
  • JavaScript -a través de los trabajadores web , en un entorno de navegador, las promesas y las devoluciones de llamada .
  • JoCaml: basado en canales concurrentes y distribuidos, extensión de OCaml , implementa el cálculo de combinación de procesos
  • Únase a Java , de forma simultánea, basado en el lenguaje Java
  • Joule : basado en el flujo de datos, se comunica mediante el paso de mensajes.
  • Joyce : enseñanza simultánea , basada en Concurrent Pascal con funciones de CSP de Per Brinch Hansen
  • LabVIEW: funciones gráficas, de flujo de datos, son nodos en un gráfico, datos son cables entre los nodos; incluye lenguaje orientado a objetos
  • Limbo: pariente de Alef , para la programación del sistema en Inferno (sistema operativo)
  • MultiLisp : variante de esquema extendida para admitir el paralelismo
  • Modula-2: para programación de sistemas, por N. Wirth como sucesor de Pascal con soporte nativo para corrutinas
  • Modula-3: miembro moderno de la familia Algol con amplio soporte para hilos, mutex, variables de condición
  • Newsqueak —para la investigación, con los canales como valores de primera clase; predecesor de Alef
  • occam: influido en gran medida por la comunicación de procesos secuenciales (CSP)
    • occam-π: una variante moderna de occam , que incorpora ideas del cálculo π de Milner
  • Orc: muy concurrente, no determinista, basado en el álgebra de Kleene
  • Oz-Mozart —multiparadigm, admite la concurrencia de estado compartido y el paso de mensajes, y futuros
  • ParaSail : orientado a objetos, paralelo, sin punteros, condiciones de carrera
  • Pict: esencialmente una implementación ejecutable del cálculo π de Milner
  • Raku incluye clases para hilos, promesas y canales de forma predeterminada [11]
  • Python usando Stackless Python
  • Reia: utiliza el paso de mensajes asincrónicos entre objetos que no comparten nada.
  • Red / System: para la programación del sistema, basado en Rebol
  • Rust: para la programación del sistema, utilizando el paso de mensajes con semántica de movimiento, memoria inmutable compartida y memoria mutable compartida. [12]
  • Scala: propósito general, diseñado para expresar patrones de programación comunes de una manera concisa, elegante y segura para los tipos
  • SequenceL: funcional de propósito general, los principales objetivos de diseño son la facilidad de programación, la legibilidad de la claridad del código y la paralelización automática para el rendimiento en hardware multinúcleo y sin condiciones de carrera.
  • SR — para investigación
  • SuperPascal: concurrente, para la enseñanza, basado en Concurrent Pascal y Joyce por Per Brinch Hansen
  • Unicon: para investigación
  • TNSDL: para desarrollar intercambios de telecomunicaciones, utiliza el paso de mensajes asincrónico
  • Lenguaje de descripción de hardware VHSIC ( VHDL ) —IEEE STD-1076
  • XC : subconjunto de lenguaje C extendido por simultaneidad desarrollado por XMOS , basado en la comunicación de procesos secuenciales , construcciones integradas para E / S programables

Muchos otros lenguajes brindan soporte para la concurrencia en forma de bibliotecas, a niveles aproximadamente comparables con la lista anterior.

Ver también [ editar ]

  • E / S asincrónicas
  • Chu espacio
  • Programación basada en flujo
  • Java ConcurrentMap
  • Lista de publicaciones importantes en computación concurrente, paralela y distribuida
  • Proyecto Ptolomeo
  • Condición de carrera § Computación
  • Gavilla (matemáticas)
  • Procesamiento de transacciones

Notas [ editar ]

  1. ^ Esto está descontando el paralelismo interno a un núcleo de procesador, como la canalización o las instrucciones vectorizadas. Una máquina de un núcleo y un procesadorpuede tener cierto paralelismo, como con un coprocesador , pero el procesador por sí solo no lo es.

Referencias [ editar ]

  1. ^ Novena edición de conceptos de sistema operativo , Abraham Silberschatz. "Capítulo 4: Hilos"
  2. ↑ a b Pike, Rob (11 de enero de 2012). "La concurrencia no es paralelismo". Conferencia de Waza , 11 de enero de 2012. Obtenido de http://talks.golang.org/2012/waza.slide (diapositivas) y http://vimeo.com/49718712 (video).
  3. ^ "Paralelismo frente a simultaneidad" . Wiki de Haskell .
  4. Schneider, Fred B. (6 de mayo de 1997). Sobre programación concurrente . Saltador. ISBN 9780387949420.
  5. ↑ a b Ben-Ari, Mordejai (2006). Principios de programación concurrente y distribuida (2ª ed.). Addison-Wesley. ISBN 978-0-321-31283-9.
  6. ^ Patterson y Hennessy 2013 , p. 503.
  7. ^ "PODC Premio influyente papel: 2002" , Simposio ACM sobre los principios de la computación distribuida , recuperado 2009-08-24
  8. ^ Armstrong, Joe (2003). "Realización de sistemas distribuidos fiables ante la presencia de errores de software" (PDF) .
  9. ^ Marlow, Simon (2013) Programación paralela y concurrente en Haskell: Técnicas para programación multinúcleo y multiproceso ISBN 9781449335946 
  10. ^ https://juliacon.talkfunnel.com/2015/21-concurrent-and-parallel-programming-in-julia Programación simultánea y paralela en Julia
  11. ^ "Simultaneidad" . docs.perl6.org . Consultado el 24 de diciembre de 2017 .
  12. ^ Blum, Ben (2012). "Estado mutable compartido de Typesafe" . Consultado el 14 de noviembre de 2012 .

Fuentes [ editar ]

  • Patterson, David A .; Hennessy, John L. (2013). Organización y diseño de computadoras: la interfaz hardware / software . The Morgan Kaufmann Series in Computer Architecture and Design (5 ed.). Morgan Kaufmann. ISBN 978-0-12407886-4.

Lectura adicional [ editar ]

  • Dijkstra, EW (1965). "Solución de un problema en el control de programación concurrente". Comunicaciones de la ACM . 8 (9): 569. doi : 10.1145 / 365559.365617 . S2CID  19357737 .
  • Herlihy, Maurice (2008) [2008]. El arte de la programación multiprocesador . Morgan Kaufmann. ISBN 978-0123705914.
  • Downey, Allen B. (2005) [2005]. El librito de los semáforos (PDF) . Prensa de té verde. ISBN 978-1-4414-1868-5. Archivado desde el original (PDF) el 4 de marzo de 2016 . Consultado el 21 de noviembre de 2009 .
  • Filman, Robert E .; Daniel P. Friedman (1984). Computación Coordinada: Herramientas y Técnicas para Software Distribuido . Nueva York: McGraw-Hill. pag. 370 . ISBN 978-0-07-022439-1.
  • Leppäjärvi, Jouni (2008). Una encuesta pragmática de orientación histórica sobre la universalidad de las primitivas de sincronización (PDF) . Universidad de Oulu.
  • Taubenfeld, Gadi (2006). Algoritmos de sincronización y programación concurrente . Pearson / Prentice Hall. pag. 433. ISBN 978-0-13-197259-9.

Enlaces externos [ editar ]

  • Medios relacionados con la programación concurrente en Wikimedia Commons
  • Biblioteca virtual de sistemas concurrentes