




Se conoce por programación concurrente a la rama de la informática que trata de las técnicas de programación que se usan para expresar el paralelismo entre tareas y para resolver los problemas de comunicación y sincronización entre procesos.
La concurrencia aparece cuando dos o más procesos son contemporáneos. Un caso particular es el paralelismo (programación paralela). Los procesos pueden “competir” o colaborar entre sí por los recursos del sistema. Por tanto, existen tareas de colaboración y sincronización. Se encarga del estudio de las nociones de ejecución concurrente, así como sus problemas de comunicación y sincronización.
El principal problema de la programación concurrente corresponde a no saber en qué orden se ejecutan los programas (en especial los programas que se comunican). Se debe tener especial cuidado en que este orden no afecte el resultado de los programas.
se encarga del estudio de las nociones de ejecución concurrente, así como sus problemas de comunicación y sincronización. se pueden “repartir” entre procesadores o gestionar en un único procesador según importancia. cuya solución es más fácil utilizando esta metodología.
Los sistemas operativos multitarea, como Windows o UNIX, se encargan de que varios programas se puedan ejecutar a la vez (concurrentemente) incluso cuando sólo se dispone de una única CPU. Dos tareas se dice que son concurrentes si transcurren durante el mismo intervalo de tiempo
Existen sistemas inherentemente concurrentes: los sistemas reactivos Aparte de esta motivación existen otras dos motivaciones principales, que de hecho fueron anteriores en el tiempo a la utilización de la programación concurrente para la construcción de sistemas reactivos: Explotación de arquitecturas paralelas para obtener ganancia en la velocidad de ejecución (Programación Paralela). Mejorar la utilización del procesador (Sistemas Operativos).
Programa: Conjunto de sentencias/instrucciones que se ejecutan secuencialmente. Se asemeja al concepto de clase dentro de la POO. Es por tanto un concepto estático.
Proceso: Básicamente, se puede definir como un programa en ejecución. Líneas de código en ejecución de manera dinámica. Se asemeja al concepto de objeto en POO.
Hace referencia a las técnicas de programación que son utilizadas para expresar la concurrencia entre tareas y solución de los problemas de comunicación y sincronización entre procesos. Es la ejecución simultánea de múltiples tareas interactivamente. Estas tareas pueden ser un conjunto de procesos o hilos de ejecución creados por un único programa. Las tareas se pueden ejecutar en una sola CPU (multiprogramación), en varios procesadores, o en una red de computadores distribuidos.
La programación concurrente no es más que la forma en la cual podemos resolver ciertas problemáticas de forma concurrente, es decir, ejecutando múltiples tareas a la misma vez y no de forma secuencial. En un programa concurrente las tareas puede continuar sin la necesidad que otras comiencen o finalicen.
▪
Hacer un mejor uso de los procesadores de computadora
Ahora las CPU son de múltiples núcleos y cada vez más núcleos Si un programa es multiproceso, puede utilizar varios núcleos de la CPU para realizar operaciones. Cuantos más núcleos de la CPU, más rápido se puede ejecutar.
▪
Velocidad de respuesta más rápida
El subproceso múltiple permite ejecutar una serie de operaciones simultáneamente, lo que puede mejorar la velocidad de respuesta del programa. Por ejemplo, cuando un usuario realiza un pedido, incluye insertar datos del pedido, generar una instantánea del pedido, enviar un correo electrónico para notificar al vendedor y registrar la cantidad de bienes vendidos.
▪
La programación concurrente se consideró al comienzo del diseño de Java y proporcionó un modelo de programación consistente. Los programadores que usan Java pueden enfocarse más en su negocio sin tener que considerar cómo usar el multiproceso.
✓ Permite optimizar el uso de recursos en sistemas mono/multiprocesador.
✓ Fiable administración de los datos en sistemas con gran información
✓ Mejor aprovechamiento de la CPU
✓ Permite el desarrollo de aplicaciones que no se vean afectadas en tiempo real
✓ Permite compartir recursos entre tareas lentas y tareas rápidas para que las tareas lentas no retrasen mucho a las rápidas.
✓ Velocidad de ejecución.
✓ Menores tiempos de respuesta
✓ Permite la implementación de programación reactiva
✓ Controlabilidad
✓ Disponibilidad de servicios
✓ Seguridad
✓ Consumos de recursos cuando hay excesos de hilos o procesos
✓ Dificultad de desarrollo
✓ Dificultad de verificación.
✓ En programas con pocas instrucciones en más lento
✓ Si se aplica mal puede llevar a resultados erróneos.
Es concurrente si posee las estructuras necesarias para definir y manejar diferentes tareas (hilos de ejecución) dentro de un programa. El compilador y el SO serán los responsables de “mapear” la concurrencia lógica del programa sobre el hardware disponible.
▪
Existe más de un procesador y varias unidades (hilos) de un mismo programa se ejecutan realmente de forma simultánea.
▪
Asumir la existencia de varios procesadores, aunque no existan físicamente El implementador de tareas del lenguaje se encargará de “mapear” la concurrencia lógica sobre el hardware realmente disponible.
La concurrencia lógica es más general, pues el diseño del programa no está condicionado por los recursos de computación disponibles
.
El paralelismo requiere un soporte físico: varios procesadores. La concurrencia es el caso general y el paralelismo un caso particular. La concurrencia (y el paralelismo) se refiere a la ejecución de código: Hay procesos concurrentes y flujos concurrentes.
Este puede llegar a ser uno de los puntos que más interés puede llegar a causar en los programadores y con justa razón, ya que son términos que pueden llegar a confundirse fácilmente, es por ello que es necesario aprender a diferenciarlos.
La concurrencia es una forma de estructurar una solución que puede ser paralelizable (Aunque no siempre).
Concurrencia:
o Soporta dos o más acciones en progreso
o Procesos que se ejecutan de manera independiente
o Lidiar con muchas cosas al tiempo
o Sobre la estructura
Paralelismo:
o Soporta dos o más acciones ejecutándose simultáneamente
o Procesos que se ejecutan Simultáneamente (tal vez relacionados)
o Hacer muchas cosas al tiempo
o Sobre la ejecución
Existen tres formas de
un
un lenguaje concurrente (Ada,
de un sistema
(UNIX,
en
de
(DIS-ADA, MMS,
Además,
sobre la MV de Erlang y aprovecha esto para construir sistemas distribuidos y
para construcción de API's y para optimización en el desarrollo web. Es utilizado en muchos frameworks como Hedwig, para la implementación de chatbots en distntas redes sociales y demás. Elixir presenta ejecución por hilos (referida como procesos) en un ambiente en los cuáles múltiples procesos pueden comunicarse unos con otra vía mensajes
a fallos con baja latencia. Es
Ada es un lenguaje nacido de un proyecto en los 70s del ejército de los Estados Unidos, el cuál tenía como principal requisito la seguridad, es decir, se tenía que tener un lenguaje con nula cantidad de errores. El lenguaje es usado de forma amplia en la industria de las infraestructuras de riesgo grande, como lo es sistemas de aviones, trenes, tanques y misiles. Es fuertemente tipado, uno de los más tipados, debido a la necesidad explicita de minimizar los errores. Ha tenido relativamente pocas actualizaciones.
Rust es un lenguaje de programación compilado, de propósito general y multiparadigma desarrollado por Mozilla y ha sido diseñado para ser ‘un lenguaje seguro, concurrente y práctico’. Rust se enfoca principalmente en seguridad, velocidad y concurrencia. Una de sus principales caraterísticas es que es posible arreglar bugs en timepo de ejecución. Usado en desarollo web y embebido.
Erlang es un lenguaje de programación funcional de alto nivel, diseñado para escribir aplicaciones concurrentes y distribuidas de funcionamiento ininterrumpido. Erlang usa procesos concurrentes para estructurar la aplicación. Estos procesos no comparten memoria y se comunican de forma asincrónica mediante el paso de mensajes. Utilizado en telecomunicaciones, ecommerce y mensajería instantánea.
GO Es un lenguaje de programación compilado, concurrente, imperativo, estructurado, no orientado a objetos con recolector de basura, soportado en diferentes tipos de sistemas. La concurrencia en Go es diferente a los criterios de programación basados en bloqueos como pthreads. Es fácil de aprender debido a su similitud con los lenguajes más usados, es implementado en modelos de negocio y manejo de servidores.
Haskell es un lenguaje polimórficamente tipificado, perezoso, puramente funcional, muy diferente a la mayoría de los otros lenguajes de programación. La concurrencia es "ligera", lo que significa que tanto la creación de hilos como los gastos generales de cambio de contexto son extremadamente bajos. La programación de los hilos de Haskell se hace internamente y no hace uso de ningún paquete de hilos suministrado por el sistema operativo.
Crystal es uno de los nuevos lenguajes en la escena. Aunque no tan conocido como Rust, Elixir o Julia, tiene mucho que ofrecer. Iniciò en 2012, y según describen sus creadores, sus características principales son: sintaxis similar a Ruby, estáticamente tipado, compilado, selfhosted. Viene con una primitiva de concurrencia llamada fibras, que son básicamente una versión más ligera de hilos.
Java es un lenguaje de programación orientado a objetos creado en 1991 y publicado en 1995 por Sun Microsystem (adquirida por Oracle en 2010), con la intención de que los programadores escribieran el código solo una y lo ejecutarán en cualquier dispositivo. JAva permite realizar concurrencia con la librería threads. Además de que cuenta con otras librerías que implementan métodos de planificación y control de procesos (variables atómicas, semáforos, entre otros) traídos del paquete concurrent.
Python es el lenguaje más utilizado a nivel mundial (según revista IEEE), es un lenguaje de sintaxis simple y cuyas aplicaciones cubren una gran cantidad de áreas del conocimiento como lo son inteligencia artificial, ciencia de datos, entre otras. En cuanto a programación concurrente, cuenta con varias librerías para la implementación de esta y su respectivo control, como lo son la librería "Thread" y "Multiprocessing", que provee de herramientas como semáforos, monitores, entre otros. Específicamente la librería "Thread" incluye una interfaz de alto nivel orientada a objetos para trabajar con concurrencia desde Python. Los objetos Thread se ejecutan al mismo tiempo dentro del mismo proceso y comparten memoria.
Fue diseñado a mediados de los años 80 por el danés Bjarne Stroustrup. Su intención fue la de extender el lenguaje de programación C para que tuviese los mecanismos necesarios para manipular objetos. Por lo tanto C++ contiene los paradigmas de la programación estructurada y orientada a objetos. Se puede usar una librería thread que es básicamente una sección de código independiente que el procesador puede ejecutar de forma concurrente junto a otros threads o hilos de ejecución.
En conclusión y en términos simples, la programación concurrente no es más que la forma en la cual podemos resolver ciertas problemáticas de forma concurrente, es decir, ejecutando múltiples tareas a la misma vez y no de forma secuencial.
En un programa concurrente las tareas puede continuar sin la necesidad que otras comiencen o finalicen.
Si bien es cierto que la programación concurrente acarrea ciertos problemas, principalmente al momento de compartir información entre tareas, también es cierto que si se implementa de forma correcta, podremos, en casos puntuales, mejorar significativamente el performance de nuestras aplicaciones.
• Miguel Ángel Rodríguez Florido (10/08/2004) Conceptos de concurrencia. Disponible en el URL: https://www2.ulpgc.es/hege/almacen/download/20/20233/tema1.pdf [Consultado el 17 de septiembre 2022].
• Vaimaca (fecha no disponible) Conceptos de concurrencia. Disponible en el URL: https://www.fing.edu.uy/tecnoinf/mvd/cursos/so/material/teo/so07 concurrencia.pdf [Consultado el 17 de septiembre 2022].
• Berzal (05/19/2005) Conceptos de concurrencia. Disponible en el URL: https://elvex.ugr.es/decsai/java/pdf/E0-intro.pdf [Consultado el 17 de septiembre 2022].
• Monografias (fecha de publicación varia en la modificación) Conceptos de concurrencia Disponible en el URL: https://www.monografias.com/trabajos106/programacion concurrente lenguajes [Consultado el 17 de septiembre 2022]
• Monografias (fecha de publicación varia en la modificación) Conceptos de concurrencia Disponible en el URL: funcionales/programacion concurrente lenguajes funcionales [Consultado el 17 de septiembre 2022]
• No disponible (fecha no disponible) Conceptos de concurrencia
. Disponible en el URL: http://ferestrepoca.github.io/paradigmas de programacion/progconcurrente/concurrente_teoria/index.html [Consultado el 17 de septiembre 2022]
• No disponible (fecha no disponible) Conceptos de concurrencia. Disponible en el URL: https://programmerclick.com/article/67691919779/ [Consultado el 17 de septiembre 2022]
• Antonio (12/13/2004) Conceptos de concurrencia. Disponible en el URL: http://informatica.uv.es/iiguia/LP/teoria/apuntes/cuatr1/tema3_1_concurrencia.pdf [Consultado el 17 de septiembre 2022]
•
No disponible (fecha no disponible) Conceptos de concurrencia. Disponible en el URL: http://ferestrepoca.github.io/paradigmas-deprogramacion/progconcurrente/concurrente_teoria/index.html [Consultado el 17 de septiembre 2022]
• J.M. Drake (09/19/2008) Conceptos de concurrencia. Disponible en el URL: https://www.ctr.unican.es/asignaturas/procodis_3_ii/doc/procodis_1_02.pdf [Consultado el 17 de septiembre 2022]