Vous êtes sur la page 1sur 26

PROGRAMACIN CONCURRENTE

Lenguajes de Programacin - Progr. Concurrente

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.

Lenguajes de Programacin - Progr. Concurrente

Procesos vs. Hilos


En el contexto del Sistema Operativo, un Proceso es una instancia de un Programa que est siendo ejecutado en el ordenador. Proceso = Cdigo de programa + Datos + Recursos Un S.O. admite concurrencia si es capaz de manejar diversos procesos simultneamente. En el contexto de un Programa concurrente, un Hilo (Thread) es cada uno de los flujos secuenciales de control independientes especificados en el programa.

Lenguajes de Programacin - Progr. Concurrente

Procesos Secuenciales
Un proceso tradicional, correspondiente a un programa secuencial, es un proceso que posee un nico hilo de control.

Unflujo flujo(camino) (camino)de decontrol control Un

El Elcontador contadorde deprograma, programa,el el estado estadode dela lapila pilay yde delos los objetos objetosdefinen definenel elestado estado del sistema. del sistema.

Lenguajes de Programacin - Progr. Concurrente

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

Lenguajes de Programacin - Progr. Concurrente

Elegir sitio Contratar arquitecto Desarrollar plano Ofertar plano [aceptado] Realizar trabajo en el terreno Hacer trabajo comercial()

[no aceptado]

Terminar construccin

Lenguajes de Programacin - Progr. Concurrente

Concurrencia Software vs. Paralelismo Hardware


La concurrencia software es un concepto lgico, no implica la existencia de paralelismo en el hardware: 9 Las operaciones hardware ocurren en paralelo si ocurren al mismo tiempo. 9 Las operaciones (software) en un programa son concurrentes si pueden ejecutarse en paralelo, aunque no necesariamente deben ejecutarse as.

Lenguajes de Programacin - Progr. Concurrente

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

Arquitecturas Multiprocesador: Revisin histrica


Aos 50: Primeras mquinas con varios procesadores 9 Un procesador de propsito general y varios procesadores para controlar la E/S. 9 Permitan ejecutar un programa mientras se realizaba E o S para otros programas. 9 No se puede hablar de ejecucin concurrente de programas. Aos 60 (inicio): Primeras multiproc. reales 9 El programador de tareas del SO distribua programas entre los procesadores a partir de una cola de trabajos. 9 Permitan concurrencia a nivel de programas.

Lenguajes de Programacin - Progr. Concurrente

Arquitecturas Multiprocesador (2)


Aos 60 (mitad): Ordenadores con hardware especfico mltiple 9 Multiplican el nmero de multiplicadores en coma flotante o unidades aritmticas en coma flotante completas. 9 Estas unidades ejecutan instrucciones procedentes de un nico flujo de instrucciones (programa). 9 Los compiladores determinaban qu instrucciones podan ejecutarse concurrentemente.

Lenguajes de Programacin - Progr. Concurrente

10

Arquitecturas Multiprocesador: Categoras


SIMD (Single Instruction Mltiple Data): 9 Pueden ejecutar simultneamente la misma instruccin sobre diferentes conjuntos de datos. 9 Cada procesador tiene su propia memoria local. 9 Hay un procesador que controla el trabajo del resto. 9 Como se ejecuta la misma instruccin no es preciso ningn tipo de sincronizacin entre tareas. 9 Mquinas tpicas: los procesadores vectoriales Especficas para trabajar con datos almacenados en arrays. Aplicacin en clculo cientfico.

Lenguajes de Programacin - Progr. Concurrente

11

Arquitecturas Multiprocesador: Categoras (2)


MIMD (Multiple Instruction Multiple Data) 9 Cada procesador ejecuta su propio flujo de instrucciones. 9 Es preciso poder sincronizar tareas. 9 Dos tipos de configuracin: Memoria compartida. Memoria distribuida. 9 Hay que sincronizar el acceso a los datos. 9 Soportan concurrencia a nivel de hilos dentro del programa.

Lenguajes de Programacin - Progr. Concurrente

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.

