Programación Concurrente DAI - UNSAAC.

Download Report

Transcript Programación Concurrente DAI - UNSAAC.

Programación Concurrente
DAI - UNSAAC.
MOTIVACION
 Se ha preguntado alguna
vez, de cómo se realizan
los siguientes sistemas?
Simulador de vuelos
Sistemas de tiempo real
Modelamiento y
simulacion
Robotica
Juegos de video
¿Que es la
Concurrencia?
 Definición Real Academia Española.
Acaecimiento o concurso de varios sucesos
en un mismo tiempo.
 Una forma de ver la concurrencia es
como un conjunto de actividades que
se desarrollan en forma simultánea.
 En informática cada una de esas
actividades se suele llamar proceso.
¿Que es la
Concurrencia? (cont.)
 En informática se habla de
concurrencia cuando hay una
existencia simultánea de varios
procesos en ejecución.
 Ojo.... existencia simultánea no
significa ejecución simultánea.
Trataremos de explicar esto con el sgte. Ejemplo:
El amigo Waldo quiere poner en práctica la siguiente receta:
1.Verter ingrediente uno y dos en un
recipiente y batir durante 10 minutos.
2.Dejar reposar 2 minutos.
3.Mezclar el ingrediente tres y cuatro en
otro recipiente y batir durante 5 minutos.
4.Calentar 2 minutos
5.Verter la mezcla 1 con la 2.
6.Dejar enfriar y servir.
Waldo advierte que hay varias formas de llevarlo a
cabo:
1. Un paso tras otro de tal forma que el siguiente no
se completa hasta terminar el anterior, es decir en
forma SECUENCIAL
Moment Acciones
o
M1
1) Verter ingrediente uno y dos y batir 10 min.
M2
2) Dejar reposar 2 minutos.
M3
3) Mezclar ingredientes tres y cuatro y batir 5 min.
M4
4) Calentar 2 min.
M5
5) Verter mezcla 1 con la 2
M6
6) Dejar enfriar y servir
2. Un paso tras otro, pero si es posible, no es
necesario que un paso anterior se haya
concluido. Ejecución CONCURRENTE.
Momento
Acciones
M1
1) Verter ingredientes uno y dos y batir durante 5 minutos
(faltan 5 min. por batir)
1) Mezclar ingredientes tres y cuatro y batir durante 3
minutos (faltan 2 min. por batir).
1) Batir ingredientes uno y dos por los 5 minutos que
faltan.
M2
M3
M4
1) Dejar reposar por 2 minutos
2) Completar el batido por 2 minutos de los ingredientes
tres y cuatro.
M5
M6
M7
4) Calentar por 2 minutos.
5) Verter mezcla 1 con la 2
6) Dejar enfriar y servir
3. Waldo, se da cuenta que puede realizar la receta
más rápido si pide ayuda a su amigo Arturo; así
que lo llama y se reparten el trabajo de la
siguiente manera: (ejecucion PARALELA)
Mom. Acciones de Waldo
M1
Acciones de Arturo
1) Verter ingrediente uno y Mezclar el ingrediente tres y
dos en un recipiente y
cuatro en otro recipiente y
batir 10 minutos.
batir por 5 minutos.
M2
(continúa el paso 1)
M3
1) Dejar reposar 2 min.
(no hace nada)
M4
5) Verter la mezcla 1 con la
dos
(no hace nada)
M5
(no hace nada)
1) Calentar 2 minutos
6) Dejar enfriar y servir
EJECUCION SECUENCIAL
P1
P2
Tiempo
EJECUCION CONCURRENTE
P1
P2
Tiempo
EJECUCION PARALELA
P1
P2
Tiempo
Procesador
Es un dispositivo hardware capaz de
ejecutar las instrucciones de un proceso.
Un procesador puede ejecutar una sola
instrucción de un programa a la vez.
Existen computadores que tienen un solo
procesador y a los cuales se les denomina
monoprocesador y a las computadoras
que poseen varios procesadores se les
llama multiprocesador.
Proceso
Cuando el computador ejecuta un
conjunto de instrucciones, se dice que
esta realizando un proceso o tarea, por
lo que un proceso es una secuencia de
instrucciones o sentencias que se
ejecutan secuencialmente en un
procesador
Hilo
En un entorno multitarea a las tareas
se les llama procesos pesados, en un
entorno multihilo se les denomina
procesos ligeros o hilos. La diferencia
es que os procesos pesados están en
espacios de direccionamiento distintos.
La comunicación entre procesos y el
cambio de contexto es muy caro. Por el
contrario, los hilos comparten el mismo
espacio de direcciones y comparten
cooperativamente el mismo proceso
pesado
Proceso e Hilo
hilos
Proceso
Pesado
1
Proceso
Pesado
3
PROCESADOR
Estados de los procesos
INICIAL
Creación
Ocurre Evento
LISTO
BLOQUEADO
Despachar
Desalojar
FINALIZADO
EJECUCION
Espera Evento
Terminar
Ejecucion de los
procesos
 Habiamos dicho que en informatica se
