Está en la página 1de 58

Tema 7.

Acciones Atómicas, Tareas


Concurrentes y Fiabilidad

SISTEMAS EN TIEMPO REAL

BEATRIZ PONTES BALANZA


BPONTES@SEVILLA.UNED.ES
Contenido

 Acciones atómicas
 Acciones atómicas en Ada y Java

 Acciones atómicas y recuperación de errores


 Notificación asíncrona
 Notificación asíncrona en Ada y Java
Objetivos

 Entender cómo tareas concurrentes pueden cooperar


de forma fiable en presencia de errores
 Introducir los conceptos de acciones atómicas y
acciones atómicas recuperables
 Entender la necesidad del uso de técnicas de
notificación asíncrona
 Entender el control de transferencia asíncrono (ATC)
en Java y Ada
Interacciones entre tareas

 Independencia
 Sin comunicación ni sincronización

 Recuperación de errores aislada

 Cooperación
 Comunicación y sincronización de forma regular

 Recuperación de errores de forma conjunta

 Competencia
 Comunicación y sincronización para acceder a recursos

 Recuperación de errores relacionada con el uso de recursos


Acciones atómicas - motivación

 La interacción entre dos tareas no siempre implica


una sola comunicación
 En ocasiones será necesaria la interacción de dos o
más tareas
 Las tareas involucradas deben ver un estado del
sistema coherente
 Con tareas concurrentes, la interacción entre grupos
de tareas es muy sencilla
 La actividad conjunta de un grupo de tareas debe ser
vista como una acción atómica o indivisible
Acciones atómicas - definición

 Una acción es atómica si las tareas que la llevan a


cabo:
 No son conscientes de la existencia de otras tareas activas, y
ninguna otra tarea activa es consciente de las actividades de las
primeras, durante el tiempo en el que llevan a cabo la acción
atómica.
 Sin comunicación con otras tareas
 No detectan cambios de estado externos
 Los cambios de estado internos no se comunican hasta finalizar

 Las acciones atómicas son vistas desde fuera como


indivisibles e instantáneas
Acciones atómicas anidadas

 Permite la descomposición modular de las acciones

 Las tareas de las acciones anidadas serán un subconjunto de


las tareas del nivel exterior
 Las tareas de las acciones anidadas no podrán comunicarse
con procesos externos
Acciones atómicas de dos fases

 Se permite la comunicación hacia el exterior con los


gestores de recursos
 Política segura de uso de recursos en dos fases
 Fase creciente
 Peticiones de recursos
 Fase decreciente
 Liberación de recursos

 Una liberación temprana de recursos hace más difícil


la recuperación de errores
Transacciones atómicas

 Es una acción atómica que puede fallar (no éxito) o


tener éxito
 Fallo
 ocurrencia de un error del que la acción no ha podido recuperarse
 Evitar estados inconsistentes
 Recuperación de errores hacia atrás

 Los componentes son devueltos a su estado original

 No existe una ejecución parcial de una transacción


atómica
Acciones atómicas - requisitos

 Límites bien definidos


 Comienzo y final: lugares de cada tarea asociada a la acción en
los cuáles ésta tiene su principio / fin
 Demarcación: separa las tareas involucradas en la acción del
resto del sistema

 Indivisibilidad (aislamiento)
 No hay intercambio de información entre tareas dentro y fuera
de la acción (con excepción del gestor de recursos)
 No hay sincronización entre las tareas al comienzo de la acción

 El final de la acción si implica sincronización


Acciones atómicas - requisitos

 Anidamiento
 Las acciones atómicas pueden anidarse siempre que no haya
solapamiento entre distintas acciones  anidamiento estricto
 Concurrencia
 Es posible ejecutar diferentes acciones atómicas de forma
concurrente
 El efecto de la ejecución concurrente debe ser el mismo que el
de la ejecución secuencial
 Las acciones atómicas deben permitir la
programación de procedimientos de recuperación
Acciones atómicas anidadas

Action A

Action B

P1 P2 P3 P4 P5 P6