Lenguajes de Programacin - Progr. Concurrente

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.

Lenguajes de Programacin - Progr. Concurrente

14

Necesidad de Sincronizacin (ejemplo)


Ejemplo de Competicin: 9 Sea un dato TOTAL que inicialmente tiene el valor 3. La tarea A realiza: TOTAL++; La tarea B realiza: TOTAL *= 2; 9 Cada tarea completa su operacin sobre TOTAL realizando los siguientes pasos: Recuperar el valor de TOTAL Realizar una operacin aritmtica Almacenar el nuevo valor de TOTAL

Lenguajes de Programacin - Progr. Concurrente

15

Sincronizacin para Competicin (ejemplo)


Si no existe sincronizacin entre las tareas A y B, se pueden dar cuatro resultados diferentes (TOTAL = 3): 9 Correctos: La tarea A completa su operacin antes de que empiece B: Resultado final, TOTAL = 8 La tarea B completa su operacin antes de que empiece A: Resultado final, TOTAL = 7 9 Incorrectos: Las tareas A y B recuperan el valor de TOTAL sin que ninguna haya llegado a almacenar el nuevo valor: Resultado final, TOTAL = 6. Si la ltima en finalizar es B. Resultado final, TOTAL = 4. Si la ltima en finalizar es A.
Lenguajes de Programacin - Progr. Concurrente

16

Sincronizacin (Ejemplo)
Memoria TOTAL Registro1 Registro2

Lenguajes de Programacin - Progr. Concurrente

17

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++

Lenguajes de Programacin - Progr. Concurrente

18

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

19

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1

Lenguajes de Programacin - Progr. Concurrente

20

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

21

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2

Lenguajes de Programacin - Progr. Concurrente

22

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

23

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2

Lenguajes de Programacin - Progr. Concurrente

24

Sincronizacin (Ejemplo: A antes que B)


Memoria TOTAL Registro1 Registro2

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)

Lenguajes de Programacin - Progr. Concurrente

25

Sincronizacin (Ejemplo)
Memoria TOTAL Registro1 Registro2

Lenguajes de Programacin - Progr. Concurrente

26

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++

Lenguajes de Programacin - Progr. Concurrente

27

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

28

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

29

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 Hilo B TOTAL *=2 (i) Recuperar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

30

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2

Lenguajes de Programacin - Progr. Concurrente

31

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

Hilo A TOTAL ++ (i) Recuperar (TOTAL) (ii) Sumar 1 (iii) Almacenar (TOTAL) Hilo B TOTAL *=2 (i) Recuperar (TOTAL) (ii) Multiplicar x 2

Lenguajes de Programacin - Progr. Concurrente

32

Sincronizacin (Ejemplo: B interfiere con A )


Memoria TOTAL Registro1 Registro2

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)

Lenguajes de Programacin - Progr. Concurrente

33

Sincronizacin para Competicin (ejemplo)


Recuperar (TOTAL) Sumar 1 Almacenar (TOTAL)
Sumar 1 Almacenar (TOTAL)

Tarea A TOTAL ++;

Recuperar (TOTAL)

Inicio

TOTAL

Fin

Tarea B TOTAL *= 2;
Recuperar (TOTAL) Multiplicar por 2

Recuperar (TOTAL) Multiplicar por 2 Almacenar (TOTAL)


Almacenar (TOTAL)

Lenguajes de Programacin - Progr. Concurrente

34

Diseo de lenguajes Concurrentes


Los principales conceptos que debe incorporar un lenguaje de programacin que soporte Concurrencia son: 9 Cmo se soporta la sincronizacin para Cooperacin? 9 Cmo se soporta la sincronizacin para Competicin? 9 Cmo y cundo se inicia y finaliza la ejecucin de tareas? 9 Las tareas se crean esttica o dinmicamente?

Lenguajes de Programacin - Progr. Concurrente

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

Lenguajes de Programacin - Progr. Concurrente

37

Ejemplo de Sincronizacin para Cooperacin


