460 likes | 608 Views
Tasking. Seminario de Lenguajes A – Opción Ada. Hasta ahora: Un conjunto de instrucciones que se ejecutan una después de otra Existe otra posibilidad: Varios conjuntos de instrucciones ejecutando al mismo tiempo Concurrencia y paralelismo
E N D
Tasking Seminario de Lenguajes A – Opción Ada • Hasta ahora: • Un conjunto de instrucciones quese ejecutan una después de otra • Existe otra posibilidad: • Varios conjuntos de instruccionesejecutando al mismo tiempo • Concurrencia y paralelismo • En Ada, el mecanismo de especificación de concurrencia se llama TASK (tarea) • Un task es una entidad que se ejecuta simultáneamente con el resto del programa Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 1
Tasking Seminario de Lenguajes A – Opción Ada • Task • Especificación • Declara la parte visible desde el exterior • Define cuáles son los “servicios” que provee • Cuerpo • Determina el comportamientode la tarea Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 2
Tasking Seminario de Lenguajes A – Opción Ada • Ejemplo: • sumar los elementos de las columnas de una matriz deenteros generando un vector de enteros subtype Filas is integer range 1..7; subtype Columnas is integer range 1..5; type Vector is array (Columnas) of integer; type Matriz is array (Filas) of Vector; ---------------------------------- M: Matriz := (others => (others => 1)); V: Vector := (others => 0); ---------------------------------- task Sumador1; task body Sumador1 is begin for I in Filas loop V(1) := V(1) + M(I)(1); end loop; end Sumador1; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 3
Tasking Seminario de Lenguajes A – Opción Ada • Si se precisan varias variables array, entonces se define un tipo array • De igual manera, si se precisan varias tareas iguales, entonces se define un “tipo tarea” • Ejemplo: • Programa y tareas que escriben “Hola Mundo” task type Tarea; task body Tarea is begin Put_Line("Hola Mundo 1 (Tarea)"); Put_Line("Hola Mundo 2 (Tarea)"); Put_Line("Hola Mundo 3 (Tarea)"); end Tarea; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 4
Tasking Seminario de Lenguajes A – Opción Ada • Ejemplo: Trenes • 2 Trenes • Para entrar al cruce, cada tren debepedir permiso al guarda barrera • Al salir del cruce, el tren debeavisar al guarda barrera • 1 Guarda barrera • Publica 2 servicios • Pedido de permiso para entrar al cruce • Aviso de salida del cruce Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 5
Tasking Seminario de Lenguajes A – Opción Ada • Ejemplo: Trenes Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 6
Tasking Seminario de Lenguajes A – Opción Ada • Los entries pueden tener parámetros CantTrenes: constant integer := 5; subtype TrenId is integer range 1..CantTrenes; task type Tren is entry Identificacion(Id: in TrenId); end Tren; task GuardaBarrera is entry EntrarAlCruce(Id: in TrenId); entry SalirDelCruce(Id: in TrenId); end GuardaBarrera; Trenes: array (TrenId) of Tren; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 7
Tasking Seminario de Lenguajes A – Opción Ada • Los entries pueden tener parámetros task body Tren is MiId: TrenId; begin accept Identificacion(Id: in TrenId) do MiId := Id; end Identificacion; loop -- girando GuardaBarrera.EntrarAlCruce(MiId); -- pasando por el cruce GuardaBarrera.SalirDelCruce(MiId); -- salío del cruce end loop; end Tren; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 8
Tasking Seminario de Lenguajes A – Opción Ada • Los entries pueden tener parámetros task body GuardaBarrera is begin loop accept EntrarAlCruce(Id: in TrenId) do Put("Entro al cruce "); Put(Id); end EntrarAlCruce; accept SalirDelCruce(Id: in TrenId) do Put(" Salio del cruce "); Put(Id); New_Line; end SalirDelCruce; end loop; end GuardaBarrera; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 9
Tasking Seminario de Lenguajes A – Opción Ada • Los entries pueden tener parámetros with Text_IO; use Text_IO; procedure Clase9_Trenes2 is ....... begin for I in TrenId loop Trenes(I).Identificacion(I); end loop; end Clase9_Trenes2; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 10
Tasking Seminario de Lenguajes A – Opción Ada Entrycall • Rendezvouz (primero entry call) Running asynchronously Running asynchronously Suspended Suspended Requestor Rendezvouz Server Running synchronously Running asynchronously Running asynchronously Acceptstatement Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 11
Tasking Seminario de Lenguajes A – Opción Ada Entrycall • Rendezvouz (primero accept) Running asynchronously Running asynchronously Suspended Requestor Rendezvouz Server Suspended Running asynchronously Running synchronously Running asynchronously Acceptstatement Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 12
Tasking Seminario de Lenguajes A – Opción Ada Delay statementWait for acceptWait for entry call • Estados de ejecución de las tareas Executing Suspended Activation Delay completeRendezvouz completeRendezvouz starts Reach endof task body Completed Dependenttasks terminated Terminated Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 13
Tasking Seminario de Lenguajes A – Opción Ada • Los recursos compartidos entre tareas deberían ser administrados (ej: variable compartida) task CountingTask is entry Add(Amount: in integer); end CountingTask; task body CountingTask is Runningtotal: integer := 0; begin loop accept Add(Amount: in integer) do Runningtotal := Runningtotal + Amount; end Add; end loop; end CountingTask; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 14
Tasking Seminario de Lenguajes A – Opción Ada • Si pueden llegar dos posibles entries call => Selective accept task CountingTask is entry Add(Amount: in integer); entry CurrentTotal(Total: out integer); end CountingTask; task body CountingTask is RunningTotal: integer := 0; begin loop select accept Add(Amount: in integer) do RunningTotal := RunningTotal + Amount; end Add; or accept CurrentTotal(Total: out integer) do Total := RunningTotal; end CurrentTotal; end select; end loop; end CountingTask; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 15
Tasking Seminario de Lenguajes A – Opción Ada • Guarda: un entry call se acepta o no según una condición task CountingTask is entry Add(Amount: in integer); entry CurrentTotal(Total: out integer); end CountingTask; task body CountingTask is RunningTotal: integer := 0; begin loop select when RunningTotal > 1000 then accept Add(Amount: in integer) do RunningTotal := RunningTotal + Amount; end Add; or accept CurrentTotal(Total: out integer) do Total := RunningTotal; end CurrentTotal; end select; end loop; end CountingTask; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 16
Tasking Seminario de Lenguajes A – Opción Ada • Alternativa accept Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 17
Tasking Seminario de Lenguajes A – Opción Ada • Más alternativas del select: temporizada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 18
Tasking Seminario de Lenguajes A – Opción Ada • Más alternativas del select: else Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 19
Tasking Seminario de Lenguajes A – Opción Ada • Más alternativas del select: terminación Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 20
Tasking Seminario de Lenguajes A – Opción Ada • Resumen sintáctico del select Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 21
Tasking Seminario de Lenguajes A – Opción Ada • Hasta acá => selective accept • Pero en realidad, las sentencias select tienen tres formas distintas: select_statement ::= selective_accept | conditional_entry_call | timed_entry_call Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 22
Tasking Seminario de Lenguajes A – Opción Ada • Conditional entry calls • Si el entry call no es aceptado inmediatamente, se cancela y se ejecutan las sentencias del else Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 23
Tasking Seminario de Lenguajes A – Opción Ada • Timed entry calls • Se ejecuta el entry call el cual es cancelado si no es aceptado antes de la expiración del tiempo. Si el tiempo expira, se ejecutan las sentencias del or delay Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 24
Tasking Seminario de Lenguajes A – Opción Ada • Atributos de tareas y entries • Siendo T una tarea: • T’Callable: true si es callable y false si no. Una tarea es callable a menos que esté completada o haya terminado anormalmente • T’Terminated: true si T está terminada, false en caso contrario • Siendo E un entry de una tarea: • E’Count: cantidad de entry calls encolados en el entry E Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 25
Tasking Seminario de Lenguajes A – Opción Ada • Concurrencia. Conceptos • Deadlock: abrazo mortal • Un subconjunto de procesos no puede continuar su ejecución pues cada uno de ellos espera por un evento que sólo puede producir otro de ellos • Inanición • En la competencia entre procesos por obtener acceso exclusivo a algún recurso, siempre resulta perjudicado el mismo proceso • Fairness • Acceso equilibrado o equitativo a los recursos Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 26
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Filósofos • Problema • Propuesto por Dijkstra en 1965 • Una mesa con 5 plato y 5 palillos • Alrededor de la mesa, 5 filósofos generalmente piensan, pero cada tanto les agarra hambre • Para comer necesitan los 2 palillos • Primera solución • Tomar el palillo derecho y luego el izquierdo=> Posible deadlock Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 27
Tasking Seminario de Lenguajes A – Opción Ada • Familia de entries • entry identifier [(discrete_subtype)][parameters]; Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 28
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Filósofos • Otra solución: con familia de entries Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 29
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Lectores y Escritores • Problema • Propuesto por Courtois en 1971 • Control de acceso a base de datos compartida por procesos lectores y procesos escritores • Pueden acceder varios lectores simultáneamente • Un escritor accede en forma exclusiva con respecto tanto a los lectores como a los escritores • Primera aproximación • Administrador de acceso • Permiso a lectores si no hay escritor accediendo • Permiso a escrito si no hay lectores ni otro escritor accediendo Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 30
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Lectores y Escritores Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 31
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Lectores y Escritores Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 32
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos:Lectores y Escritores • Con la primeraaproximación losescritores pueden sufrir de inanición • Segunda aproximación • Se incorpora un “turno” Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 33
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos:Lectores y Escritores • Pero si no hay procesosdel turno correspondienteesperando acceder a labase de datos? • Tercera aproximación • Turno y cantidad de procesos en espera Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 34
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores • Problema • Buffer limitado • Procesos productores ponen elementos en el buffer • Si no hay lugares libres, deben esperar a que haya • Procesos consumidores quitan elementos del buffer • Si el buffer está vacío, deben esperar que haya algún elemento Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 35
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 36
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 37
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores con pares e impares • Problema • Buffer limitado • Procesos productores ponen elementos en el buffer • Si no hay lugares libres, deben esperar a que haya • Procesos consumidores quitan elementos pares del buffer • Si el buffer está vacío, deben esperar que haya algún elemento y que el próximo sea par • Procesos consumidores quitan elementos impares del buffer • Si el buffer está vacío, deben esperar que haya algún elemento y que el próximo sea impar Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 38
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores con pares e impares Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 39
Tasking Seminario de Lenguajes A – Opción Ada • Problemas clásicos: Productores/consumidores con pares e impares Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 40
Seminario de Lenguajes A – Opción Ada Tasking • Productores/consumidores en Java Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 41
Seminario de Lenguajes A – Opción Ada Tasking • Productores/consumidores en Java Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 42
Seminario de Lenguajes A – Opción Ada Tasking • Productores/consumidores en Java Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 43
Seminario de Lenguajes A – Opción Ada Tasking • Comparación Concurrencia Ada - Java • Ada provee un modelo general de alto nivel, basado en la comunicación explícita (rendezvouz) • Mientras que Java se basa en los monitores clásicos, siendo entonces susceptible al problema de deadlock conocido como “nested monitor” y es propenso a errores. • Aunque ciertos elementos del modelo de threads de Java proveen funcionalidad que no se encuentra en Ada (ej.: grupos de threads), la aproximación de Ada a la concurrencia es más confiable y más “portable” que la de Java. • Ver “weblidi.info.unlp.edu.ar/catedras/ada/Brosgol_CRT.pdf” Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 44
Tasking Seminario de Lenguajes A – Opción Ada • Problema: Concurrencia Recursiva • Buscar un elemento en un vector sin orden, utilizando búsqueda binaria concurrente • El vector es dividido recursivamente en dos partes. • Cada parte del vector es procesada por una nueva tarea • Cada tarea se fija si el elemento buscado es el del medio del vector, y si no lo es crea dos tareas y le asigna una mitad del vector a cada una Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 45
Tasking Seminario de Lenguajes A – Opción Ada • Problema: Concurrencia Recursiva (2da. aproxim.) • En la solución anterior, la “rama” de tareas que no encuentra el elemento, sigue procesando hasta el final • Entonces, ponemos una tarea “global” a la que todas las demás le consultan si el elemento ya fue encontrado, y la que lo encuentra, le informa que ya se encontró • Cada tarea, antes de crear a sus dos hijas, pregunta a la tarea global si ya se encontró el elemento buscado. Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 46