PROGRAMA CONCURRENTE. 16/01/08 Un programa concurrente es un programa que tiene mas de una linea logica de ejecucion, es decir, es un programa que parece que varias partes del mismo se ejecutan simultaneamente. Un ejemplo de de esto es un programa que realice determinada funcion y, simultaneamente, exponga datos en la pantalla. Un programa concurrente puede correr en varios procesadores simultaneamente o no. Esta importancia de la concurrencia es especialmente destacable en sistemas operatives como Linux, que ademas de concurrentes, presentan unos mecanismos de concurrencia estables. El concepto fundamental de la programacion concurrente es la nocion de proceso. El termino proceso fue utilizado por primera vez por los diseñadores del sistema Multics en los años 60’s. Desde entonces, el termino proceso, utilizado a veces como sinonimo de tarea, ha tenido muchas definiciones. A continuacion se presentan algunas: Un programa en ejecucion. Una actividad asincrona El “espiritu animado” de un procedimiento El “centro de control” de un procedimiento en ejecucion Lo que se manifiesta por la existencia de un “bloque de control del proceso” en el sistema operativo La entidad a la que se asignan los procesadores La unidad “despachable” Aunque se han dado muchas otras definiciones, no hay una definicion universalmente aceptada, pero el concepto de “Programa en ejecucion” parece ser el que se utiliza con mas frecuencia. Un programa es una entidad inanimada; solo cuando un procesador le “infunde vida” se convierte en la entidad “activa” que se denomina proceso. Un proceso pasa por una serie de datos discretos. Se dice que un proceso se esta ejecutando (estado de ejecucion), si tiene asignada la CPU. Se dice que un proceso esta listo(estado listo) si pudiera utilizar la CPU en caso de haber una disponible. Un proceso esta bloqueado (estado bloqueado) si se esta esperando que suceda algun evento antes de poder seguir la ejecucion. EN EJECUCION BLOQUEADO DESPACHAR EXPIRACION DE TIEMPO DESPERTAR LISTO BLOQUEAR Los procesos secuenciales se han usado tradicionalmente para estudiar la concurrencia. ADA, es un lenguaje que maneja procesos secuenciales. Tanto sistemas paralelos como distribuidos son concurrentes; pero un sistema concurrente puede ser no paralelo ni distribuido, como acontece, por ejemplo, con los sistemas operatives monoprocesadores y multitarea, que son concurrentes pero no son paralelos ni distribuidos. Como ya se menciono los procesos son concurrentes si existen simultanemente. La concurrencia es el punto clave de la Multiprogramacion, el Multiproceso y el Proceso distribuido y fundamental para el diseño de sistemas operativos. La concurrencia comprende un gran numero de cuestiones diseño, incluyendo la comunicacion entre procesos, comparticion y competencia por lo recursos, sincronizacion de la ejecucion de varios procesos y asignacion del tiempo de procesador a los procesos. La concurrencia puede presentarse en tres contextos diferentes: Varias aplicaciones: La multiprogramacion se creo para permitir que el tiempo de procesador de la maquina fuese compartido dinamicamente entre varios trabajos o aplicaciones activas. Aplicaciones estructuradas: Como aplicacion de los principios del diseño modular y la programacion estructurada, algunas aplicaciones pueden implementarse eficazmente como un conjunto de procesos concurrentes. Estructura del Sistema Operativo: Las mismas ventajas de estructuracion son aplicables a los programadores de sistema y se han comprobado que algunos sistemas operatives estan implementados con un conjunto de procesos. Principios Generales de la concurrencia En un sistema multiprogramado con un unico procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecucion simultanea En un sistema con varios procesadores, no solo es posible intercalar los procesos, sino tambien superponerlos. La intercalacion y la superposicion representan formas de ejecucion muy diferentes. Ambas tecnicas pueden contemplarse como ejemplos de proceso concurrente y ambas plantean los mismos problemas. En el caso de un sistema monoprocesador, los problemas creados por la multiprogramacion parten del hecho de que la velocidad relativa de ejecucion de los procesos no puede predecirse. Los procesos concurrentes pueden funcionar en forma totalmente independiente unos de otros, o pueden ser asincronos, lo cual significa que en ocasiones requieren cierta sincronizacion o cooperacion. Cuando dos o mas procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una concurrencia de procesos. Es importante mencionar que para que dos o mas procesos sean concurrentes, es necesario que tengan alguna relacion entre ellos como puede ser la cooperacion para un determinado trabajo o el uso de informacion o recursos compartidos, por ejemplo: en un sistema de un procesador, la multiprogramacion es una condicion necesaria pero no suficiente para que exista concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente. Las interacciones entre procesos tienen dos formas: Primero comunicacion.- Si tenemos varios procesos ejecutando y queremos que interactuen entre ellos para solucionar un determinado problema, y por tanto, necesitan intercambiar informacion, es decir necesitan comunicarse. Esto implica el intercambio de datos entre procesos, ya sea por medio de un mensaje implicito o a traves de variables compartidas. Una variable es compartida entre procesos si es visible al codigo de esos procesos. Mediante la comunicacion se consigue que la ejecucion de un proceso influya en la ejecucion de otro. Segundo sincronizacion.- La sincronizacion (sinonimo de espera) es habitualmente necesaria cuando dos procesos se comunican puesto que la velocidad a la que se ejecutan no es predecible. Para que un proceso se communiqué con otro, aquel debera realizar acciones que sea capaz de detectar y esto solo funciona si realizar y detectar ocurren en este orden. Relaciona el seguimiento de un proceso con el seguimiento de otro. En otras palabras, la sincronizacion implica intercambio de informacion de control entre procesos. La necesidad de contar con comunicacion y sincronizacion puede verse en terminos de competencia y cooperacion entre procesos. La competencia ocurre cuando el proceso requiere el uso exclusivo de un recurso, como cuando dos procesos compiten por usar la misma impresora, o para reservar un asiento en un vuelo. Aqui la sincronizacion es necesaria para garantizar a un proceso el uso exclusivo de un recurso. La cooperacion ocurre cuando dos procesos trabajan en distintas partes del mismo problema y por lo general incluyen a la comunicacion y a la sincronizacion. PROGRAMACIÓN PARALELA Gracias a las progresivas mejoras tecnológicas desarrolladas durante las décadas pasadas, la capacidad de procesamiento de los ordenadores ha aumentado cada vez más. De todas formas, estas mejoras tecnológicas - integración VLSI, aumento de la frecuencia de reloj en los procesadores, tienen un límite físico, por lo cual el aumento de capacidad de procesamiento no es ilimitado. Hay una serie de problemas que no se pueden resolver con este tipo de ordenadores: la circulación atmosférica y el tiempo, la evolución de las galaxias, problemas de sistemas expertos e inteligencia artificial, etc. Para la resolución de estos problemas se está investigando intensamente desde hace dos décadas en el procesamiento paralelo. Hoy en día ya tenemos ordenadores comerciales que trabajan en paralelo, y esta parece ser la principal línea de investigación para mejorar la potencia de los ordenadores. De hecho, esta técnica ya ha llegado a los ordenadores personales gracias a la posibilidad de añadir placas que contienen varios procesadores más. Esta línea de investigación ha dado lugar a los multiprocesadores y los multicomputadores. Sin embargo, que un ordenador tenga una mayor capacidad de procesamiento no se consigue simplemente colocando un número mayor de procesadores, sino que supone una gran complejidad, tanto en el hardware como en el software. Vamos a describir brevemente esta complejidad, centrándonos en los aspectos de programación. En primer lugar, no todo problema puede ser paralelizado. Hay problemas que son inherentemente secuenciales y por lo tanto es difícil conseguir su ejecución en paralelo. De todas formas, la mayoría de los problemas científicos descritos anteriormente se pueden describir fácilmente en paralelo. En segundo lugar, necesitamos una arquitectura paralela que permita ejecutar una determinada aplicación, pero también un lenguaje adecuado que permita expresar el paralelismo del problema. Este punto ha dado lugar a diversas líneas de trabajo e investigación que vamos a describir a continuación: a) Verificación de programas paralelos. Un programa en paralelo no tiene nada que ver con un programa secuencial, pues su comportamiento es muy diferente. Las técnicas de verificación para programas secuenciales no sirven en el caso paralelo, por lo que se tiene que desarrollar toda la teoría formal de verificación de programas. Se puede citar los trabajos de [Kel76] y [Owi76] como dos trabajos pioneros que explican a fondo el problema de la verificación. Hay que tener en cuenta que en el caso paralelo nos aparecen problemas tales como el deadlock, livelock, race conditions, el no determinismo, etc., que complican abundantemente la verificación formal de un programa. b) Abstracción del hardware de la máquina. Mientras está claro que los lenguajes secuenciales son independientes de la máquina en que se ejecutan, no se puede decir lo mismo de los lenguajes paralelos. Es fácil que una independencia de la máquina conduzca a una pérdida de potencia, por lo que habitualmente se encuentran ligados en mayor o menor medida a una arquitectura determinada. Un ejemplo de unión estrecha lo tenemos con el lenguaje Occam [Inm88], cuyo desarrollo está vinculado al del transputer [Inm89]. Lo habitual es conseguir un grado de abstracción media, es decir, abstraer los detalles de más bajo nivel (tipo de conexión entre los procesadores, potencia de cada procesador, mecanismo de acceso a memoria por los procesadores, etc.), para dejar sólo la referencia al modelo de procesamiento empleado (sistólicos, SIMD, MIMD, etc.). c) Lenguajes síncronos o asíncronos. La mayoría de los lenguajes de programación desarrollados son asíncronos, es decir, son no deterministas y están basados en las nociones de procesos y comunicaciones entre procesos. Ejemplos de lenguajes de este tipo son el ADA, MODULA, Occam, etc. y las extensiones paralelas para Fortran, C, etc. Pero también se han desarrollado lenguajes síncronos, para aquellos problemas de tiempo real deterministas, tales como interfaces para teclado o ratón, video juegos, problemas de regulación automática, etc. Un ejemplo de este tipo de lenguaje es el ESTEREL [Ber84], que fue el primero que se desarrolló. d) Paralelización automática. El problema que tiene el desarrollo de nuevos lenguajes de programación es que todo el software desarrollado hasta la fecha se queda obsoleto. Para evitar esto, una de las líneas de investigación más potenciadas en los últimos años es la paralelización automática. La idea es que sea el compilador el encargado de determinar qué zonas del programa se van a ejecutar en paralelo, a partir de un programa escrito en un lenguaje secuencial. Los primeros desarrollos en esta línea fueron para los casos de paralelismo de datos y en particular para operaciones que trataran con vectores, por lo que se denominó a dichos compiladores vectorizadores. Generalmente, el lenguaje secuencial mas empleado en este grupo es el Fortran, quizás porque la mayoría de los supercomputadores utilizan este lenguaje. Un vectorizador Fortran analiza la secuencia de instrucciones para una posible traducción a instrucciones vectoriales. Lógicamente, es extremadamente dependiente de la máquina objeto, puesto que debe tener en cuenta las especiales características de su hardware. Los principales análisis que realiza un vectorizador son: determinación del flujo de procesamiento entre subprogramas, chequeo de las relaciones de dependencias entre los subprogramas, análisis de las variables y reemplazo de los bucles internos por instrucciones vectoriales. Un estudio de muchas de estas técnicas puede encontrarse en [Pad86]. Para máquinas de diseño MIMD esta técnica ha dado buenos resultados en sistemas de memoria compartida (multiprocesadores), habiendo poco trabajo aún desarrollado en el caso de memoria distribuida (multicomputadores), donde se puede citar el trabajo recogido en [Ter89]. Especiales problemas se presentan cuando aparecen estructuras de datos recursivos, así como en el manejo de los arrays y de los punteros, debido a la dependencia de unos datos con otros y a no poder determinar exactamente esa relación entre ellos, conduciendo a veces a situaciones de ambigüedad. Asimismo, otro de los problemas es el análisis interprocedural y el estudio del paralelismo anidado. Diversos estudios y resoluciones de estos problemas pueden encontrarse en [Nic89], [Li88] y [Hen90]. e) Estilos de programación en paralelo. Tenemos dos estilos de programación en paralelo: el paralelismo en los datos (data parallelism) o el paralelismo en el flujo de control del programa (control parallelism). El paralelismo en los datos se basa en realizar múltiples operaciones en paralelo sobre un gran conjunto de datos, mientras que el paralelismo en el control del programa se basa en tener simultáneamente varios flujos de control ejecutándose en paralelo. Últimamente se está prestando una mayor atención al paralelismo dirigido por los datos. El lenguaje C* [Ros86] desarrollado por Thinking Machines Corporation es un ejemplo de la importancia que está tomando este estilo de paralelismo. No hay que confundir esta dicotomía de estilos de programación como sinónimos a la oposición que hay en el diseño del hardware de una máquina entre SIMD y MIMD. Si bien es cierto que los computadores SIMD son más adecuados para ser programados en un estilo de paralelismo de datos, también pueden ejecutar un paralelismo de control por interpretación, dependiendo el que tal interpretación sea práctica de los detalles de coste de esa máquina determinada. De la misma forma, aunque un diseño MIMD es más adecuado para ser programado en un estilo de paralelismo con varios flujos de control, también se puede programar para un algoritmo con paralelismo en los datos. En el caso de máquinas con diseño MIMD se utilizan 2 estilos de programación: el estilo fork-join y el estilo SPMD (Single Program Múltiple Data) [Kar87]. En el estilo fork-join un proceso se divide en varios subprocesos mediante la instrucción fork, y espera hasta que finalizan, reflejado mediante la instrucción join que sirve además para sincronizar los procesos. Este estilo se utiliza solo en máquinas MIMD de memoria compartida. En el estilo SPMD todos los procesos ejecutan el mismo programa, pudiendo discriminar algunos segmentos de código en función del identificador de ese proceso. Aunque este estilo es muy cómodo para el desarrollo de programas en paralelo, presenta la dificultad de conseguir una carga balanceada entre los diversos procesadores, ya que la carga para cada proceso puede ser muy diferente especialmente en aquellos problemas con estructuras irregulares. Como podemos observar, el estilo de programación SPMD es un híbrido entre los dos estilos anteriores para el caso de máquinas MIMD. Este estilo de programación se utiliza tanto para MIMD de memoria compartida como MIMD de paso de mensajes. KANBALAM La Universidad Nacional Autónoma de México puso en marcha el equipo KanBalam, la supercomputadora más poderosa de América Latina, la cual tiene una capacidad de procesamiento demás de siete billones de operaciones aritméticas por segundo. KanBalam, que tuvo una inversión de tres millones de dólares, es la número 126 en la clasificación de las 500 supercomputadoras más rápidas en el mundo; la 44 en cuanto a sitios académicos, y la 28 respecto a las supercomputadoras instaladas en universidades “Con este equipo de alto rendimiento se multiplica la capacidad de la institución, así como la infraestructura que la UNAM pone al servicio de México”, señaló el rector Juan Ramón De la Fuente. “Un adelanto como éste generará más conciencia social respecto a la importancia de la ciencia, la tecnología y la investigación como palancas ineludibles del desarrollo, destacó el rector. También advirtió que el déficit tecnológico ha tenido consecuencias graves en proceso de desarrollo del país. “Hay campos que son virtualmente desconocidos, como la nanotecnología”, subrayó. Por su parte el titular de la Dirección General de Servicios de Cómputo Académico (DGSCA), Alejandro Pisanty Baruch, explicó que con esta herramienta se atiende la necesidad de la comunidad universitaria y nacional al actualizar las capacidades de cálculo que requiere para participar en el ámbito global del quehacer científico de manera competitiva y equilibrada. “Este nuevo equipo refleja los avances tecnológicos en materia de cálculo numérico actual y marca un salto cualitativo para el supercómputo en la UNAM desarrollado en los últimos 15 años”, agregó el director de la DGSCA. Ambos directivos coincidieron en definir la nueva supercomputadora como una “máquina repatriadota de cerebros”, ya que los científicos que permanecen en el extranjero y los que trabajan en México podrán realizar los más complejos procesos de cómputo en la computadora que ya se encuentra en Ciudad Universitaria. Pisanty informó que el supercómputo en la institución, es utilizado para investigaciones en áreas como astrofísica, física de partículas, química cuántica, estudios del clima y la contaminación, ingeniería sísmica, geología, ciencias biológicas y de materiales, entre otras disciplinas. Tan sólo en los últimos tres años sus usuarios han generado más de 230 publicaciones científicas con reconocimiento internacional. El equipo permitirá a los científicos mexicanos establecerse entre los mejores del mundo y representará una importante herramienta para que continúen aportando conocimientos en proyectos internacionales de la mayor importancia. La supercomputadora fue nombrada KanBalam en memoria de este matemático maya que vivió entre 635-702, y que fue reconocido por la precisión en sus cálculos relacionados con el dominio del tiempo. Los datos Inversión de tres millones de dólares. Es el número 126 en la clasificación de las 500 supercomputadoras más rápidas en el mundo. Es la 44 en cuanto a sitios académicos, y la 28 respecto a las instaladas en universidades. Cuenta con mil 368 procesadores y una memoria RAM total de 3 mil gigabytes. Tiene una capacidad de procesamiento de más de siete billones de operaciones aritméticas por segundo. Los mil 368 procesadores de este nuevo equipo están organizados en 337 nodos de cálculo, cada uno con dos procesadores de dos núcleos. De las matemáticas mayas a gigabytes KanBalam será utilizado para investigaciones en áreas como astrofísica, física de partículas, química cuántica, estudios del clima y la contaminación, ingeniería sísmica, geología, ciencias biológicas y de materiales, entre otras disciplinas. Tan sólo en los últimos tres años, sus usuarios han generado más de 230 publicaciones científicas con reconocimiento internacional. El nuevo equipamiento cuenta con mil 368 procesadores (cores AMD Opteron de 2.6 GHz), una memoria RAM total de 3 mil gigabytes y un sistema de almacenamiento de 160 terabytes. Ofrece a la comunidad académica y de investigación nacional una capacidad de cálculo sin precedente en el país. Los mil 368 procesadores de este nuevo equipo están organizados en 337 nodos de cálculo, cada uno con dos procesadores de dos núcleos y ocho gigabytes de memoria, así como con cinco nodos especiales con 64 Gigabytes. Su sistema de almacenamiento se conforma con 768 discos. Los nodos de procesamiento y los dispositivos de almacenamiento se comunican a través de una red de alta velocidad, con tecnología Infiniband de 10 gigabytes por segundo. KanBalam es siete mil veces más potente que la primera supercomputadora de la Universidad Nacional, CRAY-YMP (1991), y 79 veces más poderosa en cálculo que el equipo AlphaServer SC45, adquirido en 2003.