Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Breve introduccin
Joaqun EZPELETA Dept. de Informtica e Ingeniera de Sistemas Universidad de Zaragoza
ndice
Declaracin y uso de tareas Ada Dependencia y activacin de tareas Ada Sincronizacin por citas en Ada La instruccin Select Tipo Duration y accin Delay Paquete Calendar y tipo Time Uso de Select y citas Manejo de excepciones Ms sincronizacin en ADA: tipos protegidos La buena educacin en el uso de objetos protegidos
task P1::body P2 is begin Mq TRUE Mq TRUE declaracin while TRUE loop task P1; en2:=TRUE en1:=TRUE en2 := TRUE task P2; ult:=2 ult:=1 ult := 2 ---------------------------------- ult=2 Mq body en1 P1 while and ult=2 loop task is Mq en2 en1 ult=1 null; begin seguir seguir end loop; while TRUE loop FMq FMq --put_line("P2 en CS"); en1 := TRUE secCrit2 secCrit1 en2 := FALSE; ult := 1 en2:=FALSE --put_line("P2 en NCS"); while en2 and ult=1 loop en1:=FALSE end loop; secNoCrit2 null; secNoCrit1 end P2; end loop; FMq FMq ------------------------------------put_line("P1 en CS"); begin en1 := FALSE; null; --put_line("P1 en NCS"); end peterson; end loop; end P1;
with Ada.Text_IO; use Ada.Text_IO; procedure peterson is en1: boolean := FALSE; en2: boolean := FALSE; P2:: ult: integer := 1;
task body P2 is begin task P1; declaracin while TRUE loop task P2; en2 := TRUE ----------------------------------ult := 2 while en1 and ult=2 loop task body P1 is begin null; while TRUE loop end loop; en1 := TRUE --put_line("P2 en CS"); ult := 1 en2 := FALSE; while en2 and ult=1 loop --put_line("P2 en NCS"); null; end loop; end loop; end P2; --put_line("P1 en CS"); ----------------------------------en1 := FALSE; begin --put_line("P1 en NCS"); null; end loop; end peterson; end P1;
with Ada.Text_IO; use Ada.Text_IO; procedure peterson is en1: boolean := FALSE; en2: boolean := FALSE; ult: integer := 1;
declare
begin
end padre
declarada
activacin
ejecucin
T1 T2
declarada
activacin
ejecucin
La instruccin Select
Dos problemas!!
select accept escribir(D: in Dato) do task buffer is X(i):=D; entry leer(D: out Dato); i:=i mod N+1; entry escribir(D: in Dato); nDatos:=nDatos+1; end buffer; end escribir; task T1; or task T2; accept leer(D: out Dato) do task body buffer is D:=X(j); N: constant := 100; --maxDatos j:=j mod N+1; X: array(1..N) of Dato; nDatos:=nDatos-1; i,j: integer range 1..N := 1; end leer; nDatos: integer range 0..N := 0; parmetros actuales end select; begin se evalan antes loop ... ... ... end loop; buffer.leer(d1) buffer.escribir(d2) end buffer; ... ... T1 T2
10
La instruccin Select
select accept escribir(D: in Dato) do task buffer is X(i):=D; entry leer(D: out Dato); end escribir; entry escribir(D: in Dato); i:=i mod N+1; end buffer; nDatos:=nDatos+1; or task body buffer is accept leer(D: out Dato) do N: constant := 100; --maxDatos D:=X(j); X: array(1..N) of Dato; end leer; i,j: integer range 1..N := 1; j:=j mod N+1; nDatos: integer range 0..N := 0; nDatos:=nDatos-1; begin end select; loop ... end loop; end buffer;
Un problema!!
J. Ezpeleta Univ. de Zaragoza
11
La instruccin Select
task buffer is entry leer(D: out Dato); entry escribir(D: in Dato); end buffer ; task body buffer is N: constant := 100; --maxDatos X: array(1..N) of Dato; i,j: integer range 1..N := 1; nDatos: integer range 0..N := 0; begin loop ... end loop; end buffer; select when nDatos<N => accept escribir(D: in Dato) do X(i):=D; end escribir; i:=i mod N+1; nDatos:=nDatos+1; or when nDatos>0 => accept leer(D: out Dato) do D:=X(j); end leer; j:=j mod N+1; nDatos:=nDatos-1; end select;
12
Por qu al menos?
Ejemplo:
delay 2.0
13
14
15
16
with calendar;
use calendar;
task rutina; task body rutina is periodo: constant duration := 10.0; begin loop delay periodo; -- accin a iterar ... end loop; end rutina;
with calendar; use calendar; task rutina; task body rutina is periodo: constant duration := 10.0; siguiente: time; begin siguiente := clock+periodo; loop delay siguiente-clock; -- accin a iterar ... siguiente := siguiente+periodo; end loop; end rutina;
17
Si no tengo peticin...
J. Ezpeleta Univ. de Zaragoza 18
select operador.llamar("apagar fuego"); or select delay 100.0; operador.llamar("apagar fuego"); bomberos.dar_aviso; else end select; delay 100.0; bomberos.dar_aviso; end select;
Si no me atienden ya..
J. Ezpeleta Univ. de Zaragoza 19
la unidad de la que depende la tarea ha alcanzado su final y las restantes tareas dependientes o han acabado o tambin estn en disposicin de ejecutar una alternativa terminate.
20
Manejo de excepciones
Una excepcin es una situacin anmala en la ejecucin de un programa
Divisin por cero, acceso a un elemento de un vector cuyo ndice est fuera de rango, desbordamiento en un clculo, error en la gestin dinmica de la memoria, problemas al crear o acceder a una tarea, etc.
21
Manejo de excepciones
Ada tiene ya prededefinidas algunas excepciones de aparicin frecuente:
Constraint_Error: problemas en rangos, ndices, ... Numeric_Error: divisin por cero, desbordamiento, ... Program_Error: acceso indebido a procedimientos, mdulos, etc., uso indebido de estructuras de seleccin, ... Storage_Error: problemas en la gestin de la memoria (datos dinmicos, procedimientos, etc.) Tasking_Error: problemas en la sincronizacin, comunicacin y ejecucin de tareas
22
Manejo de excepciones
Las excepciones se manejan en la parte final del bloque, cuerpo de subprograma, cuerpo de paquete, tarea, instruccin accept
tienen acceso a todos los objetos declarados en dicha unidad
... begin --sec. de instrucciones exception when Constraint_Error | Program_Error => --lo que haya que hacer especfico para estos casos when Storage_Error => --lo que haya que hacer especfico para este caso when others => --lo que haya que hacer para el resto de casos --no es obligatorio completar las excepciones a tratar end;
23
Manejo de excepciones
Una excepcin se crea explcitamente mediante raise:
errorDeParidad: exception; ... if sumaDeBits /= paridadEsperada then raise errorDeParidad; ... end if; exception when errorDeParidad => Put_Line(Me ests engaando); end;
Cuando ocurre una excepcin, la ejecucin normal del programa se abandona, pasando al manipulador de la excepcin La excepciones se propagan hacia arriba, siguiendo la cadena dinmica de invocacin
si en un nivel determinado no se encuentra un manipulador para una excepcin, se propaga hacia arriba
Manejo de excepciones
with ada.Exceptions; use ada.Exceptions;
procedure pruebaExcepciones is procedure p1 is miEx1: exception; begin put_line("En p1"); raise miEx1; end p1;
procedure p2 is miEx2: exception; begin put_line("En p2"); raise miEx2; end p2; begin p1; p2; exception En p1 when others => main detecta incontrolada put_line("main detecta incontrolada; end;
25
Manejo de excepciones
with ada.Exceptions; use ada.Exceptions;
procedure pruebaExcepciones is procedure p1 is miEx1: exception; begin put_line("En p1"); raise miEx1; exception when miEx1 => put_line("P1 caza miEx1"); end p1;
procedure p2 is En p1 miEx2: exception; P1 caza miEx1 begin En p2 put_line("En p2"); main detecta incontrolada raise miEx2; end p2; begin p1; p2; exception when others => put_line("main detecta incontrolada"); end;
26
Manejo de excepciones
with ada.Exceptions;use ada.Exceptions; procedure pruebaExcepciones is procedure p1 is miEx1: exception; begin put_line("En p1"); raise miEx1; end p1; begin p1; exception when Event: others => put("main detecta "); put_line(Exception_Name(Event)); end;
27
Objeto protegido
encapsula datos restringe el acceso a los procs/funcs protegidos y a las entry protegidas ADA asegura
que la ejecucin de los procs/funcs y entry se lleva a cabo en exclusin mutua
implica acceso en mutex a lectura/escritura sobre las variables
28
Orden de servicio?
30
31
32
Si alguien est ejecutando una funcin, el objeto protegido tiene un cerrojo de lectura (read lock) activo Si alguien est ejecutando un proc. o entrada protegida, el objeto protegido tiene un cerrojo de lectura-escritura (read-write lock) activo Lo que sigue, en orden, es una pelcula de lo que ocurre cuando una tarea trata de invocar algo de un objeto protegido:
33
34
35
36
38
39