Documente Academic
Documente Profesional
Documente Cultură
eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
LenguajesdeProgramacin
Concurrencia
Ma.LauraCobo
Procesosehilos
Procesos: un programa concurrente consiste de un nmero de
unidades que se ejecutan en paralelo (lgicamente o fsicamente). Cada una de esas unidades conforma un proceso
Hilo: este trmino se utiliza cuando las unidades concurrentes
comparten un solo espacio d di decir tienen t l i de direccionamiento, es d i ti i i t acceso al mismo entorno global.
La diferencia entre estos trminos es de suma importancia en sistemas operativos y programacin de sistemas. En el contexto de lenguajes de programacin, no se suele hacer una distincin entre ambos.
Si la mquina abstracta que ejecuta el programa no soporta concurrencia, es posible simularla mediante transferencias de control explicitas de una unidad a otra.
2
CategorasdeConcurrencia
La simulacin de concurrencia mediante transferencias de control explicitas resulta una aproximacin de bajo nivel, que es soportada por corrutinas. j Las corrutinas no definen un conjunto de unidades concurrentes. Solo una unidad se ejecuta por vez, la unidad en ejecucin debe transferir el control explcitamente a otra (va resume) el cual retoma la ejecucin en el lugar donde se haba suspendido. Las unidades se activan unas a otra en un modelo de interleaving, de acuerdo al patrn de comportamiento definido en el programa.
Corrutinas:ejemplo
Int i = 0; // variable compartida global
Concurrencia
La concurrencia puede ocurrir a cuatro niveles:
Nivel instruccin (ejecutar dos o mas instrucciones mquina
simultneamente)
Concurrencia
Evolucin de las arquitecturas multiprocesador:
Dcada del 50: un procesador de propsito general y uno o mas
procesadores de propsito especial destinados a las operaciones de entradasalida. Este esquema no requiere soporte en el lenguaje de programacin. mltiples procesadores completos completos, utilizados para concurrencia a nivel programa. Estos procesadores eran utilizados por un planificador de tareas del sistema operativo, quien distribua trabajos de la cola en diferentes procesadores
Como los lenguajes no proveen tems para realizar concurrencia a nivel instruccin ni a nivel programa, slo analizaremos los restantes dos niveles
5
utilizados para concurrencia nivel instruccin. Estos procesadores eran alimentados con instrucciones de una misma secuencia. El compilador debe decidir que instrucciones pueden ejecutarse simultneamente y planificarlas en forma acorde.
6
Prof.Ma.LauraCobo
Pgina1
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Concurrencia
Las categoras mas comunes de computadoras multiprocesador son: Arquitectura SIMD: instrucciones simples mltiples datos
Computadoras que tiene mltiples procesadores que ejecutan la misma instruccin simultneamente, cada una sobre diferentes datos. Caractersticas: 1. Cada procesador tiene su memoria local. 2. Un procesador controla la operacin del resto de los procesadores. Debido a que todos los procesadores excepto el controlador, ejecutan la misma instruccin al mismo tiempo, no se requiere sincronizacin en software
CategorasdeConcurrencia
Concurrencia fsica: asumiendo que hay mas de un procesador
permite al programador y al software de aplicacin suponer la existencia de mltiples procesadores. La ejecucin real del programa sucede sobre un solo procesador utilizando interleaving
CategorasdeConcurrencia
Cadaprocesadorsehacecargodeunsolohilodecontrol Cuando un programa con mltiples hilos se ejecuta en una mquina con un solo procesador, los hilos son mapeados a un solo hilo. Convirtindose as en un programa mltihilos virtual
Concurrenciaanivelunidad:conceptos
Una tarea o proceso es una unidad que puede ser ejecutada en forma concurrente con otras unidades Caractersticas que diferencian una tarea de una unidad ordinaria:
Una tarea puede ser comenzada en forma implcita Cuando una unidad comienza la ejecucin de una tarea, no necesita
Los lenguajes que proveen corrutinas, son a veces llamados quasi concurrentes ya que solo cuentan con un hilo de control
suspenderse necesariamente
Cuando se completa la ejecucin de una tarea el control puede o no
10
Concurrenciaanivelunidad:categoras
Categoras de tareas:
Heavyweight task: se ejecutan en su propio espacio de direcciones y
Concurrenciaanivelunidad:sincronizacin
La sincronizacin es el mecanismo que controla el orden en el cual las tareas se ejecutan
Tipos de sincronizacin:
Sincronizacin cooperativa:
utilizan la misma pila de ejecucin tili l i il d j i Si una tarea no se comunica, ni afecta la ejecucin de otras tareas (de ninguna manera) se dice disjunta.
La tarea A debe esperar que la tarea B complete una actividad especfica antes que la tarea A puede continuar si ejecucin. Ejemplo el problema productorconsumidor
Sincronizacin competitiva:
Dos o mas tareas deben usar un recurso que no puede ser utilizado en forma simultnea. Ejemplo: contador compartido
La competicin es usualmente provista por acceso mutuamente excluyente
11 12
Prof.Ma.LauraCobo
Pgina2
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Concurrenciaanivelunidad:sincronizacin
Concurrenciaanivelunidad:planificador
Al proveer sincronizacin se requieren mecanismos para demorar la ejecucin de una tarea. El control de ejecucin de tareas es mantenido por un programa llamado planificador, que mapea la ejecucin de tareas sobre los procesadores disponibles Las tareas pueden estar en diferentes estados: 1. New: creado pero an no comenzado. 2. Ejecutable o listo: listo para ejecutar pero no corriendo (el procesador no est disponible) 3. Corriendo: ejecutando actualmente 4. Bloqueado: estuvo ejecutndose pero ahora no puede continuar (usualmente esta esperando por la ocurrencia de un evento) 5. Muerto: no est mas activo. Una tarea muere cuando se completa su ejecucin o es matado por el programa.
14
13
Concurrenciaanivelunidad:propiedades
Liveness o vivacidad significa que si un evento (terminacin del programa en forma completa) se supone que suceda, eventualmente ocurrir En programacin secuencial significa que eventualmente la unidad se completa. l En programacin concurrente, las tareas fcilmente pierden la propiedad de vivacidad. Si todas las tareas en un ambiente concurrente pierden su vivacidad, el sistema se encuentra en deadlock
15
Concurrenciaanivelunidad:diseo
Muchos lenguajes han sido desarrollados para soportar concurrencia: El primero fue PL/1, a mediados de la dcada del 60 Incluyendo lenguajes contemporneos como: Ada 95, Java y C# Aspectos de diseo Sincronizacin competitiva y cooperativa Cmo controlar la planificacin de tareas Como y cuando comenzar las tareas y terminar su ejecucin Como y cuando son creadas las tareas
Tres de las soluciones alternativas a los problemas de diseo para concurrencia: Semforos Monitores y Pasaje de mensajes
16
Semforos
Unsemforo esunaestructuradedatos,queconsistedeuncontadory unacolaparaalmacenarlosdescriptoresdelastareas Observacin Los semforos fueron desarrollados por Dijkstra en 1965 Pueden utilizarse para implementar guardas sobre el cdigo que accede a estructuras de datos compartidas. Solo utilizan dos operaciones wait and release. Se pueden utilizar tanto para sincronizacin cooperativa, como para sincronizacin competitiva
Semforos:sincronizacincooperativa
Ejemplo buffer compartido
El buffer es implementado como un tipo de dato abstracto, todo dato
entra al buffer a travs de la operacin DEPOSIT y sale a travs de la operacin FETCH. As la operacin DEPOSIT necesita chequear si el buffer tiene posiciones libres y la operacin FETCH necesita chequear si el buffer contiene al menos un tem. Utilizaremos dos semforos cooperativos: emptyspots y fullspots.
ocupados en el buffer
17
18
Prof.Ma.LauraCobo
Pgina3
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Semforos:sincronizacincooperativa
La operacin DEPOSIT
Primero chequea el semforo emptyspot para detectar si hay lugar en el
Semforos:sincronizacincooperativa
La operacin FETCH
Primero chequea el semforo fullspots para detectar si hay algn valor
buffer. o Si hay lugar, el contador del semforo emptyspots es decrementado y el valor insertado. o Si no hay lugar, el llamador es almacenado en la cola del semforo emptyspots Cuando la operacin termina se debe incrementar el contador del semforo fullspots.
almacenado en el buffer. o Si hay valores, el contador del semforo fullspots es decrementado y el valor es removido. o Si no hay valores almacenados, el llamador es almacenado en la cola del semforo fullspots Cuando la operacin termina se debe incrementar el contador del semforo emptyspots.
19
20
Semforos:sincronizacincooperativa
La interaccin de las operaciones DEPOSIT y FETCH con los semforos, son realizadas a travs de las operaciones Wait y Release de los semforos. La operacin Wait:
Wait(unSemaforo)
If el contador de unSemaforo > 0 l t d d S f then decrementar el contador de unSemaforo else poner el llamador en la cola de unSemaforo intentar transferir el control a una tarea lista (si la cola de tareas listas esta vaca, ocurre un deadlock) end
Semforos:cdigodelproductorconsumidor
Semaphore fullspot, empyspot; fullspot.count = 0; emptyspot.count = BUFFERLENGTH; Task producer; loop producir valor wait(emptyspot); {esperar por espacio} DEPOSIT(Valor); release(fullspot); {incrementar el nivel de llenado} end loop; end producer; Task consumer; loop wait(fullspot); {esperar hasta que no est vaco} FETCH(Valor); release(emptyspot); {incrementar la cantidad de vacios} consumir el valor end loop; end consumer;
22
La operacin Release:
Release(unSemaforo)
If la cola de unSemaforo est vaca then incrementar el contador de unSemaforo else poner la tarea que hizo el llamado en la cola de tareas listas transferir el control a una tarea de la lista de unSemforo end
21
Semforos:sincronizacincompetitiva
Los semforos para sincronizacin competitiva estn pensados para permitir el acceso de un solo proceso a los datos por lo que compiten Los semforos para sincronizacin competitiva son generalmente llamados semforos binarios, ya que solo toman los valores 0 y 1. Es importante notar que las operaciones wait y release deben ser atmicas Para controlar el acceso al buffer, en el ejemplo, un tercer semforo, access, es utilizado (sincronizacin competitiva)
Semforos:cdigodelproductorconsumidor
Semaphore fullspot, empyspot,access; access.count = 0 fullspot.count = 0; emptyspot.count = BUFFERLENGTH; Task producer; loop l producir valor wait(emptyspot); {esperar por espacio} wait(access); {esperar por acceso} DEPOSIT(Valor); release(access); {liberar el acceso} release(fullspot); {incrementar el nivel de llenado} end loop; end producer; Task consumer; p loop wait(fullspot); {esperar hasta que no est vaco} wait(access); {esperar por acceso} FETCH(Valor); release(access); {liberar el acceso} release(emptyspot); {incrementar la cantidad de vacios} consumir el valor end loop; end consumer; 24
23
Prof.Ma.LauraCobo
Pgina4
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Evaluacindelossemforos
El mal uso de los semforos puede causar fallas en la sincronizacin cooperativa. Puede producirse un overflow en el buffer si se omite accidentalmente el wait del semforo fullspots. De la misma manera p pueden p producirse fallas en la sincronizacin competitiva, conduciendo a deadlocks en caso de omitirse el release del semforo. Lossemforossonunaherramientadesincronizacineleganteidealpara losprogramadoresquenocometenerrores(BrinchHansen,1973)
Monitores
La idea es encapsular los datos compartidos y sus operaciones para restringir el acceso. Unmonitoresuntipodedatoabstractoparadatoscompartidos
Muchos lenguajes proveen la facilidad de definir monitores, algunos de ellos son: Concurrent Pascal, Modula, Mesa, Ada, Java, C#
25
26
Monitores:sincronizacincompetitiva
Los datos estn ahora dentro del monitor en lugar de en las unidades clientes Todos los accesos a los datos dentro del monitor se realizan a travs de sus operaciones Laimplementacindelmonitoraseguraelaccesosincronizado, La implementacin del monitor aseg ra el acceso sincroni ado permitiendosolounaaccesoalavez. Lasllamadasalasunidadesdelmonitorsonimplcitamente encoladassielmonitorestocupadoenelmomentoderealizarla llamada.
Monitores:sincronizacincooperativa
La cooperacin entre procesos sigue siendo un trabajo de programacin. El programador debe seguir garantizando, en la implementacin, que no se produzca overflow o underflow del buffer (en el ejemplo anterior) Los lenguajes proveen diferentes maneras de realizar sincronizacin cooperativa, cooperativa todos terminan estando relacionadas con los semforos semforos.
27
28
Monitores:evaluacin
Brindan un mejor soporte para sincronizacin competitiva que los
Pasajedemensajes
El pasaje de mensajes es un modelo general para concurrencia Puede modelar tanto semforos como monitores. No es solo para sincronizacin competitiva.
Idea central: la comunicacin entre tareas es como una persona
semforos Los semforos pueden utilizarse para implementar monitores Los monitores se pueden utilizar para implementar semforos El soporte para sincronizacin cooperativa es muy similar al que i i i i i il l se provee con semforos, por lo que tiene los mismo inconvenientes.
esperando por una llamada importante. A veces no queda otra que sentarse y esperar. En el caso de las tareas, si la tarea A quiere enviarle un mensaje a la tarea B, y B est esperando el mensaje, el mensaje es enviado. Esta transmisin se conoce como rendezvous. Para que el rendezvous se produzca el emisor y el receptor del mensaje deben querer que la comunicacin se produzca.
29
30
Prof.Ma.LauraCobo
Pgina5
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Pasajedemensajes:rendezvous
Un mecanismo que permite a la tarea indicar cuando esta
SoportedeconcurrenciaenAda
Las tareas en Ada tienen especificacin y cuerpo. Al igual que los paquetes la especificacin tiene la interface, que es una coleccin de puntos de entrada
task TareaEjemplo is entry ENTRY_1 (tem: in integer) end TareaEjemplo
disponible para aceptar mensajes. Las tareas necesitan algn modo de recordar quin est esperando por sus mensajes y una manera justa de elegir el prximo mensaje. mensaje El rendezvous se produce en la transmisin del mensaje; cuando el mensaje de la tarea emisora es aceptado por la tarea receptora Ejemplificaremos el pasaje de mensajes con el lenguaje Ada. Ada 83 soporta pasaje de mensajes sincrnicos, Ada 95 agrega soporte para pasaje de mensaje asincrnico.
31
El cuerpo de la tarea describe las acciones que toman lugar cuando ocurre un rendezvous La tarea que enva el mensaje suspende mientras espera el mensaje de aceptacin y durante el rendezvous. Los puntos de entrada en la especificacin son descriptos como clusulas accept en el cuerpo
accept NombreEntrada(parmetros formales) do .. end NombreEntrada
32
SoportedeconcurrenciaenAda
task body TareaEjemplo is begin loop accept ENTRY_1 (tem: in integer) do . end ENTRY_1; end loop end TareaEjemplo
SoportedeconcurrenciaenAda
La tarea ejecuta desde el comienzo hasta la clausula accept y espera por un mensaje. Durante la ejecucin del la clausula accept el emisor est suspendido. Los parmetros del accept pueden transmitir informacin en una o las dos direcciones. Cada clusula accept tiene asociada un cola que almacena los mensajes en espera.
33 34
SoportedeconcurrenciaenAda
Una tarea que tiene clausulas accept, pero no otro cdigo es llamada tarea servidora. Una tarea que no tiene clausulas accept es llamada tarea actora. Estos tipos de tareas pueden enviar mensajes a otras tareas. p (entry) y) Importante: el emisor debe conocer el nombre de la entrada ( del receptor pero no viceversa (comunicacin asimtrica)
SoportedeconcurrenciaenAda
Las tareas pueden tener mas un punto de entrada Cada uno requiere una clausula accept El cuerpo de la tarea tiene una clausula accept para cada entrada colocada en una clausula select dentro de un ciclo
task body TareaEjemplo is begin b i loop select accept ENTRY_1 (tem: in integer) do . end ENTRY_1; or accept ENTRY_2 (tem: in integer) do . end ENTRY_2; end select end loop end TareaEjemplo
35
36
Prof.Ma.LauraCobo
Pgina6
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
Semnticadetareasconmltipleselecciones
1. Si slo una cola de entry no est vaca, elegir un mensaje de ella. 2. Si hay mas de una cola no vaca, elegir una en forma no
Sincronizacincooperativa
Cada clausula accept puede tener una guarda adosada, en la forma de clausula when que puede demorar el rendezvous. Por ejemplo: When not lleno(buffer)=>acceptDeposit(nuevoValor)do Cada clausula accept puede estar entonces: 1. Abierta: si la expresin booleana sea verdadera. 2. Cerrada: en caso de que la expresin sea falsa. Las clausulas sin guarda siempre estn abiertas
Al constructor usualmente se lo llama selective wait. Generalmente se encuentra dentro de un bucle infinito
37
38
Semnticadelselectconacceptsconguardas
La clausula select chequea las guardas de todas las clausulas 1. Si exactamente una esta abierta, se controla la cola por mensajes. 2. Si mas de una est abierta, de elige en forma no determinista una y se cheque por mensajes. h j 3. Si estn todas cerradas entonces se produce un error en ejecucin. La clausula select puede incluir una clausula else para evitar el error. Cuando la clausula else se completa se vuelve a repetir el ciclo
Terminacindetareas
La ejecucin de una tarea se completa si el control alcanza el fin del cdigo del cuerpo. Un tarea est terminada si la tarea no ha creado tareas dependientes y se completa Si una tarea se completa pero ha creado tareas dependientes no dependientes, est terminada hasta que las tareas dependientes terminen La clausula terminate en un select es solo una sentencia de terminacin. La clausula terminate solo puede seleccionarse cuando no hay clausulas abiertas en el select. La ejecucin de clausula terminate completa la tarea, la termina si sus dependientes estn terminados.
40
39
ConcurrenciaenAda95
Ada 95 agrega: Objetos protegidos: una manera ms eficiente de implementar datos compartidos y permitir el acceso a estructuras compartidas sin utilizar rendezvous. Comunicacin asincrnica C i i i i
EvaluacindelaconcurrenciaenAda
41
42
Prof.Ma.LauraCobo
Pgina7
LenguajesdeProgramacin DepartamentodeCs.eIngenieradelaComputacin
UniversidadNacionaldelSur PrimerCuatrimestrede2011
ConcurrenciaenJava
ConcurrenciaenJava
Laclasethread tienevariosmtodosparacontrolarlaejecucinde loshilos: Yield:esunrequerimientodelhiloenejecucinacederel procesadorenformavoluntaria. sleep:esunmtodoquepuedeprovocarqueelllamadora unmtodobloqueeelhilo. d bl l hil join:esunmtodoqueseutilizaparaforzaraunmtodoa demorarsuejecucinhastaqueelmtodorundeotrohilo completesuejecucin
43
44
ConcurrenciaenJava:sincronizacincompetitiva
Unmtodoqueincluyeelmodificadorsynchronized imposibilita queotromtodosepuedaejecutarsobreelobjetomientrasel primeroestenejecucin.
. Publicsynchronizedvoiddeposito(intmonto){.} Publicsynchronizedintextraccion(){}
ConcurrenciaenJava:sincronizacincooperativa
Lasincronizacincooperativaselograutilizandolosmtodos:wait, notify ynotifyall. Elmtodowait debeserllamadoenunciclo. Elmtodonotify esllamadoparaindicaraunhiloenespera queeleventoqueestabaesperandosucedi. que el evento que estaba esperando sucedi Elmtodonotifyall despiertaatodosloshilosqueestnen lalistadeesperadelobjeto.
46
Concurrenciaanivelsentencia
Objetivo:proveerunmecanismoparaqueelprogramadorpueda utilizarparainformaralcompiladordemanerasenlasque puedemapearelprogramaenunaarquitectura multiprocesador. Seintentaminimizarlacomunicacinentreprocesadoresylas Se intenta minimizar la comunicacin entre procesadores y las memoriasdelosotrosprocesadores Lainstruccinforall esunejemplodeconcurrenciaanivel instruccin. Atravsdeellaseespecificanunalistadesentenciasquepueden ejecutarseenformaconcurrente
Forall(index=1:1000)list_1(index)=list_2(index) Indicaquetodoslosladosderechosdelas1000asignacionespueden evaluarseantesdequeseproduzcaalgunaasignacin
47
Prof.Ma.LauraCobo
Pgina8