Vous êtes sur la page 1sur 5

Programación Concurrente

La computación concurrente es la simultaneidad en la ejecución de múltiples tareas


interactivas. 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 unidad
central de proceso (multiprogramación), en varios procesadores o en una red de
computadores distribuidos. La programación concurrente está relacionada con la
programación paralela, pero enfatiza más la interacción entre tareas. Así, la correcta
secuencia de interacciones o comunicaciones entre los procesos y el acceso
coordinado de recursos que se comparten por todos los procesos o tareas son las
claves de esta disciplina.
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.
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.
Programa Concurrente: Es un programa diseñado para tener 2 o más contextos de
ejecución decimos que este tipo de programa es multi-hilo, porque tiene más de un
contexto de ejecución.
Un programa concurrente es un programa que tiene más de una línea lógica de
ejecución, es decir, es un programa que parece que varias partes del mismo se
ejecutan simultáneamente. Un ejemplo de esto es un programa que realice
determinada función y, simultáneamente, exponga datos en la pantalla. Un
programa concurrente puede correr en varios procesadores simultáneamente o no.
Esta importancia de la concurrencia es especialmente destacable en sistemas
operativos como Linux, que además de concurrentes, presentan unos mecanismos
de concurrencia estables
Un programa concurrente da lugar, durante su ejecución, a un proceso con varios
hilos de ejecución.
Desde el punto de vista de la programación, interesa la concurrencia lógica que
puede existir en el interior de un programa.
Un Lenguaje de Programación será concurrente si posee las estructuras necesarias
para definir y manejar diferentes tareas (hilos de ejecución) dentro de un programa.
 Ejemplos: Java, Ada
El compilador y el SO serán los responsables de “mapear” la concurrencia lógica
del programa sobre el hardware disponible.
Un ejemplo de programa concurrente
Para entender mejor este detalle un buen ejemplo de un programa concurrente es
el navegador Web de modem. Un ejemplo de concurrencia en un navegador Web
se produce cuando el navegador empieza a presentar una página, aunque puede
estar aun descargando varios archivos de gráficos o de imágenes. La página que
estamos presentando es un recurso compartido que deben gestionar
cooperativamente los diversos hilos involucradas en la descarga de todos los
aspectos de una página. Los diversos hilos no pueden escribir todas en la pantalla
simultáneamente, especialmente si la imagen o grafico descargado provoca el
cambio de tamaño del espacio asignado a la visualización de la imagen, afectando
así la distribución del texto. Mientras hacemos todo esto hay varios botones que
siguen activos sobre los que podemos hacer clic particularmente el botón stop como
una suerte de conclusión se observa en este proceso que las hebras operan para
llevar a cabo una tarea como la del ejemplo anterior así mismo se verá que los
procesos deben tener acceso exclusivo a un recurso compartido como por ejemplo
la visualización para evitar interferir unas con otras.
Origen Programación concurrente Importancia
La programación concurrente tiene sus raíces en los sistemas operativos y en la
programación de sistemas, no en vano, los primeros programas concurrentes fueron
los propios sistemas operativos de multiprogramación en los que un solo procesador
de gran capacidad debía compartir su tiempo entre muchos usuarios. En los años
60’s se introdujeron en las computadoras dispositivos controladores independientes
de entrada-salida llamados canales. Estos canales eran programables en sí
mismos. Los sistemas operativos fueron organizados como una colección de
procesos ejecutándose concurrentemente (“al mismo tiempo”), algunos en los
canales y otros ejecutándose en el procesador principal o CPU.

Por otro lado, en esos años la programación de sistemas con capacidades de


concurrencia se hacía a bajo nivel, en ensamblador, pues aparte de no disponer de
lenguajes de alto nivel con capacidades de concurrencia, se primaba la supuesta
eficiencia del código escrito directamente en ensamblador. La aparición en 1972 del
lenguaje de alto nivel Concurrent Pascal, desarrollado por Brinch Hansen abrió la
puerta a otros lenguajes de alto nivel que incorporaban concurrencia.
Desde entonces la programación concurrente ha ido ganando interés y actualmente
se utiliza muy a menudo en la implementación de numerosos sistemas. Tres
grandes hitos fortalecen el hecho de que la programación concurrente sea tan
importante:
 La aparición del concepto de Thread o hilo que hace que los programas
puedan ejecutarse con mayor velocidad comparados con aquellos que
utilizan el concepto de proceso
 La aparición más reciente de lenguajes como JAVA, lenguaje orientado a