habla de concurrencia cuando hay
una existencia simultánea de varios
procesos en ejecución.
 Pero no se dijimos nada que si esos
procesos se ejecutan sobre un solo
procesador o varios procesadores.
 Para aclarar este concepto nos
pondremos un ejemplo simple:
Programacion
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)
Programacion
Concurrente.
 Tradicionalmente estuvo asociada al mundo de
losSistemas Operativos
 Primeros programas concurrentes:
✔ Diferentes partes del SO en ejecución sin un orden
predecible y compartiendo variables => nuevos
problemas
 Tres hitos importantes marcan su evolución:
✔
Hilo
✔
Aparición de lenguajes de alto nivel que da
soporte a la P.C.
✔
La aparición de Internet
Programacion
Concurrente.
 EL trabajar con procesos concurrentes añade
complejidad a la tarea de programar
 ¿cuáles son entonces los beneficios que aporta
la programación concurrente?
Beneficios de la
Programación
Concurrente



Mejor aprovechamiento de la CPU
Velocidad de ejecución
Solución de problemas de naturaleza
concurrente
 Sistemas de control
 Tecnologías web
 Sistemas de Tiempo Real
 Simulación
 SGDB
Características de los
Programas 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.
 Ejemplo: P, Q
✗ P: < p1
p2
p3 ...
pm >
✗ Q: < q1
q2
q3 ...
qn >
 Secuencial
 < p1
p2
p3 ...
pm q1 q2
q3 ...
qn >
Orden de Ejecución de
las instrucciones
 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.
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.
Peculiaridades de los
programas concurrentes
 Los programas concurrentes pueden no
terminar nunca y al mismo tiempo ser
correctos.
 Unprograma concurrente puede tener
múltiples secuencias de ejecución.
 Cuando se dice que un programa concurrente
es correcto, seentiende que se refiere a todas
sus posibles secuencias de ejecución.

secuencias de ejecución
Problemas inherentes a
la Programación
Concurrente
 Exclusión Mutua
 Condición de Sincronización
 Verificación.
Exclusión Mutua
 Si dos hilos P1 y P2 utilizan una variable
compartida X, y ambos desean realizar alguna
actualización de ésta en alguna parte de su
código, tendríamos:
Hilo P1
inicio
....
X <-- X+1
....
fin
Hilo P2
inicio
....
X <-- X+1
....
fin
¿Cuál será el resultado?
inicio
X <-- 0
P1
P2
....
JuntarHilos
escribir X
fin
Exclusión Mutua
¿en que consiste el
problema?
Un lenguaje de alto nivel facilita la programación
mediante la abstracción de operaciones máquina en
operaciones de alto nivel. Asi, una operación como:
A:= A+1
se traduce en el siguiente conjunto de operaciones
atómicas.
LOAD A, R
ADD
R, 1
STORE R, A
Exclusión Mutua
En la ejecución del ejemplo podría darse el siguiente
escenario:
P1:
P2:
P1:
P2:
P1:
P2:
LOAD
LOAD
ADD
ADD
STORE
STORE
RP1,X
RP2,X
RP1,1
RP2,1
RP1,X
RP2,X
por lo que el resultado del programa podría ser
incorrecto.
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
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, éstas
son las que realmente se ejecutan
concurrentemente.
 En el paradigma secuencial este hecho carece
de importancia pero en ejecuciones
concurrentes el resultado puede ser incorrecto.
Exclusión Mutua
 Garantía de que un único proceso o hilo