time
Acciones atómicas en lenguajes concurrentes

 Ninguno de los principales lenguajes de tiempo real


permiten acciones atómicas de manera nativa

 Asumimos
 Modos de uso de los recursos:
 Compartible / no compartible
 Todas las acciones son de dos fases
 El gestor de recursos asegura un uso apropiado
 Las tareas dentro de una acción sincronizan sus accesos al
recurso
Acciones atómicas en lenguajes concurrentes

Tarea 1
Procedimiento 1
Controlador de acción

Tarea 2 Procedimiento 2 Acceso al controlador


y subprogramas

Tarea 3
Procedimiento 3
Acciones atómicas en Ada

 Las citas (tema 6) permiten una forma común para la


programación de acciones atómicas
 Una tarea (cliente) se comunica con otra (servidor) para
solicitar algún cálculo
 El servidor (receptor) acepta, realiza las ejecuciones y
responde a través de los parámetros de salida
 La sentencia accept posee atomicidad si:
 No actualiza ninguna variable accesible por otra tarea
 No tiene una cita con otra tarea

 Programación
 Crear un controlador de acción, programando la
sincronización requerida
Acciones atómicas en Ada

 La acción es encapsulada en un paquete:


package Action_X is
procedure Codigo_Primera_Tarea(--parametros); -- Rol 1
procedure Codigo_Segunda_Tarea(--parametros); -- Rol 2
procedure Codigo_Tercera_Tarea(--parametros); -- Rol 3
end Action_X;

 El cuerpo del paquete contiene el controlador de la


acción, implementado de forma protegida
Acciones atómicas en Ada

package body Action_X is


protected Controlador_Acción is
entry Primera;
entry Segunda; entry Terminada when Liberar or
entry Tercera; Terminada’Count = 3 is
entry Terminada; begin
private
if Terminada’Count = 0 then
Primera_Aqui : Boolean := False;
Segunda_Aqui : Boolean := False; Liberar := False;
Tercera_Aqui: Boolean := False; Primera_Aqui := False;
Liberar: Boolean := False; Segunda_Aqui := False;
end Controlador_Acción; Tercera_Aqui := False;
else Liberar := True;
protected body Controlador_Acción is
end if;
entry Primera when not Primera_Aqui is
end Terminada;
begin
end Controlador_Acción;
Primera_Aqui := True;
end Primera;
-- igual para segunda y tercera
Acciones atómicas en Ada

procedure Codigo_Primera_Tarea(--parámetros) is
begin
Controlador_Acción.Primera;
-- adquirir recursos
-- comunicación via recursos
Controlador_Acción.Terminada;
-- liberar recursos
end Codigo_Tarea1;
-- similar para las tareas Segunda y Tercera

begin
-- inicializar recursos locales
end Action_X;
Acciones atómicas en Java

 Uso de interfaces. En el ejemplo anterior:


public interface AccionAtomicaTernaria{
public void role1();
public void role2();
public void role3();
}

 Implementación de diversos controladores haciendo