objetos de propósito general que da soporte directamente a la programación
concurrente mediante la inclusión de primitivas específicas.
 La aparición del INTERNET que es un campo abonado para el desarrollo y
la utilización de programas concurrentes. Cualquier programa de Internet en
el que podamos pensar tales como un navegador, un chat, etc., están
programados usando técnicas de programación concurrente.

Programación Concurrente.
 Multitarea.
Un sistema multitarea es aquel que permite la ejecución de varios procesos sobre
un procesador mediante la multiplexación de este entre los procesos. La multitarea
se implementa generalmente manteniendo el código y los datos de varios procesos
simultáneamente en memoria y multiplexando el procesador y los dispositivos
E/S entre ellos.
La multitarea suele asociarse con soporte software y hardware para la protección
de memoria con el fin de evitar que los procesos corrompan el espacio de
direcciones y el comportamiento de otros procesos residentes en memoria, un
sistema multitarea, sin embargo, no tiene necesariamente que soportar formas
elaboradas de gestión de memoria y archivos. En este sentido multitarea es
sencillamente sinónimo de concurrencia.
 Multiprogramación.
El término multiprogramación designa a un SO que además de soportar multitarea
proporciona formas sofisticadas de protección de memoria y fuerza el control de la
concurrencia cuando los procesos acceden a dispositivos E/S y a archivos
compartidos, en general la multiprogramación implica multitarea pero no viceversa.
Los SSOO operativos de multiprogramación soportan generalmente varios usuarios
en cuyo caso también se les denomina sistemas multiusuario o multiacceso.

 Multiproceso.
Los SSOO para multiproceso gestionan la operación de sistemas informáticos que
incorporan varios procesadores conocidos habitualmente como sistemas
multiprocesadores. Los SSOO para multiprocesadores son multitarea por definición
ya que soportan la ejecución simultánea de varias tareas o procesos sobre
diferentes procesadores y serán multiprogramados si disponen de los mecanismos
de control de concurrencia y protección de memoria adecuados. En general todos
los SSOO de multiprogramación se caracterizan por mantener un conjunto de
procesos activos simultáneamente que compiten por los recursos del sistema,
incluidos el procesador, la memoria y los dispositivos E/S.
Motivaciones
Existen 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).
¿Para qué es útil la programación concurrente? Beneficios

 Proporciona el modelo más simple y natural de concebir muchas


aplicaciones.
 Facilita el diseño orientado a objeto de las aplicaciones, ya que los objetos
reales son concurrentes.
 Hace posible compartir recursos y subsistema complejos. En sistemas
monoprocesador permite optimizar el uso de los recursos.
 Facilita la programación de tiempo real, ya que se pueden concebir como
procesos cuya ejecución se planifican de acuerdo con la urgencia.
 Permite reducir los tiempos de ejecución sobre plataformas
multiprocesadoras.
 Facilita la realización de programas fiables por despliegue dinámico de los
procesos en los procesadores.
 Mejor aprovechamiento de la CPU
 Programación modular
 Considerar aisladamente cada tarea
 Aprovechar desde un programa el paralelismo (multiprocesadores).
 Tratar el trabajo con E/S lenta con flujos dedicados.
 El flujo principal del programa puede seguir trabajando
 Atención a varias peticiones simultáneas (sistemas distribuidos)
 Velocidad de ejecución. Al subdividir un programa en procesos, éstos se
pueden “repartir” entre procesadores o gestionar en un único procesador
según importancia.
 Solución a problemas de esta naturaleza. Existen algunos problemas cuya
solución es más fácil utilizando esta metodología.
o Sistemas de control: Captura de datos, análisis y actuación (p.ej.
sistemas de tiempo real).
o Tecnologías web: Servidores web que son capaces de atender
varias peticiones concurrentemente, servidores de chat, email, etc.
o Aplicaciones basabas en GUI: El usuario hace varias peticiones a la
aplicación gráfica (p.ej. Navegador web).
o Simulación: Programas que modelan sistemas físicos con
autonomía.
o Sistemas Gestores de Bases de Datos: Cada usuario un proceso.
Paralelismo Vs Concurrencia
Hay concurrencia entre varios procesos cuando existen al mismo tiempo.
PROCESOS CONCURRENTES
Hay paralelismo entre varios procesos cuando se ejecutan al mismo tiempo.
PROCESOS PARALELOS
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.
Hablaremos en general de flujos concurrentes: Pueden ser del mismo proceso o
diferentes procesos. Pueden correr en un único procesador o varios.