Programación Concurrente y Paralela Unidad 1 Introducción Contenido 1.1 Concepto de Concurrencia 1.2 Exclusión Mutua y Sincronización 1.3 Corrección en Sistemas Concurrentes 1.4 Consideraciones sobre el Hardware 1.5 Sistemas Distribuidos 1.6 Sistemas de Tiempo Real 1.7 Procesamiento Paralelo Concepto de concurrencia La concurrencia surge ante la necesidad de plantear soluciones con el máximo rendimiento. Existen varias aplicaciones computacionales que requieren una gran velocidad de cálculo: visualización bases de datos distribuidas simulaciones predicciones científicas. Dentro de las tenemos: áreas afines de la concurrencia sistemas distribuidos sistemas en tiempo real Concepto de concurrencia Programación concurrente tiene sus raíces en los sistemas operativos y en la programación de sistemas (años 60’s). Sistemas operativos fueron organizados con una colección de procesos ejecutándose concurrentemente (“al mismo tiempo” ), algunos se ejecutaban en el procesador principal y otros en los controladores llamados canales. La administración de estos sistemas se hacía a bajo nivel, en 1972 apareció el lenguaje Pascal concurrente, era el primer lenguaje de alto nivel para este objetivo. Concepto de concurrencia Acontecimientos que programación concurrente: impulsaron la El concepto de hilo hizo que los programas puedan ejecutarse con mayor velocidad comparados con los procesos utilizados anteriormente. Los lenguajes orientados objetos como Java que daban mejor soporte a la programación con la inclusión de primitivas. La aparición de Internet dadas las aplicaciones como el navegador, el chat están programados mediante técnicas de concurrencia Concepto de concurrencia Programa secuencial Programa concurrente Se considera un programa imperativo, dado que las instrucciones son ejecutadas una tras otra. Existen varios programas que se ejecutan secuencialmente, es decir se encuentran trabajando en paralelo. En este caso las instrucciones pertenecen a un solo proceso. Los procesos comparten el tiempo de ejecución de un único procesador disponible dada una técnica de planificación. Se considera como un simple hilo de ejecución Concepto de concurrencia Se define como el conjunto de anotaciones y técnicas utilizadas para describir mediante programas el paralelismo potencial de los problemas, así como para resolver los problemas de comunicación y sincronización que se presentan cuando varios procesos que se reportan concurrentemente comparten recursos. Una propiedad básica de este tipo de programación es el no determinismo, se desconoce ante un instante de tiempo que va ocurrir en el siguiente instante: En el caso de un único procesador se desconoce si después la ejecución de una instrucción específica habrá alguna interrupción para brindar el procesador a otro proceso. En el caso del sistema multiprocesador las velocidades de los procesadores no están sincronizadas, por lo que se desconoce a priori cuál procesador va ser el primero en ejecutar su siguiente instrucción. Corrección en sistemas concurrentes Por tanto es necesario disponer de un modelo abstracto que permita verificar y corregir los sistemas concurrentes. Cada problema concurrente presenta un tipo distinto de paralelismo, la implementación depende de la arquitectura. Si se requiere trabajar en un ambiente independiente de la arquitectura se debe plantear un modelo para verificar que sea correcto independientemente del hardware en el que se ejecute. Exclusión mutua La exclusión mutua es el mecanismo por medio del cual se asegura que los procesos concurrentes no accedan a un mismo recurso al mismo tiempo, dado que eso puede causar inconsistencia en la información que se procesa. Para evitar errores se puede identificar regiones en donde los procesos tienen que acceder a variables compartidas por lo que se requiere el concepto de región crítica. Región crítica es la zona de código de un proceso concurrente donde se utiliza un recurso compartido. De tal forma que deben determinarse los mecanismos de bloqueo para garantizar que cuando salga uno de sus procesos en ese momento participe otro en el acceso a la región critica. Sincronización Existen tres tipos de procesos: Procesos independientes son aquellos que no se comunican entre sí y por tanto no requieren ponerse de acuerdo ( sincronización). Procesos cooperativos son aquellos que colaboran en la realización de un trabajo, y por tanto es requisito que se comuniquen entre sí y sincronicen sus actividades. Procesos en competencia son aquellos que comparten un número finito R de recursos del sistema por ejemplo periféricos, memoria, capacidades de procesado por tanto deben competir para tener el uso de los recursos del sistema implica que deben comunicarse para sincronizase aunque incluso sus labores sean independientes. La sincronización es la transmisión y recepción de señales que tiene por objeto llevar a cabo el trabajo de un grupo de procesos cooperativos o en competencia. Ejemplo Supongamos que en un entorno LINUX se ejecuta la instrucción cat tema1 tema2 tema3 | wc -l Esta instrucción va a provocar que el intérprete de comandos cree dos procesos concurrentes, el primero ejecutará el programa cat, que concatenará el contenido de los archivos de texto tema1, tema2 y tema3. El segundo ejecutará el programa wc, que contará el número de líneas de la salida producida por cat. Estos dos procesos cooperan, y será preciso algún tipo de sincronización entre ellos, concretamente hasta que cat no produzca alguna salida wc debería bloquearse. Consideraciones sobre el hardware Se tienen dos esquemas de programación: Programación asíncrona que utiliza los multiprocesadores o sistemas distribuidos. Programación síncrona donde se utilizan vectores de procesadores. Clasificación de Flynn (flujo de instrucciones vs número de datos que utilizan) SISD: ejecutan una instrucción a la vez y utilizan un dato a la vez SIMD: ejecuta una instrucción a la vez pero se encuentra procesando más de un dato (se utilizan con paralelismo de grano fino). MISD: ejecuta varias instrucciones a la vez con los mismos datos. MIMD: tienen más de un procesador y cada uno ejecuta un programa diferente con múltiples flujos de datos. Cada procesador tiene acceso a una memoria global que reduce el tiempo de comunicación (se utilizan para grano medio y grano largo), se clasifican: Memoria compartida son multiprocesadores Memoria distribuida son multicomputadoras, clusters o grids. Sistemas Distribuidos Sistemas cuyos componentes hardware y software, que están en computadoras conectados en red, se comunican y coordinan sus acciones mediante el paso de mensajes, para el logro de un objetivo. Se establece la comunicación mediante un protocolo prefijado por un esquema cliente-servidor. Sistemas Distribuidos Características: Concurrencia.- Esta característica de los sistemas distribuidos permite que los recursos disponibles en la red puedan ser utilizados simultáneamente por los usuarios y/o agentes que interactúan en la red. Carencia de reloj global.- Las coordinaciones para la transferencia de mensajes entre los diferentes componentes para la realización de una tarea, no tienen una temporización general, esta más bien distribuida a los componentes. Fallos independientes de los componentes.- Cada componente del sistema puede fallar independientemente, con lo cual los demás pueden continuar ejecutando sus acciones. Esto permite el logro de las tareas con mayor efectividad, pues el sistema en su conjunto continua trabajando. Sistemas de Tiempo Real Es un sistema que interacciona con su entorno físico y responde a los estímulos del entorno dentro de un plazo de tiempo determinado. No basta con que las acciones del sistema sean correctas, sino que, además, tienen que ejecutarse dentro de un intervalo de tiempo determinado Procesamiento Paralelo El objetivo del paralelismo es conseguir un programa inicialmente secuencial en menos tiempo utilizando para ello varios procesadores. Esto se alcanza cuando a partir de un problema grande se realiza una división en subproblemas más pequeños (técnica divide y vencerás) donde cada uno de estos son repartidos entre los procesadores disponibles. Procesamiento Paralelo Para paralelizar resulta necesario plantear una estrategia adecuada de diseño con el objetivo de aumentar la eficiencia del programa, cabe mencionar que en ocasiones: No es posible paralelizar todo el programa El reparto de elementos del programa entre los procesadores no se hace de forma equitativa.