accede a un recurso en un determinado
instante
Exclusión Mutua
Solución general:
inicio
.....
.....
<Fase de negociación>
Sección – Crítica
<Fase de liberación>
......
......
fin
Soluciones de la Exclusión
Mutua Primer Algoritmo
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
repetir
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
repetir
hasta que acceso=1
{sección crítica}
acceso=2
fin
fin
hasta que acceso=1
{sección crítica}
acceso=2
fin
fin
acceso: entero en el rango 1..2 con valor inicial 1
Primer algoritmo
(comentario)
La solución anterior es incorrecta porque ambos
procesos examinan y actualizan una única variable
global. Así, si uno de los procesos “muere” se
producirá una situación de bloqueo en el otro.
Para solventar esta situación, podemos pensar en
que cada proceso actúe sobre su propia variable,
como se muestra en la figura siguiente.
Soluciones de la
Exclusión
Mutua
Segundo Algoritmo
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
repetir
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
repetir
hasta que C2=1
C1=0
{sección crítica}
C1=1
fin
fin
hasta que C1=1
C2=0
{sección crítica}
C2=1
fin
fin
C1, C2: entero en el rango 0..1 con valor inicial 1
Segundo Algoritmo
(comentario)
Cada proceso Pi asigna a la variable Ci el valor 0 cuando desea
entrar en su sección crítica y el valor 1 Ci cuando la ha concluido.
De esta manera, mientras un proceso no está en su sección crítica
el valor de las variables de control es 1, con lo que si el proceso
entra en un estado de halt el resto puede seguir trabajando. Ahora
bien, aunque este segundo algoritmo garantiza la ausencia de
bloqueos,no existe exclusión mutua, ya que los dos procesos
pueden alcanzar sus secciones críticas simultáneamente.
En la figura anterior, cuando un proceso concluye el bucle de
espera, inicia una secuencia de instrucción que permiten alcanzar
sin ninguna prevención su sección crítica. Este conjunto de
acciones puedne no ser, no lo son de hecho, atómicas. Por tanto el
error está en no considerar las actuaciones sobre las variables de
control como sección crítica.
Para solucionarlo se puede utilizar el siguiente algoritmo,
Soluciones de la
Exclusión
Mutua
Tercer Algoritmo
Hilo P2
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
C1=0
repetir
hasta que C2=1
{sección crítica}
C1=1
fin
fin
inicio
mientras true hacer
inicio
{sección no crítica}
C2=0
repetir
hasta que C1=1
{sección crítica}
C2=1
fin
fin
C1, C2: entero en el rango 0..1 con valor inicial 1
Soluciones de la
Cuarto Algoritmo
Exclusión
Mutua
Hilo P1
inicio
mientras true hacer
inicio
{sección no crítica}
C1=0
repetir
C1=1
C1=0
hasta que C2=1
{sección crítica}
C1=1
fin
fin
Hilo P2
inicio
mientras true hacer
inicio
{sección no crítica}
C2=0
repetir
C2=1
C2=0
hasta que C1=1
{sección crítica}
C2=1
fin
fin
Algoritmo de Dekker
Hilo p1
inicio
{sección no crítica}
C1 = 0
repetir
if Acceso = 2
entonces
inicio
C1 = 1
repetir
hasta Acceso = 1
C1 = 0
fin
hasta que C2 = 1
{sección critica}
C1 = 1
Acceso = 2
fin
Hilo p2
inicio
{sección no crítica}
C2 = 0
repetir
if Acceso = 1
entonces
inicio
C2 = 1
repetir
hasta Acceso = 2
C2 = 0
fin
hasta que C1 = 1
{sección critica}
C2 = 1
Acceso = 1
fin
C1, C2: enteros en el rango 0..1 con valor inicial 1
Acceso: entero en el rango 1..2 con valor inicial 1
Propiedades de la
Programación
Concurrente
 Propiedades de seguridad (safety)
 Exclusión mutua
 El acceso con exclusión mutua a secciones críticas
esta garantizado
 Sincronización
 los procesos cumplen con las condiciones
de sincronización impuestos por el
algoritmo
 Interbloqueo (pasivo) – deadlock
 no se produce una situación en la cual todos
los procesos participantes quedan
atrapados en una espera a una condición
Propiedades de la
Programación
Concurrente
 Propiedades de vivacidad (liveness)
 Interbloqueo (activo) – livelock
 puede ocurrir el caso que varios procesos
