viernes, noviembre 10, 2006

PARADIGMA CONCURRENTE

Introducción

La idea de programación concurrente siempre estuvo asociada al mundo de los Sistemas Operativos. 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 repartir su tiempo entre muchos usuarios. Para cada usuario, la sensación era que el procesador estaba dedicado para él.

Desde su aparición la programación concurrente ha ido ganado interés y actualmente se utiliza muy a menudo en la implementación de numerosos sistemas. Tres grandes hitos se nos antojan importantes para que la programación concurrente actualmente 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 popularización de 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 de Internet que es un campo abonado para el desarrollo y la utilización de programas concurrentes.
Concepto de Programación Concurrente

Según el diccionario de la Real Academia Española, una de las aceptaciones de la palabra concurrencia es: "Acaecimiento o concurso de varios sucesos en un mismo tiempo."

Si en esta definición sustituímos la palabra suceso por proceso, ya tenemos una primera aproximación a lo que va a ser la concurrencia en computación.

Programa y proceso

Un programa es un conjunto de instrucciones. Es una secuencia de líneas de código que dicen qué hacer con un conjunto de datos de entrada para producir un tipo de salida. Se trata de algo estático. Un proceso es una actividad asíncrona susceptible de ser asignada al procesador, por tanto algo dinámico. Un proceso no es exactamente un programa en ejecución, ya que dicho programa puede estar compuesto por diversos procesos.

Concurrencia

Dos procesos serán concurrentes cuando la primera instrucción de uno de ellos se ejecuta después de la primera instrucción del otro y antes de la última. Es decir, existe un solapamiento en la ejecución de sus instrucciones. No tienen por qué ejecutarse exactamente al mismo tiempo, simplemente es suficiente con el hecho de que exista un intercalado entre la ejecución de sus instrucciones. Si se ejecutan al mismo tiempo entonces es programación paralela. La programación concurrente es un paralelismo potencial ya que dependerá del hardware subyacente. La concurrencia en un lenguaje de programación y el paralelismo en el hardware son dos conceptos independientes. Las operaciones de hardware ocurren en paralelo si ocurren al mismo tiempo. Las operaciones en el texto fuente son concurrentes si pueden ejecutarse en paralelo, aunque no necesariamente deben ejecutarse así. Se dice que las operaciones que ocurren una después de otra, ordenadas en el tiempo, son secuenciales. Podemos tener concurrencia en un lenguaje sin hardware paralelo, así como ejecución en paralelo sin concurrencia en el lenguaje. En síntesis, la concurrencia se refiere al potencial para el paralelismo.

Cuando varios procesos se ejecutan concurrentemente algunos pueden colaborar para un determinado fin, o otros pueden competir por los recursos del sistema. Para llevar a cabo estas tareas de colaboración y competencia por los recursos se hace necesaria la introducción de mecanismos de comunicación y sincronización entre procesos:

Comunicación. Implica el intercambio de datos entre procesos, ya sea por medio de un mensaje implícito o a través de valores de variables compartidas. Una variable es compartida entre procesos si es visible al código de esos procesos.

Sincronización. Relaciona el seguimiento de un proceso con el seguimiento de otro. Si p es un punto en el seguimiento de un proceso P, y q es un punto en el seguimiento de un proceso Q, entonces la sincronización puede usarse para restringir el orden en el cual P alcanza y Q alcanza q. En otras palabras, la sincronización implica el intercambio de información de control entre procesos.

Programación concurrente

La programación concurrente es la disciplina que se encarga del estudio de las notaciones que permiten especificar la ejecución concurrente de las acciones de un programa, así como las técnicas para resolver los problemas inherentes a la ejecución concurrente, que son básicamente comunicación y sincronización.

Como puede intuirse ( no hace falta ser ingeniero técnico por la Universidad de Vigo ), el trabajar con procesos concurrentes va a añadir complejidad a la tarea de programar, por tanto cabe preguntarse qué beneficios nos aporta la programación concurrente:

- Velocidad de ejecución

Cuando la puesta en ejecución de un programa conlleva la creación de varios procesos y el sistema consta de más de un procesador, existe la posibilidad de asignar un proceso a cada procesador de tal forma que el programa se ejecuta de una forma más rápida. Los programas de cálculo numérico son grandes beneficiarios de este hecho.

- Solución de problemas inherentemente concurrentes

Existen algunos problemas cuya solución es más fácil de abordar mediante el uso de programación concurrente pues su naturaleza es eminentemente concurrente. Podemos destacar:


  • Sistemas de control: Sistemas de captura de datos a través de sensores, como alarmas anti-incendios, dónde es necesario capturar datos simultaneamente de las estancias para que el sistema pueda responder a tiempo.
  • Tecnologías Web: La mayoría de los programas web son concurrentes, los servidores web por poner un ejemplo atienden a múltiples conexiones de usuarios. Chat, servidores de correos, etc son también ejemplos de programas concurrentes.
  • Aplicaciones basadas en interfaces de usuarios: Permiten que el usuario pueda interaccionar con la aplicación aunque esté realizando alguna tarea que consume tiempo de procesador. Un proceso controla la interfaz mientras que otro hace la tarea que requiere mayor uso de procesador.
  • Simulación: Los programas secuenciales encuentran problemas al simular sistemas en los que existen objetos físicos que tienen un comportamiento autónomo independiente.
  • SGBD: En Sistemas Gestores de Bases de Datos la concurrencia juega un papel muy importante cuando se va a permitir a varios usuarios interactuar con el sistema. Cada usuario puede ser visto como un proceso. Obviamente hay que implementar la política adecuada para evitar situaciones en las que dos usuarios modifican al mismo tiempo un registro. Sin embargo, a varios usuarios que quieran acceder a un mismo registro para consultarlo y no modificarlo, debe permitírseles un acceso concurrente.
Con esto doy por finalizado esta breve descripción del paradigma de programación concurrente. Hemos visto una introducción y algunos conceptos básicos (comunicación, sincronización) ligados a esta forma de programar. También el motivo por el que está en auge y para finalizar los beneficios que obtenemos a pesar de que exige un plus de esfuerzo en la codificación con este estilo de programación. Espero que le haya servido de ayuda.

Bibliografía

"Programación concurrente" - José Tomás Palma Méndez,
ISBN 84-9732-184-7, Publicación Thomson[2003], Código Biblioteca: OUR 681.32/607

"Lenguajes de Programación, Conceptos y Constructores" Cap.9 - Ravi Sethi, Addison-Wesley