2 AE AyED Apunte2
-
Upload
gastondiaz -
Category
Documents
-
view
216 -
download
2
description
Transcript of 2 AE AyED Apunte2
18/11/2012
1
Universidad Autónoma de Entre Ríos Facultad de Ciencia y Tecnología Licenciatura en Sistemas de Información
Algoritmos Concurrentes Cátedra “Algoritmos y Estructuras de Datos”
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
Arrancamos en lo conceptual: ¿Qué es la Concurrencia?
Definición Real Academia Española: “Acaecimiento de
varios sucesos en un mismo tiempo”.
Una forma de ver la concurrencia es como un conjunto
de actividades que se desarrollan de forma simultánea.
En informática, cada una de esas actividades se suele
llamar proceso.
Hablamos entonces de concurrencia cuando hay una existencia simultánea de varios procesos en ejecución.
Momento! Algoritmo; Programa; Proceso…?
Conjunto de Instrucciones + Orden de Ejecución = Algoritmo.
Algoritmo + Estructura de Datos =
Programa. [Estático, Clase]
Programa Ejecutándose = Proceso.
[Dinámico, Objeto, Instancia con Estado]
Ejemplo: 1 Programa 3 Instancias
18/11/2012
2
Más formalmente: ¿Qué es la 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”.
No Confundir
Ojo! Existencia simultánea no implica ejecución
simultánea
Dependerá del hardware subyacente.
El paralelismo es un caso particular de la concurrencia.
Se habla de paralelismo cuando ocurre la ejecución
simultánea de instrucciones. Implica:
Arquitecturas paralelas.
Procesamiento paralelo.
Algoritmos paralelos.
Programación paralela.
Una Clasificación para los Procesos
Independientes Cooperantes
Entonces…
En nuestros sistemas pueden coexistir varios
procesos que pueden pertenecer al mismo o distintos programas.
En algunas circunstancias estos procesos cooperan y en otras compiten.
Estas tareas de colaboración y competencia exigen mecanismos de Comunicación y Sincronización entre procesos para establecer una administración
de los recursos que utilizarán.
Del estudio de estos mecanismos de coordinación y comunicación se trata la “Programación
Concurrente”.
Programación Concurrente
“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 (comunicación y sincronización)”.
Programación Concurrente (PC) Tradicionalmente estuvo asociada al mundo de los
Sistemas Operativos (SO).
Eran rutinas que formaban parte del SO:
Evolución plataformas hardware.
El SO tenía diferentes partes en ejecución sin un orden
predecible y compartiendo variables => surgen nuevos
problemas.
Se aplicaban soluciones específicas “artesanales”.
Tres hitos importantes marcan su evolución:
El concepto de Hilo.
La aparición de lenguajes de alto nivel que dió soporte a la
PC.
La aparición de Internet que es un campo fértil para este
tipo de procedimientos.
18/11/2012
3
Una primer Clasificación para Programas Concurrentes
Sistemas Inherentemente Concurrentes: El entorno
con el que interactúan, o el entorno que modelan tiene forzosamente actividades simultáneas.
Ejemplos:
Red de cajeros automáticos.
Sistemas de gestión de inventarios distribuidos.
Sistemas Potencialmente Concurrentes: No es estrictamente necesario que haya concurrencia, pero se puede sacar partido de ella.
Ejemplos:
Aumentar la velocidad de ejecución.
Sistemas de detección de riesgos.
La PC añade una gran complejidad a la tarea de programar y requiere de
condiciones particulares subyacentes que deben ser evaluadas con mucho cuidado.
Surge la pregunta entonces: ¿Por qué debería pagar este costo para la
realización de programas concurrentes?
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
Beneficios de la Programación Concurrente
Aprovechamiento de la CPU.
Velocidad de ejecución.
Factibilidad de solución a problemas de naturaleza concurrente:
Sistemas de Control. Recolección simultanea de datos.
Tecnologías Web. Atención de múltiples conexiones.
Aplicaciones basadas en interfaces de usuarios.
Simulación. Comportamiento autónomo independiente.
SGBD. Atención a múltiples usuarios.
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
Concurrencia y Arquitecturas de Hardware
Arquitecturas que soportan la programación concurrente:
Sistemas con un solo procesador
(sistemas monoprocesador).
Sistemas con más de un procesador
(sistemas multiprocesador).
18/11/2012
4
Sistemas Monoprocesador
No hay paralelismo. Los procesos se reparten el
procesador: entrelazado (interleaving).
¿Quién planifica los procesos?
El sistema operativo.
El propio ejecutable (gracias al compilador) -> runtime
scheduler (RTSS).
Todos los procesos comparten la misma memoria.
Forma “natural” de sincronizar y comunicar procesos =>
Variables Compartidas.
Sincronización y Comunicación
Sistemas Multiprocesador
Más de un procesador. Permite que exista un paralelismo
real entre los procesos.
Igualmente lo más frecuente es tener más procesos que
procesadores con lo que sigue siendo necesaria la
utilización de mecanismos para la concurrencia.
Clasificación de los Sistemas Multiprocesador:
Estrechamente acoplados (multiprocesadores).
Débilmente acoplados (sistemas distribuidos).
Sistemas Estrechamente Acoplados
Los procesadores comparten memoria y bus.
Ventaja:
Aumento de velocidad de procesamiento con bajo coste.
Inconveniente:
Escalable sólo hasta decenas o centenares de procesadores.
Sistemas Estrechamente Acoplados
La sincronización y comunicación entre procesos hace
mediante variables compartidas.
Sistemas Débilmente Acoplados o Sistemas Distribuidos
Múltiples procesadores conectados mediante una red.
Los procesadores no comparten memoria
ni reloj.
Los sistemas conectados pueden ser de
cualquier tipo.
Escalable hasta millones de procesadores
(por ejemplo en Internet).
18/11/2012
5
Ventajas de los Sistemas Débilmente Acoplados o Sistemas Distribuidos
Compartición de recursos dispersos.
Ayuda al trabajo cooperativo de equipos humanos.
Aumento de velocidad de ejecución.
Escalabilidad ilimitada.
Aumento de fiabilidad:
Tolerancia a fallos (fault tolerance).
Alta disponibilidad (hight availability).
Sistemas Débilmente Acoplados o Sistemas Distribuidos
La forma natural de comunicar y sincronizar procesos es
mediante el uso de paso de mensajes.
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
¿Qué se puede ejecutar concurrentemente?
Analicemos los siguientes casos:
X = X + 1
X = X + 2
X = 1
Y = 2
Z = 3
¿Qué se puede ejecutar concurrentemente?
Condiciones de Bernstein.
L(Sk) = {a1, a2, …..an}, como el conjunto de lectura del
conjunto de instrucciones Sk. Formado por todas las
variables cuyos valores son referenciados (se leen)
durante la ejecución de las instrucciones en Sk.
E(Sk) = {a1, a2, …..an}, como el conjunto de escritura del conjunto de instrucciones Sk. Formado por todas las
variables cuyos valores son referenciados (se escriben)
durante la ejecución de las instrucciones en Sk.
Para que dos conjuntos de instrucciones
Si y Sj se puedan ejecutar
concurrentemente, se tiene que cumplir:
Cómo?! Veamos un ejemplo…
Partimos de un conjunto de instrucciones dado.
Utilizando las condiciones de Bernstein veremos qué
sentencias pueden ejecutarse de forma concurrente y
cuáles no. Para ello, en primer lugar calculamos los
conjuntos de lectura y escritura.
Aplicamos las condiciones de Bernstein a cada par de sentencias lo que nos va a dar cuales de ellas pueden
ser ejecutadas en paralelo.
18/11/2012
6
Si tenemos
Representación
De todo esto se deduce la siguiente tabla en la que
puede verse qué pares de sentencias pueden ejecutarse
de forma concurrente:
Especificación de Ejecución Concurrente mediante Grafo
¿Cómo especificar la Concurrencia?
Técnicas para producir actividades concurrentes en el
computador.
De forma manual.
Trabajar directamente sobre el hardware.
Usar llamadas al sistema o bibliotecas de software
(por ejemplo pthreads).
Expresarla en un lenguaje de alto nivel.
De forma automática.
El sistema operativo se encarga automáticamente
(pro ejemplo multiprogramación).
El compilador detecta la concurrencia implícita en
nuestros programas secuenciales.
Lenguajes de Alto Nivel (LAN)
Los LAN permiten programar en un nivel más cercano al ámbito del problema
(problem domain) por medio de la abstracción.
Además, los lenguajes y el SO proporcionan herramientas para usar con
más comodidad los recursos del hardware.
Abstracción de la Concurrencia
Nuestro programa expresa acciones concurrentes (procesos o hilos), pero
éstas no tienen por qué ejecutarse en paralelo.
Cada proceso concurrente se ejecuta sobre un procesador virtual.
El compilador y el SO serán responsables
de ejecutar nuestros procesos como consideren más oportuno.
18/11/2012
7
Lenguajes Concurrentes
Aquellos que incorporan características que permiten expresar la concurrencia
directamente, sin recurrir a servicios del SO, bibliotecas, etc.
Normalmente incluyen mecanismos de sincronización y comunicación entre
procesos.
Ejemplos: Ada, Java, SR, Occam, PARLOG.
Sentencias COBEGIN-COEND
Todas aquellas acciones que puedan ejecutarse
concurrentemente las introducimos dentro del par
cobegin/coend. El ejemplo anterior quedaría de la
siguiente forma:
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
Características de los Sistemas Concurrentes
Orden de ejecución de las instrucciones.
Indeterminismo.
Orden de Ejecución de las Instrucciones
La programación secuencial
define un orden total de
las instrucciones => Ante
un conjunto de datos de
entrada el flujo de ejecución
es siempre el mismo.
Un programa concurrente
define un orden parcial de
ejecución => Ante un
conjunto de datos de
entrada no se puede saber
cual va a ser el flujo de
ejecución.
Indeterminismo
El orden parcial implica el no determinismo de los programas
concurrentes.
Es decir, puede producir diferentes resultados cuando se ejecuta repetidamente sobre el mismo conjunto
de datos de entrada.
18/11/2012
8
Ejemplo:
¿Qué valor tendrá la x cuando termine el programa?
Indeterminismo
El no determinismo es una propiedad inherente a la concurrencia.
Por culpa del no determinismo, es más
difícil analizar y verificar un algoritmo concurrente
Ojo! que existan varias posibilidades de salida NO significa necesariamente que un
programa concurrente sea incorrecto.
Contenidos
Introducción.
Beneficios de la programación concurrente.
Concurrencia y arquitecturas de hardware.
Especificación de ejecución concurrente.
Características de los sistemas concurrentes.
Problemas inherentes a la programación
concurrente.
Problemas Inherentes a la Programación Concurrente
Exclusión Mutua.
Sincronización.
Exclusión Mutua
Problema derivado de la abstracción en los
lenguajes de alto nivel.
Una instrucción de alto nivel se convierte en un conjunto de instrucciones máquina. Son las que realmente se ejecutan concurrentemente.
En el paradigma secuencial este hecho carece de importancia pero en ejecuciones concurrentes de instrucciones el resultado puede ser incorrecto.
Exclusión Mutua
Sección crítica: porción de código con variables
compartidas y que debe ejecutarse en exclusión mutua.
Los lenguajes concurrentes deben proporcionar
herramientas para resolver este tipo de problemas.
18/11/2012
9
Condición de Sincronización Vamos derecho con un ejemplo…
Tres procesos cuyo comportamiento es el siguiente:
Lector, que va almacenando en un buffer las imágenes
capturadas desde una cámara.
Gestor, que va recogiendo las imágenes desde el buffer,
las trata y las va colocando en una cola de impresión.
Impresor, que va imprimiendo las imágenes colocadas
en la cola de impresión.
Supongamos que los tres procesos se ejecutan de manera concurrente en un bucle
infinito como se muestra aquí:
¿Qué ocurre cuando el proceso lector o el proceso gestor
tratan de poner una imagen y el buffer o la cola están
llenos?
¿Qué ocurre cuando el proceso gestor o el proceso
impresor tratan de obtener una imagen y el buffer o la cola están vacíos?
Condición de Sincronización
Muchas posibilidades diferentes en cuanto al orden de
ejecución.
Sin embargo, pueden ser necesarias ciertas restricciones
en el orden de ejecución.
La sincronización entre procesos puede definirse como la
necesidad que tienen algunos procesos de bloquearse en determinadas circunstancias y ser despertados cuando
ocurren ciertos eventos.
Bibliografía
"Programción Concurrente"
J. Tomás, M. Garrido, F. Sánchez, A. Quesada, 2003
Capítulo 1 y 2
"Principles of Concurrent and Distributed Programming"
M. Ben-Ari. Prentice Hall, 1990
Capítulo 1 y 2
"Concurrent Programming"
A. Burns, G Davis. Addison-Wesley, 1993
Capítulo 1