uso de esta interfaz
AccionAtomicaTernaria en Java
public class ControlAccionAtomica implements AccionAtomicaTernaria{
protected Controlador Control;
public AtomicActionControl(){
Control = new Controlador();
}
class Controlador{
protected boolean primeraAqui, segundaAqui, terceraAqui;
protected int todoHecho;
protected int aSalir;
protected int numeroParticipantes;

Controlador(){
primeraAqui = false;
segundaAqui = false;
terceraAqui = false;
todoHecho = 0;
numeroParticipantes = 3;
aSalir = numeroParticipantes;
}
AccionAtomicaTernaria en Java
synchronized void primera() throws InterruptedException{
while(primeraAqui) wait();
primeraAqui= true;
}
//igual para segunda y tercera
synchronized void terminada() throws InterruptedException{
todoHecho++;
if(todoHecho == numeroParticipantes) {
notifyAll();
}else while(todoHecho != numeroParticipantes) {
wait();
}
aSalir--;
if(aSalir == 0){
primeraAqui = false;
segundaAqui = false;
terceraAqui = false;
todoHecho = 0;
aSalir = numeroParticipantes;
notifyAll();
} } }// final de la clase interna Controlador
AccionAtomicaTernaria en Java

public void rol1(){


boolean hecho= false;
while(!done) {
try {
Control.primera();
hecho = true;
} catch (InterruptedException e) { // ignorar }
}
// .... Realizar acción
hecho = false;
while(!done) {
try {
Control.terminada();
done = true;
} catch (InterruptedException e) { // ignorar }
}
}
//Similar para rol2 y rol3
}//fin de la clase ControlAccionAtomica
AccionAtomicaCuaternaria en Java

public interface AccionAtomicaCuaternaria extends AccionAtomicaTernaria{


public void role4();
}

public class NuevoControlAccionAtomica extends ControlAccionAtomica


implements FourWayAtomicAction{
public NuevoControlAccionAtomica (){
Control = new ControlRevisado();
}

class ControlRevisado extends Controller{


protected boolean cuartaAqui;
ControlRevisado() {
super();
cuartaAqui= false;
numeroParticipantes = 4;
aSalir = numeroParticipantes;
}
AccionAtomicaCuaternaria en Java

synchronized void cuarta() throws InterruptedException{


while(cuartaAqui) wait();
cuartaAqui = true;
}
//redefinición de terminada
synchronized void terminada() throws InterruptedException{
super.terminada();
if(todoHecho == 0) {
cuartaAqui = false;
notifyAll();
}
}
}//fin de la clase interna ControlRevisado

public void role4(){



}
}
Recuperación de errores hacia atrás

 Si ocurre un error en una acción atómica


 Las tareas involucradas pueden ser retrotraídos al comienzo de
la acción
 Permite ejecutar algoritmos alternativos
 La atomicidad asegura que las tareas no han comunicado
valores erróneos a otros procesos exteriores
 Ejemplo de P1 en una acción de tres procesos:
action A with (P2, P3) do
ensure <acceptance test>
by
-- primary module
else by
-- alternative module
else by
-- alternative module
else error
end A;
Conversaciones

 Al entrar en la conversación se guarda el estado del proceso


 Sólo se permite comunicación con otros procesos activos en la
conversación y gestores de recursos
 Para abandonar la conversación todos los procesos deben
pasar el test de aceptación
 Si alguno falla el test, todos los procesos recuperan el estado guardado
 Se permite llevar a cabo la acción aunque falte algún proceso
involucrado
 El éxito dependerá de que el resto de procesos quieran comunicarse con
él
 Bloqueo y espera
 Continuar sin la comunicación
 Es posible especificar conversaciones donde la participación
no sea obligatoria
Conversaciones

 Inconvenientes
 Cuando falla la conversación, todos los procesos realizarán
módulos alternativos
 Se fuerzan comunicaciones entre el mismo grupo de procesos

 No es posible modificar el grupo de procesos que interactúan

 Tampoco es posible modificar el test de aceptación

 Diálogos y coloquios como métodos alternativos


Recuperación de errores hacia adelante

 Si ocurre una excepción en alguno de los procesos


activos de una acción atómica, ésta se genera para
todos los procesos activos

action A with (P2, P3) do


-- the action
exception
when exception_a =>
-- sequence of statements
when exception_b =>
-- sequence of statements
when others =>
raise atomic_action_failure;
end A;
Recuperación de errores hacia adelante

 Se puede aplicar el modelo de terminación o el de


reanudación
 Atomic_action_failure
 Cuando no existe un manejador en ninguno de los procesos
activos o cuando falla uno de ellos
 Indica un fallo en la acción atómica
 Se genera para todos los procesos
 Manejo de excepciones en acciones atómicas
 Excepciones concurrentes

 Excepciones en acciones anidadas


Excepciones concurrentes

 Más de una tarea pueden generar excepciones al


mismo tiempo
 Pueden haber manejadores distintos en cada proceso
 Difícil elegir manejador
 Existencia de una tercera excepción: conjunción de las dos
 Uso de árbol de excepciones
 Se elige la excepción raíz del subárbol más pequeño que las
contenga a todas
 Cada proceso puede tener un árbol distinto de excepciones
Excepciones en acciones anidadas

Acción A

Acción B Excepción
generada

P1 P2 P3 P4 P5 P6

time
Excepciones en acciones anidadas

 Todas las tareas deben participar en la recuperación


 Incluye a la acción interna, que es indivisible

 Posibles soluciones
 Retener la generación de la excepción hasta que finalice la
acción interna
 Problemas con tiempos límite
 La excepción puede estar relacionada con la acción interna

 Excepción de aborto para las acciones internas


 Mecanismos de tolerancia a fallos en la acción interna para
abortarse
 Si no es posible abortar  atomic_action_failure
Notificación asíncrona

 La mayoría de los lenguajes soportan mecanismos de


notificación asíncrona
 Permiten que una tarea llame la atención de otra sin esperas
 Reanudación (manejo de eventos)
 Interrupción software
 Cada proceso indica las interrupciones que manejará
 El flujo de control del proceso cambiará sólo temporalmente
 Es posible asociar un hilo distinto con el evento

 Terminación (transferencia asíncrona de control)


 Cada proceso especifica un dominio de ejecución en el que
podrá recibir notificaciones asíncronas que lo finalizarán
Necesidades de usuario

 Requisito fundamental
 Permitir que un proceso responda rápidamente a una
condición detectada por otro proceso
 Ocasiones en que la notificación síncrona (esperas o
sondeos) no es adecuada:
 Recuperación de errores
 Cambios de modo de operación
 Planificación utilizando computaciones parciales/imprecisas
 Interrupciones de usuario
Notificaciones asíncronas en Ada

 Permite a la aplicación responder a:


 Eventos asíncronos externos (capítulo 14)

 Eventos activados por el paso del tiempo (capítulo 10)

 Transferencia asíncrona de control (ATC)


 Modelo de terminación
 Aborto de procesos
ATC en Ada

La sentencia select asíncrona

select
Trigger.Event;
-- secuencia opcional de sentencias que son
-- ejecutadas tras la recepción del evento
then abort
-- secuencia abortable de sentencias
end select;
Ej: cita disponible inmediatamente

task Server is task To_Interrupt;


task body To_Interrupt is
entry ATC_Event;
begin
end Server;
...
task body Server is select
begin Server.ATC_Event;
...
Seq3;
accept ATC_Event do
then abort
Seq2;
end ATC_Event; Seq1;
... end select
end Server; Seq4;
end To_Interrupt;
Ej: ninguna cita comienza antes de terminar Seq1

task Server is task To_Interrupt;


task body To_Interrupt is
entry ATC_Event;
begin
end Server;
...
task body Server is select
begin Server.ATC_Event;
...
aborted
Seq3;
accept ATC_Event do
then abort
Seq2;
end ATC_Event; Seq1;
... end select
end Server; Seq4;
end To_Interrupt;
Ej: la cita termina antes de terminar Seq1

task Server is task To_Interrupt;


task body To_Interrupt is
entry ATC_Event;
begin
end Server;
...
task body Server is select
begin Server.ATC_Event;
...
Seq3;
accept ATC_Event do
then abort
Seq2;
end ATC_Event; Seq1;
aborted
... end select
end Server; Seq4;
end To_Interrupt;
Ej: la cita termina después de terminar Seq1

task Server is task To_Interrupt;


task body To_Interrupt is
entry ATC_Event;
begin
end Server;
...
task body Server is select
begin Server.ATC_Event;
...
Seq3;
accept ATC_Event do
then abort
Seq2;
end ATC_Event; Seq1;
... end select
end Server; Seq4;
end To_Interrupt;
Ada y acciones atómicas

 Se implementan mediante paquetes


 Cada rol representa un proceso en el paquete
 Recuperación de errores hacia atrás
 Conversaciones
package Conversacion is
procedure T1(--parametros); -- llamada por tarea 1
procedure T2(--parametros); -- llamada por tarea 2
procedure T3(--parametros); -- llamada por tarea 3
Fallo_Accion_Atomica : exception;
end Conversacion;

 Cada proceso contiene un bloque de recuperación


 Uso de ATC para informar a cada tarea si se ha producido un fallo en
alguna de las restantes
 El objeto protegido Controlador se encarga de esta comunicación
Transición de estados para una conversación

Save state

Executing and also waiting for an abort


fail acceptance test pass acceptance test
aborted
Signal abort action Abort triggered Waiting on Done

Waiting on cleanup
Exit version normally
Raising exception for module failure

Restore state and try alternative module


Ada y acciones atómicas

 Recuperación de errores hacia delante


package Accion is
procedure T1(--parametros); -- llamada por tarea 1
procedure T2(--parametros); -- llamada por tarea 2
procedure T3(--parametros); -- llamada por tarea 3
Fallo_Accion_Atomica : exception;
end Accion;

 Cada proceso tiene un bloque de manejo de excepciones


 Uso de ATC para informar a cada tarea si se ha producido un fallo en
alguna de las restantes
 El objeto Controlador señaliza el disparo si se ha generado alguna
excepción que no haya sido manejada en alguno de los componentes
 Cada tarea indica si ha manejado la excepción con éxito
 Si alguna tarea indica que la acción debe ser abortada, todas las tareas
generarán Fallo_Accion_Atomica
Estados con recuperación hacia adelante

Enter Action

Executing and also waiting for an abort


exception raised aborted action complete
Abort triggered and
Signal abort action Waiting on Done
raising exception

Exception handled

Waiting Cleanup

Exit action failed Exit action normally


Notificaciones asíncronas en Java

 Java soporta ambos modelos


 Java Real-Time Specification
 Reanudación
 Manejo de eventos asíncronos
 Los manejadores son entidades programadas, no interrupciones

 Terminación
 Transferencia asíncrona de control (ATC)
 Manejo de excepciones asíncronas para tiempo real
Manejo de eventos asíncronos en RT-Java

 Proporciona eventos asíncronos (AE) y manejadores


asociados (AEH)
 Un manejador puede ser asociado a uno o más
eventos, y un evento puede tener más de un
manejador asociado
 Cada manejador tiene un contador del número de
disparos pendientes
 Cuando un evento asociado es disparado, el contador se
incrementa
AsyncEvent en RT-Java

 Tres clases principales asociadas con AEs


 AsyncEvent
 AsyncEventHandler
 BoundAsyncEventHandler: manejadores dedicados

public class AsyncEvent


{
public AsyncEvent();

public void addHandler(AsyncEventHandler handler);


public void removeHandler(AsyncEventHandler handler);
public void setHandler(AsyncEventHandler handler);

public void bindTo(java.lang.String happening);


// bind to external event

public void fire();


// Execute the run() methods of the set of handlers
...
}
AsyncEventHandler en RT-Java

public class AsyncEventHandler implements Schedulable


{
//constructors
public AsyncEventHandler();
public AsyncEventHandler(java.lang.Runnable logic);
public AsyncEventHandler(
SchedulingParameters scheduling,
ReleaseParameters release, MemoryParameters memory,
MemoryArea area, ProcessingGroupParameters group);
... //various other constructors

//methods needed for handling the associated event


protected final int getAndClearPendingFireCount();
protected int getAndDecrementPendingFireCount();
protected final int getPendingFireCount();

public void handleAsyncEvent();


public final void run();
}
ATC en Java

 Standard Java (Thread class)


public void interrupt() throws SecurityException;
public boolean isInterrupted();
public boolean interrupted(); // clears bit
 Cuando un hilo interrumpe a otro
 Si el hilo interrumpido está bloqueado (wait, sleep, join), se lanza la
excepción InterruptedException
 Si está en ejecución
 No tiene efecto inmediato
 El hilo va comprobando con isInterrupted
 Este mecanismo no satisface las necesidades comentadas
anteriormente
ATC en RT-Java

 Permite la interrupción inmediata


 Integrado en el mecanismo de manejo de excepciones de
Java
 Añade una extensión de interrupción de hilos
 Cada método debe indicar si está preparado para
permitir una ATC
 Tres actividades
 Declaración de una AsynchronouslyInterruptedException
 Identificación de métodos que pueden ser interrumpidos
 Señalización de una AsynchronouslyInterruptedException al
hilo
Ejemplo de ATC en RT-Java

public class InterruptibleService{


public AsynchronouslyInterruptedException stop =
AsynchronouslyInterruptedException.getGeneric();
public boolean Service() throws AsynchronouslyInterruptedException{
//code interspersed with calls to nonInterruptibleServices
}
}

public InterruptibleService IS = new InterruptibleService();


// code of RT thread, t
if(IS.Service()) { ... }
else { ... };

// now another RT thread interrupts t:

t.interrupt();
Semántica del ejemplo anterior

 t en método que no tiene AIE en su lista throws, o en


una sección diferida
 La excepción se marca pendiente
 Se tendrá en cuenta cuando t esté en un método que tenga AIE
 t en método con AIE en su lista throws
 En bloque try  el control pasa a catch y/o se propaga
 Sin bloque try  se propaga

 T bloqueado en sleep, wait o join


 Se replanifica t
 Se propaga la excepción o se marca pendiente, dependiendo
del método que produjo el bloqueo
Captura de AIE

 Una vez que la AIE es recibida por un manejador, es


necesario comprobar si la ATC es la esperada
 Si no lo es, seguirá pendiente
 Uso del método clear en la clase
AsynchronouslyInterruptedException
 Si la excepción no es la esperada, se propaga a un nivel superior
public void useService(){
stopNow = AIE.getGeneric();
try {
// code with calls to InterruptibleService
}
catch (AIE AI) {
// handle the ATC
if(!stopNow.clear()) {
// not my ATC, it must be at a higher level
}
}
}
La interfaz Interruptible

 Facilita el uso estructurado


 La implementarán los objetos que quieran
proporcionar un método interruptible
 El método run de la interfaz es interruptible
 Si se interrumpe  se llama al método interruptAction

public interface Interruptible{


public void interruptAction (
AsynchronouslyInterruptedException exception);

public void run (


AsynchronouslyInterruptedException exception)
throws AsynchronouslyInterruptedException;
}
La interfaz Interruptible

 Una vez implementada la interfaz


 Se pasa un objeto al método doInterruptible de la clase
AsynchronouslyInterruptedException
 El método podrá ser interrumpido invocando al método fire
de la clase AsynchronouslyInterruptedException

 Más control sobre AIE


 disable, enable, isEnabled

 disable difiere la AIE hasta que se invoque enable


RT-Java y acciones atómicas

role1
AIE1
role2

AIE2.fire()
AIE2 role3
doInterruptible AIE1.fire() AIE3
doInterruptible
AIE3.fire() doInterruptible

Action
Action Action
EH
EH
EH

signalAbort

Controller
ATC Ada vs RT-Java

 Similitudes
 Es necesario indicar las regiones de código susceptibles de
recibir una ATC
 ATC son diferidas durante la interacción y finalización de hilos
o tareas.
 Diferencias
 El modelo de RT-Java está integrado con el uso de excepciones
 El modelo Ada está integrado en la sentencia select y el uso de
entries
 Java requiere que los métodos indiquen si pueden recibir ATC,
en otro caso quedan pendientes
 Respuestas diferidas a ATC en Ada deben hacerse explícitas
Resumen

 Necesidad de uso de acciones atómicas


 Sincronización y comunicación en acciones atómicas
 Implementación en Ada y Java
 Recuperación de errores hacia atrás
 Conversaciones
 Recuperación de errores hacia adelante
 Basada en excepciones
 Modelos de reanudación y terminación
 Notificación asíncrona para la recuperación de errores en
Ada y RT-Java
 Manejo de eventos
 Transferencía asíncrona de control (ATC)

También podría gustarte