están continuamente competiendo por un
recurso de forma activa, pero ningúno de
ellos lo consigue (``livelock'')
 Inanición – starvation
 un proceso puede ``morirse'' por inanición
(``starvation''), es decir, un proceso o
varios procesos siguen con su trabajo pero
otros nunca llegan a utilizar los recursos
por ser excluido de la competición por los
MECANISMOS DE
COMUNICACION Y
SINCRONIZACION




SEMAFOROS
REGIONES CRITICAS CONDICIONALES
MONITORES
MENSAJES
SEMAFOROS
 Es un mecanismo introducido por Dijkstra
y su aplicación permite controlar el acceso
exclusivo a recursos compartidos
 Su aplicación tambien permite la
sincronización entre procesos
 Esta formado de un contador y una cola
asociada de procesos o hilos en espera
 Las operaciones básica sobre el contador
son Wait o P y Signal o V
TAD Semaforo
Nombre del TAD: Semaforo
Descripción Genérica del TAD:
Un semáforo es un tipo de datos abstracto que permite el uso de un
recurso de manera exclusiva cuando varios procesos están
compitiendo.
Descripción Formal del TAD
Nombre: Semaforo
Elementos:
Semaforo(entero, lista)
Donde:
entero: contador del semaforo, numero entero mayor o igual a 0
lista : lista de procesos o hilos.
TAD Semaforo
Conjunto de Operaciones:
Semaforo (lista)
------> Semaforo
Semaforo (entero x lista) ------> Semaforo
Wait
------> Lista
Signal
------> Lista
Descripción de las Operaciones:
Constructores.
Semaforo (lista) : crea un semaforo con valor inicial 0
Semaforo (entero x lista) : crea un semaforo con un valor inicial
mayor a cero
TAD Semaforo
Operaciones Primitivas.
Wait : si el contador del semáforo es igual a 0
entonces
se lleva el proceso que realiza la operación a la cola
asociada con el semáforo suspendiendo su ejecución y
abandonando el procesador a favor de otro proceso
sino
se decrementa el valor del contador del semaforo en
una unidad y el proceso que realiza la operación sigue
ejecutándose. Esta operación debe ser indivisible
TAD Semaforo
Signal : se incrementa el valor del contador del semaforo
en una unidad . Esta operación debe ser indivisible.
Se toma uno de los procesos que esperan en la cola del
semáforo (si hubira) y se le pone en un estado de preparado
para ejecutarse. El proceso que realiza la operación sigue
ejecutándose
Semaforos
Solución al Problema de la exclusión mutua
Hilo P1
inicio
mientras verdad hacer
inicio
{sección no crítica}
wait(mutex)
{sección crítica}
signal(mutex)
fin
fin
Hilo P2
inicio
mientras verdad hacer
inicio
{sección no crítica}
wait(mutex)
{sección crítica}
signal(mutex)
fin
fin
Tipos de Semáforos
 Semáforos binarios.
 Toman valores de 0, 1
 Semáforos generales.
 Toman valores de 0,1,2,3,4.....n
Problema de
Productores y
consumidores
PROCESO consumidores;
PROCESO productores
VAR cdato : dato;
VAR pdato : dato;
inicio
inicio
mientras true hacer
mientras true hacer
inicio
inicio
wait(consumir);
wait(producir);
wait(cs);
pdato := producir();
cdato:= buffer[sal];
wait(ps);
sal := (sal mod MAX) + 1;
buffer[ent]:= pdato;
signal(cs);
ent := (ent mod MAX) + 1;
signal(producir);
signal(ps);
consumir(cdato);
signal(consumir);
fin
fin
fin; (* Consumidores *)
fin; (* Productores *)
Inicio {programa principal}
initial(ps,1);
CONS
initial(cs,1);
MAX = .. ; (* Cap. Buffer *)
initial(consumir,0);
TYPE
initial(poducir,MAX);
dato: .. ; (* Tipo de datos*)
ent:=1; sal:=1;
VAR
{ejecutar concurrentemente}
buffer :array[1..MAX]of dato;
productores;
producir, consumir:semaforo;
consumidores
ps, cs: semaforo;
ent, sal: integer;
fin. (* principal *)