Los datos compartidos estn en un buffer (situacin habitual). Operaciones de acceso al buffer: 9 ALMACENAR 9 EXTRAER Hay 2 tareas que acceden al buffer para Cooperar: 9 Siguen el esquema Productor-Consumidor: Una tarea produce datos y los almacena en el buffer. La segunda tarea requiere datos y los extrae del buffer.

Lenguajes de Programacin - Progr. Concurrente

38

Ejemplo (2, sin sincronizacin)


Versin no sincronizada de las tareas:
Tarea Productor: while () { //generar valor... buffer.almacenar (valor); } Fin_tarea Tarea Consumidor: while () { valor = buffer.extraer (); //utilizar valor... } Fin_tarea

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

Ejemplo (2, con sincronizacin)


Versin sincronizada con semforos de las tareas:
Tarea Productor: while () { //generar valor... esperar (posLibres); buffer.almacenar (valor); avisar (posOcupadas); } Fin_tarea Tarea Consumidor: while () { esperar (posOcupadas); valor = buffer.extraer (); avisar (posLibres); //utilizar valor... } Fin_tarea

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

Lenguajes de Programacin - Progr. Concurrente

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

Lenguajes de Programacin - Progr. Concurrente

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

Lenguajes de Programacin - Progr. Concurrente

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 }

Lenguajes de Programacin - Progr. Concurrente

43

Interpretacin de las tareas


Tarea Productor: while () { //generar valor... posLibres.esperar(); buffer.almacenar (valor); posOcupadas.avisar(); } Fin_tarea Tarea Consumidor: while () { posOcupadas.esperar(); valor = buffer.extraer (); posLibres.avisar(); //utilizar valor... } Fin_tarea haydisponibilidad disponibilidadde deposiciones posicioneslibres? libres? hay SI:la latarea tareacontina. contina. SI: NO:el elProductor Productorse seguarda guardaen enla lacola cola NO: avisode deque quehay hayuna unanueva nuevaposicin posicinocupada. ocupada. aviso Sihaba habatareas tareasesperando esperandodatos, datos,una unatarea tareade de Si la cola podr continuar. la cola podr continuar.

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.

Lenguajes de Programacin - Progr. Concurrente

44

Interpretacin grfica
buffer X X X X X X X X

posLibres avisar esperar

posOcupadas avisar esperar

Almacenar

Productor

Consumidor

Extraer

Lenguajes de Programacin - Progr. Concurrente

45

Ejemplo de Sincronizacin para Competicin


Controlar el acceso al buffer: slo una tarea puede estar usndolo. Un semforo para controlar el acceso: 9 cont: no necesita contar nada, slo debe indicar si se est usando el buffer (0) o no (1) Semforo Binario. 9 esperar: da permiso para acceder slo si cont == 1 Podemos aadir un nuevo semforo al ejemplo anterior para controlar el acceso exclusivo al buffer (acceso).

Lenguajes de Programacin - Progr. Concurrente

46

Revisin de las tareas


Tarea Productor: while () { //generar valor... posLibres.esperar(); acceso.esperar(); buffer.almacenar (valor); acceso.avisar(); posOcupadas.avisar(); } Fin_tarea Tarea Consumidor: while () { posOcupadas.esperar(); acceso.esperar(); valor = buffer.extraer (); acceso.avisar(); posLibres.avisar(); //utilizar valor... } Fin_tarea

disponibilidad libres/ocupadas? puedo acceder? ACCESO he accedido hay disponibilidad ocupadas/libres

Lenguajes de Programacin - Progr. Concurrente

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.

Lenguajes de Programacin - Progr. Concurrente

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.

Lenguajes de Programacin - Progr. Concurrente

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

Laimplementacin implementacindebe debede de La incluirla lasincronizacin. sincronizacin. incluir

Lenguajes de Programacin - Progr. Concurrente

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(); }

Lenguajes de Programacin - Progr. Concurrente

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).

Lenguajes de Programacin - Progr. Concurrente

52

Vous aimerez peut-être aussi