Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
p3
t1
p2
Suponiendo que el ejemplo anterior se refiere a una barbería:
• p1: un cliente espera.
• p2: el barbero espera.
• p3: un cliente está siendo atendido y el barbero trabaja.
• t1: el barbero empieza un afeitado.
p1
t1 p4
p2
t2
Hay dos tipos de conflictos:
• Estructural: También llamado potencial. Cuando el conjunto de los
lugares de entrada a alguna transición tiene intersección no vacía (hay algún lugar
de entrada común). Es el caso de la red de Petri anterior.
• Efectivo: Cuando existe un conflicto estructural y además las dos
transiciones son franqueables. Sería el ejemplo anterior pero con el lugar de entrada
marcado.
Es decir, el conflicto efectivo depende del marcado mientras que el estructural no. A
una red donde existe un conflicto se le denomina red no determinista, depende de si disparamos
una u otra transición. Así se producirá uno u otro efecto.
A espera R B espera R
t1 t4
R disponible
t3 A utiliza R B utiliza R
t6
t2 t5
Sincronización.
Es otro comportamiento modelable con una red de Petri.
Ejemplo: Comportamiento de las bolas de billar en un tablero. Supongamos un tablero
donde hay dos bolas, A y B, que chocan y rebotan.
Más adelante, A rebota contra el borde y vuelve, y B también rebota luego contra el
borde. Volverían a chocar, y este proceso (supuesto ideal) continuaría indefinidamente. Lo
meodelamos como una red de Petri:
A derecha B izquierda
Chocan
t2 t1 t3
A izquierda B derecha
Invariantes de marcado.
Son propiedades del marcado de una red de Petri que se cumplen siempre. Por ejemplo,
en el caso de las bolas de billar, dos invariantes de marcado son:
Mi(p1)+Mi(p3)=1
Mi(p2)+Mi(p4)=1
Esto nos dice que siempre estarán marcados p2 o p3, pero nunca ambas o ninguna de las
dos. Algo parecido sucede con p2 y p4.
Invariantes de disparo.
Son condiciones que se cumplen siempre en el disparo de las transiciones. En el
ejemplo de las bolas de billar, podemos decir que las posibles secuencias de disparo son t1t2t3
y t1t3t2, es decir, estas secuencias de disparo son repetitivas.
Parcialmente viva
No binaria
Ar E
D
C
P
Tipos de redes de Petri.
Vamos a ver sólo los tipos más comunes. Hay muchos más:
• Redes de Petri ordinarias: Todos los arcos tienen el mismo peso
(unidad), no se involucra al tiempo, sólo hay un tipo de token o marca, la capacidad
de los lugares es infinita.
• Redes de Petri generalizadas: Son como las ordinarias con la diferencia
de que existen pesos diferentes asociados a los arcos. Ejemplo:
3 2
Esto indica que cuando se dispara esta transición, se quitan tres marcas del lugar de
entrada y se añaden dos marcas al lugar de salida. O sea, para disparar la transición se necesitan
tres marcas en el lugar de entrada.
• Redes de Petri coloreadas: En ellas se identifican los tokens por colores
(en general, las redes de Petri donde se identifican los tokens se denomina redes de
Petri de alto nivel).
• Redes de Petri temporizadas: En ellas existe un tiempo asociado, ya sea
a un lugar o a una transición. Si es a un lugar es que un token sólo puede
permanecer ese tiempo en dicho lugar. Si es a una transición indica el tiempo límite
para realizar la acción asociada a una transición.
ADA
Es una situación en paralelo; se activan todas las tareas definidas al llegar el último
begin (el del procedure); el procedimiento termina cuando lo hacen todas las tareas
definidas en él.
Citas: Se producen como consecuencia de la llamada de una tarea a un punto de entrada
de la otra.
Declaración del punto de entrada:
task T is
entry E(parámetros);
end;
Un punto de entrada no puede tener resultados (no es una función) como los
procedimientos (pueden devolver valores por los parámetros, pero no por sí mismas). Llamada:
nombre_tarea.E(parámetros)
En el cuerpo:
accept E(parámetros) do
sentencias
end E;
En otra tarea:
task body T2 is
...
T1.E(parámetros);
...
end T2;
T y T2 se ejecutan en paralelo hasta que se llega a la llamada del punto de entrada,
momento en el que se sincronizan; cuando se alcanza el end E; ambas siguen ejecutándose en
paralelo.
Ejemplo: Tarea que emplea un buffer de un único elemento:
task BUFFERING is
entry DEPOSITAR(x: in ITEM);
entry RETIRAR(x: out ITEM);
end;
task body BUFFERING is
v: ITEM;
begin loop
accept DEPOSITAR(x: in ITEM) do
v:=x
end DEPOSITAR;
accept RETIRAR(x: out ITEM) do
x:=v
end RETIRAR;
end loop;
end BUFFERING;
En otra tarea:
BUFFERING.DEPOSITAR(parámetros);
BUFFERING.RETIRAR(parámetros);
Si varias tareas llaman a la vez a un punto de entrada se almacenan en cola y se van
atendiendo conforme van terminando. Las colas pueden estar vacías (BUFFERING estará en
espera).
Los puntos de entrada pueden no tener parámetros, por ejemplo: entry SEÑALAR.
También puede haber una tarea cuyo accept no hace nada: accept SEÑALAR. Sólo
sincroniza tareas. Si una tarea se llama a sí misma se produce un interbloqueo (no tiene sentido).
Sentencia ‘select’.
Veamos una tarea que proporciona acceso exclusivo a una variable protegida.
task VAR_PROTEGIDA is
entry LEER(x: out ITEM);
entry ESCRIBIR(x: in ITEM);
end;
task body VAR_PROTEGIDA is
v:ITEM;
begin
accept ESCRIBIR(x: in ITEM) do
v:=x;
end;
loop
select
accept LEER(x: out ITEM) do
x:=v;
or
accept ESCRIBIR (x: in ITEM) do
v:=x;
end select;
end VAR_PROTEGIDA;
Condiciones de guarda: Condiciones a cumplir antes de llamar a un punto de entrada.
Ejemplo: Buffer finito.
task BUFFERING is
entry DEPOSITAR(x: in ITEM);
entry RETIRAR(x: out ITEM);
end;
task body BUFFERING is
N: constant:=8;
BUF: array (1...N) of ITEM;
ENT,SAL: INTEGER range 1...N:=1;
CUENTA: INTEGER range 0...N:=0;
begin
loop
select
when CUENTA<N =>
accept DEPOSITAR(x:in ITEM) do
BUF(ENT):=x;
end;
ENT:=(ENT+1) mod N;
CUENTA:=CUENTA+1;
or
when CUENTA>0 =>
accept RETIRAR(x: out ITEM) do
x:=BUF(SAL);
end;
SAL:=(SAL+1) mod N;
CUENTA:=CUENTA-1;
end select;
end loop;
end BUFFERING;
Las condiciones de guarda se comprueban cada vez que se entra en el select.
Siempre debe haber una condición que se cumpla (sino la petición de encola). Si en las
condiciones se comprueban variables globales no se garantiza que la condición de guarda se
siga cumpliendo a la hora de la cita (en este caso no porque son variables locales).
Otras estructuras para la sentencia select:
select
llamada al punto de entrada
else
sentencias
end select;
select
accept...
else
sentencias
end select;
select
llamada al punto de entrada
or
delay tiempo;
sentencias
end select;
select
accept...
or
delay tiempo;
sentencias
end select;