Upload
orial
View
243
Download
0
Embed Size (px)
DESCRIPTION
Concurrencia
Citation preview
Programacin de Sistemas y Concurrencia
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Tema 3: La Programacin Concurrente
como Abstraccin
Contenido
De la programacin secuencial a la programacin concurrente
Beneficios y usos de la programacin concurrente
Problemas de la programacin concurrente:
Instrucciones atmicas
Seccin crtica
Exclusin mutua
Plataformas para la ejecucin concurrente
2
Programacin secuencial
Los lenguajes de programacin secuenciales explotan explcitamente las caractersticas de la mquina que los ejecuta
En cada ciclo del reloj Se trae una instruccin de la memoria
Se decodifica y se envan seales a las componentes del sistema para que se ejecute
CPU
RAM
input output
Mquina Von-Neumann {
x =
y =
if (x < y) z = x;
else z = y;
}
{
x = 0;
y = 0;
}
3
Ejemplo
Si P = p1;p2;;pn es un programa secuencial p1 siempre preceder a p2 (cualquiera que sea la ejecucin), P2 siempre preceder a p3 . pn-1 siempre preceder a pn
Si el smbolo significa precede a y e significa para toda ejecucin, el comportamiento puede formalizarse como e.(p1 p2) (p2 p3) (pn-1 pn)
Este comportamiento se mantiene incluso si el cdigo P tiene instrucciones de seleccin y bucles.
if (b) {A;} else {B;}
e.(b A) (b B) (depende de los datos de entrada)
4
Ejemplo
while (b) {A}
e.b (b B b) (b B b B b)
(el nmero de iteraciones depende de los datos de entrada)
Dado P = p1;p2;;pn Si 0
Programacin concurrente
No todas las instrucciones de un programa tienen que ejecutarse de forma secuencial
{
x = 0;
y = 0;
z = 0;
}
El lenguaje nos obliga a establecer un orden de ejecucin
6
Programacin concurrente
No todas las instrucciones de un programa tienen que ejecutarse de forma secuencial
Este cdigo podra ejecutarse de 6 formas distintas y todas ellas correctas
{
x = 0;
y = 0;
z = 0;
}
{
x = 0;
z = 0;
y = 0;
}
{
y = 0;
x = 0;
z = 0;
}
..
7
Programacin concurrente No todas las instrucciones de un programa tienen que ejecutarse
de forma secuencial
Este cdigo podra ejecutarse de 6 formas distintas y todas ellas correctas
Supongamos que definimos un nuevo operador || para representar este comportamiento
x = 0 || y = 0 || z = 0 = {x = 0 y = 0 z = 0,
x = 0 z = 0 y = 0,
y = 0 x = 0 z = 0,
}
8
Programacin concurrente Supongamos que definimos un nuevo operador || para
representar este comportamiento
Y si tuviramos 3 procesadores?
Podramos asignar cada cdigo a un procesador, obteniendo un comportamiento correcto y una ejecucin posiblemente ms rpida.
Extendemos el significado de P || Q para indicar que existe una ejecucin vlida de P y Q, en la que ambos cdigos se solapan en el tiempo
e. (P Q) (Q P)
9
Programacin Concurrente
Cmo razonamos sobre la ejecucin de P || Q? Podramos exigir la existencia de dos procesadores para que
exista un solapamiento de instrucciones real No es buena idea porque entonces el cdigo de nuestro programa
dependera de la arquitectura subyacente
En su lugar, suponemos que existen un par de procesadores lgicos cada uno ejecutando uno de los cdigos.
Un procesador lgico puede coincidir con uno real, pero qu hacemos si no hay suficientes procesadores?
Supongamos que P = p1 p2 pn y que Q = q1 q2 qm
Cmo puede ser la ejecucin P || Q si slo hay un procesador?
10
Interleaving
Supongamos n = 2 y m = 3: P = p1 p2 y Q = q1 q2 q3
p1 q1
q1 p2 p1 q2
p2 q2 q1
q2
q3
q2
q3
p2 q3
q3 p2
q2 p2
q2
q3
p2 q3
q3 p2
q3
p1
p1
p2
p2 q3
q3 p2
P || Q genera un rbol de ejecucin
Cada camino en el rbol representa una posible ejecucin correcta de P ||Q
En este caso hay 10 posibles ejecuciones (sobre un procesador)
11
Interleaving
Supongamos n = 2 y m = 3: P = p1 p2 y Q = q1 q2 q3
p1 q1
q1 p2 p1 q2
p2 q2 q1
q2
q3
q2
q3
p2 q3
q3 p2
q2 p2
q2
q3
p2 q3
q3 p2
q3
p1
p1
p2
p2 q3
q3 p2
P || Q genera un rbol de ejecucin
Cada camino en el rbol representa una posible ejecucin correcta de P ||Q
La ejecucin secuencial P; Q es una de entre todas las posibles
12
Orden Parcial
Una ejecucin correcta de P || Q (P = p1 p2 pn ,Q = q1 q2 qm ) se obtiene intercalando las instrucciones de P y Q, pero no de cualquier forma
El orden relativo de las instrucciones en P y Q debe mantenerse, Dados dos ndices i, j,
si i < j entonces e. (pi pj) (qi qj) si i < j entonces e. (pi qj) (qj pi)
El orden en P y Q se conserva
Pero no hay orden establecido entre las instrucciones de P y las de Q
13
Orden Parcial
Una ejecucin correcta de P || Q (P = p1 p2 pn ,Q = q1 q2 qm ) se obtiene intercalando las instrucciones de P y Q, pero no de cualquier forma
El orden relativo de las instrucciones en P y Q debe mantenerse, Dados dos ndices i, j,
si i < j entonces e. (pi pj) (qi qj) si i < j entonces e. (pi qj) (qj pi)
14
En cada momento, puede haber varias instrucciones posibles a ser ejecutadas, por lo que la ejecucin paralela es, por definicin, INDETERMINISTA
Las instrucciones de P||Q estn parcialmente ordenadas
Programacin Concurrente
Cmo razonamos sobre la ejecucin de P || Q? Podramos imponer que necesariamente tengamos dos procesadores para
que exista un solapamiento de instrucciones real No es buena idea porque entonces el cdigo de nuestro programa dependera de
la arquitectura subyacente
Suponemos que existen un par de procesadores lgicos cada uno ejecutando uno de los cdigos. Un procesador lgico puede coincidir con uno real, pero
qu hacemos si no hay suficientes procesadores? Intercalamos las instrucciones de P y Q en el procesador
(semntica del interleaving)
Es como si los procesadores lgicos que ejecutan P y Q evolucionaran a velocidades distintas
Por lo tanto, No podemos hacer suposiciones sobre la velocidad relativa entre procesadores
lgicos No podemos hacer suposiciones sobre la velocidad real de ejecucin de los
cdigos sobre los procesadores
15
Programacin Concurrente
Resumiendo,
P || Q representa la ejecucin concurrente de P y Q.
P y Q se llaman procesos/hebras porque se ejecutan concurrentemente con otros procesos
Sin embargo, los cdigo de P y Q se ejecutan secuencialmente
Si P = p1 p2 pn y Q = q1 q2 qm, el nmero total de posibles ejecuciones de P||Q sin tener en cuenta posibles solapamientos de instrucciones es
(m+n)!/m!*n!
Cada posible ejecucin se denomina traza (es un camino en el rbol)
Para que un programa P||Q sea correcto deben serlo todas sus trazas de ejecucin
16
Motivacin
Mejorar el rendimiento de los procesadores
Explotar las arquitecturas multiprocesadores
Simplificar el modelado de sistemas que son concurrentes de forma natural
Obtener ganancias en tiempo.
Ejemplo ordenacin por intercambio
i 8 5 0 3 7 4 2 9 1 3
j
5 8 0 3 7 4 2 9 1 3
i j
0 8 6 3 7 4 2 9 1 3
i j
17
Ejemplo
public class Ordenar{
public static int insercion(int[] vector, int inicio,int fin){
int numOperBasicas = 0;
for (int i = inicio; i vector[j]){
numOperBasicas++;
int aux = vector[i];
vector[i] = vector[j];
vector[j] = aux;
}
}
}
return numOperBasicas; }
18
Ejemplo
public static void main(String[] args){
int[] vector = new int[2000];
Random r = new Random();
for (int i = 0; i
Ejemplo public static void main(String[] args){
int[] vector = new int[2000];
Random r = new Random();
for (int i = 0; i
Ejemplo class HebraO extends Thread{
int[] vector;
int inicio,fin;
public OrdenConc(int[] vector,int i,int j){
this.vector = vector;
inicio = i;
fin = j;
}
public void run() {
Ordenar.insercion(vector, inicio, fin);
}
}
HebraO o1 = new OrdenConc(vector,0,vector.length/ 2);
HebraO o2 = new OrdenConc(vector, vector.length/ 2,vector.length);
o1.start();
o2.start();
//espero que terminen
Ordenar.mezclar(vector,0, vector.length/ 2,vector.length)
21
Ejemplo
Estudio de las complejidades
Si n es el nmero de elementos del vector a ordenar
22
public class Ordenar{
public static int insercion(int[] vector, int inicio,int fin){
int numOperBasicas = 0;
for (int i = inicio; i vector[j]){
numOperBasicas++;
int aux = vector[i];
vector[i] = vector[j];
vector[j] = aux; }
} }
Ejemplo
Si n es el nmero de elementos del vector a ordenar
Caso secuencial: T(n) n2/2
Caso secuencial con dos llamadas: T(n) n2/4 + n
Caso paralelo T(n) n2/8 + n
n2/2 n2/4+n n2/8+n
20 100 120 60
40 800 440 240
1000 500000 251000 126000
T(n) n
23
Comunicacin y Sincronizacin
La comunicacin puede realizarse a travs de la memoria compartida
O a travs de algn mecanismo de paso de mensajes
emisor{
. x = m
}
receptor{
local y
.
y = x
}
Global x
Los procesos en un programa concurrente habitualmente se comunican y sincronizan sus acciones.
emisor{
.
send m to receptor
.
}
receptor{
local y
.
receive y from emisor
.
}
24
Comunicacin y Sincronizacin
La comunicacin puede realizarse a travs de la memoria compartida
emisor{
. x = m
}
receptor{
local y
.
y = x
}
Global x
Los procesos en un programa concurrente habitualmente se comunican y sincronizan sus acciones.
25
El receptor no puede leer su mensaje hasta que el emisor no lo haya enviado
Esto es un ejemplo de una condicin de sincronizacin
Problemas de la programacin concurrente
Instrucciones atmicas Seccin crtica
Exclusin mutua
Ejemplo: Mquinas vendedoras de entradas
Pueden comprarse entradas desde distintas taquillas
26
Problemas de la programacin concurrente
Cada Taquilla es una proceso Ti
Todas las taquillas se ejecutan concurrentemente
Todas las taquillas ejecutan el mismo cdigo
Suponemos que hay un array de booleanos que representa los asientos del teatro
T1 || T2 || || Tn
Cdigo de Tn
while (true){
mostrar butacas libres al usuario
a = //asiento seleccionado
asientos[a] = true
emitir la entrada
}
.
boolean asientos[]
27
Cdigo de T1
while (true){
mostrar butacas libres al usuario
a = //asiento seleccionado
asientos[a] = true
emitir la entrada
}
Ejemplo: Mquinas vendedoras de
entradas
Esta solucin es incorrecta. Es posible que dos personas distintas compren el mismo asiento
Ti: mostrar butacas libres al usuario
Tj: mostrar butacas libres al usuario
Ti: a = ; //asiento seleccionado en la taquilla i, por ejemplo a = 22
Tj: a = ; //asiento seleccionado en la taquilla j, por ejemplo a = 22
Ti: asientos[22] = true
Tj: asientos[22] = true
Ti: emitir la entrada
Tj: emitir la entrada
El asiento 22 se ha vendido a dos clientes distintos
Esto es una traza de ejecucin, un posible camino en el rbol, que muestra un error. Sirve para demostrar que un programa es incorrecto
28
Cdigo de cada taquilla
while (true){
mostrar butacas libres al usuario
a = //asiento seleccionado
asientos[a] = true
emitir la entrada
}
Ejemplo: Mquinas vendedoras de entradas
Aadimos este cdigo para asegurarnos de que cuando se selecciona una butaca est realmente libre
Refinamos el cdigo Cdigo de Ti
while (true){
exito = false;
while (!exito){
mostrar butacas libres al usuario
a=; //asiento seleccionado
if (! asientos[a]) {
asientos[a] = true ;
emitir la entrada
exito = true;
} else {
dar un mensaje de error
}
}
}
29
Ejemplo: Mquinas vendedoras de entradas
TRAZA de ejecucin que muestra el error
Ti: chequea asiento[22] y lo encuentra libre
Tj: chequea asiento[22] y lo encuentra libre
Ti: asientos[22] = true
Tj: asientos[22] = true
Ti: emitir la entrada
Tj: emitir la entrada
Estamos en la misma situacin de antes, salvo que ahora tenemos localizado el problema
30
Cdigo de Ti
while (true){
exito = false;
while (!exito){
mostrar butacas libres al usuario
a=; //asiento seleccionado
if (! asientos[a]) {
asientos[a] = true ;
emitir la entrada
exito = true;
} else {
dar un mensaje de error
}
}
}
Ejemplo: Mquinas vendedoras de entradas
Instrucciones atmicas: las que el procesador realiza sin interrupcin.
Slo las instrucciones mquina son atmicas
load asientos[a] to CPU register
test the value of CPU register
jump to L1 if true
set asientos[a] to true
code for emitir la entrada
cet xito a true
L1: code for mensaje error
L2: code following if statement
>
load asientos[a] to CPU register
test the value of CPU register
jump to L1 if true
set asientos[a] to true
>
code for emitir la entrada
set xito a true
L1: code for mensaje error
L2: code following if statement
y si el cdigo marcado fuera atmico?
31
while (true){
exito = false;
while (!exito){
mostrar butacas libres al usuario
a=; //asiento seleccionado
if (! asientos[a]) {
asientos[a] = true ;
emitir la entrada
exito = true;
} else {
dar un mensaje de error
}
}
}
Ejemplo: Mquinas vendedoras de entradas
Ejemplo: Mquinas vendedoras de entradas
Instrucciones atmicas: las que el procesador realiza sin interrupcin.
Slo las instrucciones mquina son atmicas
>
load asiento[a] to CPU register
test the value of CPU register
jump to L1 if true
set asiento[a] to true
>
code for emitir la entrada
set xito a true
L1: code for mensaje error
L2: code following if statement
TRAZA de ejecucin que muestra el error
Ti: chequea asientos[22] y lo encuentra libre
Tj: chequea asientos[22] y lo encuentra libre
Ti: asientos[22] = true
Tj: asientos[22] = true
Ti: emitir la entrada
Tj: emitir la entrada
Si el cdigo azul fuera atmico la traza errnea ya no ocurrir
32
Ejemplo: Mquinas vendedoras de entradas
Ejemplo: Mquinas vendedoras de entradas
Instrucciones atmicas: las que el procesador realiza sin interrupcin.
Slo las instrucciones mquina son atmicas
>
load asiento[a] to CPU register
test the value of CPU register
jump to L1 if true
set asiento[a] to true
>
code for emitir la entrada
set xito a true
L1: code for mensaje error
L2: code following if statement
33
El nico entrelazado posible ocurre ANTES O DESPUS de
que Ti hay ejecutado el cdigo azul
TRAZA de ejecucin no errnea
Ti: chequea asiento[22] y lo encuentra libre
Ti: asientos[22] = true
Tj: chequea asiento[22] y lo encuentra ocupado
Ejemplo: Mquinas vendedoras de entradas
Instrucciones atmicas: las que el procesador realiza sin interrupcin. Slo las instrucciones mquina son atmicas
Seccin crtica: parte del cdigo de un proceso que debera ejecutarse de forma atmica
Cuando dos secciones crticas de dos procesos no pueden solaparse en el tiempo (su cdigo no puede entrelazarse) se dice que deben ejecutarse en exclusin mutua
Si SCi y SCj son dos secciones crticas de los procesos Ti y Tj, la exclusin mutua significa que e. (SCi SCj ) (SCj SCi )
>
load asiento[a] to CPU register
test the value of CPU register
jump to L1 if true
set asiento[a] to true
>
code for emitir la entrada
set xito a true
L1: code for mensaje error
L2: code following if statement
Seccin crtica
>
load asiento[a] to CPU register
test the value of CPU register
jump to L1 if true
set asiento[a] to true
>
code for emitir la entrada
set xito a true
L1: code for mensaje error
L2: code following if statement
Seccin crtica
34
Plataformas
Sistemas monoprocesadores La concurrencia siempre se implementa utilizando el entrelazado
de las instrucciones de los procesos.
Es til para dar servicio a varios usuarios desde la misma mquina
Se aprovechan los ciclos del procesador mientras que est realizando operaciones de entrada/salida
Todos los procesos comparten memoria, por lo que la comunicacin se realiza de forma natural a travs de esta memoria compartida.
Tambin es posible modelar sistemas de memoria distribuida en los que los procesos se comunican a travs del paso de mensajes.
35
Plataformas
Multiprocesadores fuertemente acoplados
Es posible tener paralelismo real
Los procesos se comunican de forma natural a travs del espacio de memoria comn que comparten
Cada procesador puede tener a su vez memoria local
Normalmente a cada CPU le corresponde ms de un proceso
En este tipo de arquitectura hay buenas ganancias en tiempo por la ejecucin paralela y porque el costo de comunicaciones es bajo.
CPU CPU CPU CPU
RAM
36
Plataformas
Multiprocesadores dbilmente acoplados (Sistemas distribuidos)
En esta arquitectura hay concurrencia real
Cada nodo de la red podra ser un monoprocesador o un multiprocesador fuertemente acoplado
La comunicacin se realiza de forma natural mediante paso de mensajes a los procesos
El coste de las comunicaciones en esta arquitectura es relevante, y puede degradar las ganancias en tiempo obtenidas debido a la ejecucin paralela
CPU CPU CPU CPU
RAM RAM RAM RAM
37