¿Qué es programación concurrente?
Una de las necesidades fundamentales, si quieres estudiar informática, es el estudio de las diferentes técnicas o paradigmas de programación. Si no le prestas la atención debida a estos importantes temas, no podrás avanzar nunca en la carrera.
Los paradigmas o técnicas de programación son el primer peldaño en la construcción de un programa informático. En el mismo sentido, si quieres entender el funcionamiento del sistema operativo de un ordenador, debes saber con exactitud que es la programación concurrente. Esta es una técnica que permite la ejecución de varios procesos simultáneos de forma coordinada.
Si quieres saber más, continúa leyendo.
Qué vas a encontrar aquí? Qué es la programación concurrente. Historia de la programación concurrente. Ventajas y desventajas de la programación concurrente y mucho más que te será súper útil.
Qué es la programación concurrente?
La respuesta a esa pregunta puede ser un poco compleja, sobre todo si recién estás dando tus primeros pasos en lenguajes de programación. Para poder contestarte de forma sencilla esa pregunta, antes debes tener bien metido en la cabeza algunos conceptos básicos.
Estos conceptos son:
- Concurrencia
- Paralelismo
- Programación estructurada
En el caso que nunca hayas escuchado de estos términos relacionados con la programación, en los siguientes párrafos que te servirán para entender cada una de estas palabras, con algunos ejemplos incluidos, por supuesto.
Si entiendes a la perfección estos conceptos, vas a estar preparado para entender por completo la programación concurrente, y la mejor forma de aplicarla en la programación real.
Acerca de la ejecución en la programación concurrente
Lo primerísimo que tienes que saber es que la computación concurrente es una forma de programación. Esta es una técnica de programación mediante la cual se obtiene la capacidad de realizar cálculos de forma concurrente, no de forma secuencial.
A su vez puede ser una particularidad propia de un sistema informático. Sea software, hardware o hardware de red, debe existir un punto separado de ejecución, llamado “hilo de control” para cada proceso.
La computación concurrente es considerada como una forma de programación modular. En este paradigma de programación, un cálculo entero puede ser dividido en varios subcálculos que podrían ejecutarse de forma concurrente.
Programación concurrente y programación paralela
Antes que nada, hay un punto que se debe aclarar. Muchas veces la computación concurrente suele confundirse con la computación paralela. Para estos tipos de computación se debe programar de manera distintas.
Estas dos formas de programar si bien están relacionadas, lo cierto es que se usan para cosas distintas. Una es la programación paralela y la otra es la programación concurrente.
Aquí encontrarás un super post sobre lo que es programar en informática y mucho más!
En este sentido, podría definirse a ambos tipos de programación como múltiples procesos que se están ejecutando al mismo tiempo. Sin embargo existen diferencias bastante importantes.
En la computación paralela los comandos se ejecutan todos en el mismo momento. Un ejemplo de ello sería el modo de ejecutar código de los procesadores con múltiples núcleos, o computadoras con configuraciones con más de un procesador físico.
De esto se puede deducir que la computación o programación paralela no puede llevarse a cabo en procesadores con un solo núcleo. Esto sucede ya que en un momento dado sólo se puede procesar un dato. Sin embargo las reglas pueden cambiar si existe un coprocesador en la configuración.
Ahora, la computación concurrente funciona bajo el concepto de que los procesos, si bien se ejecutan al mismo tiempo, no ocurre de manera paralela, es decir todos a la vez. En este tipo de procesamiento, se pueden procesar múltiples datos en un mismo procesador, pero indicando un tiempo máximo de límite de ejecución.
Es decir, un proceso se lleva a cabo en un momento dado, pero si no consigue ejecutarse a tiempo, el sistema pondrá a este proceso en pausa. A continuación se comenzará con la ejecución de otro proceso. En el caso del proceso pausado, volverá a ejecutarse cuando el sistema indique que le toca nuevamente su turno.
Básicamente, la concurrencia es una forma de estructurar una solución que puede ser paralelizable, aunque esto no siempre tenga que ser de esta manera.
Diferencias entre programación concurrente y programación paralela
Las diferencias más notables entre programación concurrente y programación paralela son las siguientes.
Programación concurrente
- Es capaz de procesar dos o más acciones progresivamente.
- Son procesos que se ejecutan de manera independiente.
- Es capaz de procesar múltiples datos al mismo tiempo.
Programación paralela
- Es capaz de procesar dos o más comandos en forma simultánea.
- Son procesos que se ejecutan de forma simultánea, que tal vez se encuentre relacionados.
- Ofrece la posibilidad de procesar múltiples datos de forma mucho más veloz.
En este punto, conocer estos principios de la computación es fundamental. La programación estructurada y la programación concurrente suelen confundirse a menudo. Por ello toda esta explicación está súper simplificada, pero es clara y concisa, como para comenzar a entender lo complicado que es la programación concurrente.
Como ya sabes, los programas paralelos son aquellos que aprovechan hardware multinúcleo con el fin de llevar a cabo acciones de manera más eficaz y veloz.
En este sentido, los cálculos necesarios para llevar a cabo estas acciones se dividen en los diferentes procesadores o núcleos de la computadora para que se ejecuten al mismo tiempo. Es decir en forma paralela.
Este modelo permite que los resultados de estos cálculos y algoritmos se obtengan más rápidamente que si hubieran sido procesados de forma secuencial.
Ahora, la técnica de la concurrencia es una forma de estructurar programas en la cual existen múltiples hilos de control.
Estos hilos de control se ejecutan en forma simultánea, es decir a la vez. Por lo menos en forma teórica. Esto significa que el usuario puede observar sus efectos, pero de forma interpuesta.
SI estos procesos se ejecutan de forma simultánea o no lo hacen es materia de la implementación.
En este sentido, un programa simultáneo puede ejecutarse en un solo procesador mediante la ejecución intercalada o en varios procesadores físicos distintos.
Además, la programación paralela está más centrada en la eficiencia. En cambio, la programación concurrente se centra en estructurar un programa que requiere interactuar con otros sistemas externos independientes.
Ejemplos de esto sería:
- Usuario
- Servidor de base de datos
- Clientes externos
Esta simultaneidad consigue que estos programas sean modulares. Esto es debido a que el subproceso que interactúa con el usuario es diferente del subproceso que se comunica con la base de datos.
Si no existe simultaneidad, estos procesos deben desarrollarse con bucles de eventos y devoluciones de llamada, aunque estos bucles de eventos y devoluciones de llamada se utilizan mucho, aun cuando se dispone de simultaneidad.
Esto es debido a que en muchos lenguajes la simultaneidad es difícil de implementar.
Paradigma de la programación concurrente
En pocas palabras, la programación concurrente es un método mediante el cual podemos resolver problemas de programación en forma concurrente. Esto significa ejecutar múltiples comandos de manera simultánea. Sin embargo, estas tareas o comandos no podrán ejecutarse de forma secuencial, es decir una detrás de la otra.
La característica más importante de la programación concurrente es que en un programa concurrente, las tareas podrán continuar sin que otras tareas tengan que comenzar o finalizar.
Hablando un poco más técnicamente, cuando se hacer referencia a la programación concurrente, se habla de una técnica de programación. Esta es utilizada para expresar la concurrencia entre tareas y solución de cualquier problema que pudiera surgir de la sincronización y comunicación entre los procesos que participan.
Como se ha mencionado, la programación concurrente es la ejecución simultánea de múltiples tareas de forma interactiva. Dichas tareas pueden ser un set de procesos o hilos, creados y gestionados por un determinado programa.
Dichas tareas pueden ser llevadas a cabo bien en una única CPU en el modo multiprogramación o en múltiples procesadores. También se pueden desarrollar en una red de computadoras distribuidas.
Una de las características más importantes de la programación concurrente es sin dudas, la posibilidad de mejorar el rendimiento de cualquier aplicación desarrollada con este método.
Ahora, también se pueden presentar ciertas desventajas, como problemas al momento de compartir datos entre tareas. Pero esto lo vamos a ver más abajo en este mismo post, en donde hablamos de las ventajas y desventajas de la programación concurrente.
Historia de la programación concurrente
Los primeros trabajos acerca de la computación concurrente se llevaron a cabo a partir del siglo XIX y los primeros años del siglo XX.
¿Cuál era el objetivo de estas investigaciones? Mejorar la calidad y la performance de servicios como la telegrafía y los ferrocarriles. En este sentido, estos trabajos permitieron gestionar el movimiento de los trenes de manera eficiente y evitando las colisiones.
En el ámbito de la telegrafía sirvieron para gestionar y mejorar la performance de múltiples transmisiones simultáneas mediante la menor cantidad de cables. También fueron de mucha utilidad para el desarrollo de la multiplexación por división de tiempo.
La mayoría de estas investigaciones, y las lecciones aprendidas, continúan con nosotros. Mejoradas y adaptadas a lo largo de los años.
Algoritmos concurrentes
Quienes primero desarrollaron estudios académicos en relación a los algoritmos concurrentes fue el científico neerlandés Edsger Dijkstra a finales de la década de 1960. En estos trabajos el matemático identificaba y resolvía exclusiones mutuas.
En algunos de estos trabajos, como por ejemplo “Cooperating sequential processes”, publicado en 1967, ya se introducían problemas como “The Dining Philosophers”, “The Sleeping Barber” o “The Dutch Flag Problem”.
Estos abordaban problemas como la sección crítica y su solución, utilizando semáforos. También daba a conocer la noción de interbloqueo. Además presenta un algoritmo que es capaz de detectar la posible presencia de bloqueos.
No cabe ninguna duda que este artículo fue uno de los más importantes. En este papel ya se podía ver el desarrollo que podía llegar a tener la programación concurrente.
Pero existe un hito anterior al de Edsger Dijkstra. A principios de 1960, Jack B. Dennis del Massachusetts Institute of Technology, Earl C. Van Horn y Melvin E. Conway introdujeron la idea de múltiples hilos de control. También en aquella temprana etapa se dieron a conocer problemáticas relacionadas con los recursos compartidos como la memoria.
Gracias a todas estas investigaciones, en la actualidad puedes contar con una batería importante de soluciones para la programación concurrente como Java, Occam y ADA. (Conoce todo sobre la máquina virtual Java)
Ventajas y desventajas e la programación concurrente
Como todo paradigma de programación, la programación concurrente tiene sus ventajas y desventajas.
¿Quieres saber cuáles son?
Ventajas de la programación concurrente
- Mejor velocidad de respuesta
Los subprocesos múltiples permiten ejecutar múltiples operaciones en forma simultánea. Esto trae como consecuencia mayor velocidad de ejecución del programa. Es decir que todas las operaciones que lleva a cabo el usuario serán procesadas a la vez.
Todo ello permite que la productividad del usuario sea más valiosa. Además de este modo se asegura que todos los recursos de la computadora disponibles están siendo utilizados de forma inteligente.
- Mejor utilización de los recursos del microprocesador
Es sabido que con cada año que pasa, los procesadores incluyen más núcleos, y por lo tanto poder de procesamiento y velocidad. En el caso que un programa sea de un solo proceso, entonces usará un solo núcleo.
Es decir que por más núcleos que tenga un procesador, estos no serán usados por dicho programa.
En cambio, si un programa es del tipo multiproceso, puede aprovechar todos los núcleos del procesador. Esto significa que a más cantidad de núcleos, mejor será la performance del programa.
- Más fácil de desarrollar
La programación concurrente es considerada como el inicio del desarrollo de Java, ofreciendo un modelo de programación consistente. En este sentido, aquellos programadores que utilizan Java en sus desarrollos pueden centrarse más en la programación y no en cómo utilizar de la mejor manera el multiproceso.
Desventajas y soluciones de la programación concurrente
Sin duda alguna, uno de las principales desventajas de la programación concurrente reside en desconocer cuál es el orden en que se ejecutarán los programas. En este sentido, debes poner mucha atención al momento de desarrollar para que este orden no afecte como se ejecutan tus programas.
- Cambio de contexto y velocidad de ejecución
Si bien parece ser una cuestión complicada, lo cierto es que se puede resumir de manera sencilla de la siguiente forma.
Imagina que estás leyendo un texto. Encuentras una palabra que no conoces. ¿Qué haces? Recurres a un diccionario. Una vez conocido el significado de la palabra, vuelves a tu texto.
Así es como se puede ejemplificar a lo que los desarrolladores denominan como “cambio de contexto”.
Ahora, el proceso de cambio de contexto entre hilos de un procesador se comporta de manera similar. A cada uno de los subprocesos de un procesador se le asigna un cierto intervalo de tiempo de ejecución.
Una vez que el procesador culmina con la ejecución de uno de estos subprocesos, es decir cuando se termina el tiempo asignado, se cambia a otro subproceso.
Sin embargo, la necesidad de tener que llevar a cabo varias tareas para llega a una conclusión, es decir buscar en el diccionario y luego seguir leyendo, afecta la eficiencia. Esto significa que el cambio entre procesos disminuirá la performance de ejecución.
Usos de la programación concurrente
Hoy en día, es más importante la cantidad de núcleos que la velocidad que los procesadores pueden desarrollar.
Aquellos programas bien escritos, es decir los que perdurarán en el mercado, son capaces de escalar eficientemente con la cantidad de núcleos de procesador del dispositivo que los ejecuta.
En este punto, parece ser que el paradigma de programación vencedor es el concurrente. En este escenario actual, la programación de software en forma secuencial es más lenta con respecto a la concurrente.
Dicho esto, además de ser mejor programar en forma concurrente, es más que importante ya que pronto será la forma más usada.
Esto se aplica al procesamiento de gráficos, la robótica, la inteligencia artificial, la programación genética, el procesamiento de entradas en tiempo real y el renderizado de animaciones, entre muchas otras implementaciones.
Es decir que la programación concurrente puede ser el modo habitual dentro de poco tiempo para cualquier de las aplicaciones modernas de informática.
Deja una respuesta
q ´pedo quijatron esta info yo me la copio