Académique Documents
Professionnel Documents
Culture Documents
Introduccin
El concepto fundamental de la programacin concurrente es la nocin de Proceso. Proceso: Clculo secuencial con su propio flujo de control. La concurrencia en software implica la existencia de diversos flujos de control en un mismo programa colaborando para resolver un problema.
Procesos Secuenciales
Un proceso tradicional, correspondiente a un programa secuencial, es un proceso que posee un nico hilo de control.
El Elcontador contadorde deprograma, programa,el el estado estadode dela lapila pilay yde delos los objetos objetosdefinen definenel elestado estado del sistema. del sistema.
Procesos Concurrentes
Un programa concurrente da lugar, durante su ejecucin, a un proceso con varios hilos de ejecucin.
Variosflujos flujos(caminos) (caminos)de de Varios control control
Elegir sitio Contratar arquitecto Desarrollar plano Ofertar plano [aceptado] Realizar trabajo en el terreno Hacer trabajo comercial()
[no aceptado]
Terminar construccin
Tipos de concurrencia
Concurrencia Fsica: 9 Existe ms de un procesador y varias unidades (hilos) de un mismo programa se ejecutan realmente de forma simultnea. Concurrencia Lgica: 9 Asumir la existencia de varios procesadores, aunque no existan fsicamente. El implementador de tareas del lenguaje se encargar de mapear la concurrencia lgica sobre el hardware realmente disponible. La concurrencia lgica es ms general, pues el diseo del programa no est condicionado por los recursos de computacin disponibles.
Lenguajes de Programacin - Progr. Concurrente 8
10
11
12
Concurrencia en un Programa
Desde el punto de vista de la programacin, interesa la concurrencia lgica que puede existir en el interior de un programa. Un Lenguaje de Programacin ser concurrente si posee las estructuras necesarias para definir y manejar diferentes tareas (hilos de ejecucin) dentro de un programa. 9 Ejemplos: Java, Ada El compilador y el SO sern los responsables de mapear la concurrencia lgica del programa sobre el hardware disponible.
13
Sincronizacin de tareas
La Sincronizacin es el mecanismo que controla el orden en que se ejecutan las tareas. Tipos de Sincronizacin: 9 Cooperacin: La tarea A debe de esperar que la tarea B finalice alguna actividad para poder continuar con su ejecucin. 9 Competicin: La tarea A necesita acceder a un dato x mientras la tarea B est accediendo al mismo. La tarea A debe de esperar a que la tarea B finalice su uso de x para poder continuar.
14
15
16
Sincronizacin (Ejemplo)
Memoria TOTAL Registro1 Registro2
17
Hilo A TOTAL ++
18
19
20
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL)
21
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2
22
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL)
23
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2
24
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2 (iii) Almacenar (TOTAL)
25
Sincronizacin (Ejemplo)
Memoria TOTAL Registro1 Registro2
26
Hilo A TOTAL ++
27
28
Hilo A TOTAL ++ (i) Recuperar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL)
29
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 Hilo B TOTAL *=2 (i) Recuperar (TOTAL)
30
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2
31
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2
32
Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2 (iii) Almacenar (TOTAL)
33
Recuperar (TOTAL)
Inicio
TOTAL
Fin
Tarea B TOTAL *= 2;
Recuperar (TOTAL) Multiplicar por 2
34
35
Semforos
Dijkstra, 1965. Un semforo es una estructura de datos que consiste en: 9 Un valor entero. 9 Una cola de tareas (descriptores): Los descriptores de tareas almacenan la informacin relevante sobre el estado de ejecucin de la tarea. Para establecer limitacin de acceso a los datos, se establecen protecciones (semforo) en las operaciones de acceso a dichos datos. Las protecciones (semforos) deben permitir acceder a los datos slo a una tarea en un instante determinado.
Lenguajes de Programacin - Progr. Concurrente 36
Semforos (2)
Una parte importante del mecanismo de proteccin consiste en asegurar que todos los intentos de acceso a los datos protegidos se llevarn a cabo en algn momento: 9 Cola de tareas. Las nicas operaciones permitidas en los semforos son: 9 P (del holands passeren): esperar 9 V (del holands vrygeren): avisar
37
38
Problemas: 9 El Productor genera valores ms rpidamente de lo que los consume el Consumidor el buffer se llena. 9 El Consumidor requiere valores ms rpidamente de lo que los produce el Productor el buffer se vaca.
Lenguajes de Programacin - Progr. Concurrente 39
Esperaa aque queexistan existan Espera posiciones libres enel el posiciones libres en buffer,mientras mientrastanto tantola la buffer, tareaest estbloqueada. bloqueada. tarea
Esperaa aque queexistan existan Espera posiciones ocupadas enel el posiciones ocupadas en buffer,mientras mientrastanto tantola la buffer, tareaest estbloqueada. bloqueada. tarea
40
Ejemplo (3)
Hay 2 aspectos a proteger sobre el acceso al buffer: 9 posLibres (necesaria para el Productor) 9 posOcupadas (necesaria para el Consumidor) Se realiza la proteccin mediante 2 semforos:
class Semaforo { private int cont; private ColaTareas cola; public esperar (); public avisar (); }
posLibres
posOcupadas
41
Ejemplo (4)
posLibres: cont cuantas posiciones libres hay disponibles en el buffer cola las tareas que estn esperando poder almacenar datos en el buffer posOcupadas: cont cuantas posiciones ocupadas (datos) hay disponibles en el buffer cola las tareas que estn esperando poder extraer datos en el buffer
42
Esperar / Avisar
esperar () { if ( this.cont > 0 ) this.cont --; // correcto hay disponibilidad, decremento cont // p.q. se va a realizar 1 operacin protegida else this.cola.insertar (tarea que invoca esperar); // no hay disponibilidad, encolar la tarea para // continuar con ella cuando sea posible } avisar () { if ( this.cola.esVacia() ) this.cont ++; // no hay tareas esperando este aviso, // incremento la disponibilidad else return ( this.cola.extraer () ); // haba tareas esperando, extraer la primera }
43
haydisponibilidad disponibilidadde dedatos? datos? hay SI:la latarea tareacontina. contina. SI: NO:el elConsumidor Consumidorse seguarda guardaen enla lacola cola NO: avisode deque quehay hayuna unanueva nuevaposicin posicinlibre. libre. aviso Sihaba habatareas tareasesperando esperandoguardar guardardatos, datos,una una Si tarea de la cola podr continuar. tarea de la cola podr continuar.
44
Interpretacin grfica
buffer X X X X X X X X
Almacenar
Productor
Consumidor
Extraer
45
46
47
Semforos (fin)
Problema: Los semforos son en s mismos un recurso 9 Varias tareas estn solicitando operaciones esperar/avisar al semforo Ponemos un semforo al semforo? Solucin: las tareas de un semforo no se pueden interrumpir. PL/I: Concurrencia con semforos binarios. ALGOL 68: Concurrencia con semforos.
48
Monitores
Hoare, 1974. Monitor = Encapsula datos + mecanismos de sincronizacin. Solucin de ms alto nivel que los semforos. Si el problema es sincronizar el acceso de tareas a datos comunes que sean los propios datos los que se encarguen del sincronismo. Los lenguajes que soportan monitores aseguran el uso excluyente del monitor: 9 No hay que controlar la sincronizacin para Competicin. Concurrent Pascal y Modula incorporan monitores como tipo.
49
Estructura de un monitor
class bufferMonitor { private buffer; //incluir todas las declaraciones para implementar //el buffer (array, lista circular, etc...) //incluir estructuras para sincronizar la Elacceso acceso(Competicin) (Competicin)lo lo //Cooperacin de tareas. El controlael elcompilador. compilador. private ColaTareas leer, escribir; controla public void almacenar ( valor x ) {...} public valor extraer () {...} }
Tarea Productor: while () { //generar valor... bufferMonitor.almacenar (valor); } Fin_tarea Tarea Consumidor: while () { valor = bufferMonitor.extraer (); //utilizar valor... } Fin_tarea
50
Almacenar/Extraer
void almacenar ( valor x ) { if ( buffer.esLleno() ) escribir.delay(); buffer.insertar (x); leer.continue(); } Sebloquea bloquea(y (yencola) encola)la latarea tarea Se que usa almacenar se le que usa almacenar se le quita la exclusividad de quita la exclusividad de accesohasta hastaque quepueda pueda acceso continuar. continuar. Secontina continacon conalguna algunatarea tarea Se que est esperando leer. que est esperando leer. void extraer ( valor x ) { if ( buffer.esVacio() ) leer.delay(); x = buffer.eliminar (); escribir.continue(); }
51
delay/continue
delay: 9 La tarea que ejecuta delay se bloquea y se aade a la cola. 9 Se le quita el acceso exclusivo al monitor 9 El monitor est disponible para otra tarea continue: 9 Desconecta del monitor a la tarea que lo ejecuta. 9 El monitor est disponible para otra tarea. 9 Si la cola contiene alguna tarea, extrae una tarea y reanuda su ejecucin (que haba sido detenida por un delay).
52