Académique Documents
Professionnel Documents
Culture Documents
DESARROLLO DE
PROTOCOLOS
UNIVERSIDAD DE SEVILLA
DEPARTAMENTO DE TECNOLOGA ELECTRNICA
DESARROLLO DE
PROTOCOLOS
Universidad de Sevilla
Departamento de Tecnologa Electrnica
Servicio de Publicaciones
Sevilla, 1994
* Facultad de Informtica y Estadstica
Avenida Reina Mercedes s/n
41012-Sevilla. SPAIN.
( 455 27 86
DESARROLLO DE PROTOCOLOS
Pgina 1
Se
denomina
actividades
Ingeniera
que,
de
partiendo
Protocolos
al
de
requisitos
unos
conjunto
de
de
protocolo
de
comunicaciones
requisitos
establecidos
(fig.
1).
Las
lugar
dentro
ejecutable
que
de
una
manera
actividades
ms
significativas
de
la
Ingeniera
de
fiable
cumple
y
eficiente
que
Protocolos
los
tienen
son
las
requisitos
de
comunicaciones
genera
una
DESARROLLO DE PROTOCOLOS
Pgina 2
El
vocabulario
de
mensajes
usados
por
el
mensajes
del
protocolo;
-
El
formato
de
cada
uno
de
los
vocabulario;
- Las reglas de procedimiento que garantizan la
consistencia del intercambio de mensajes; y
DESARROLLO DE PROTOCOLOS
Pgina 3
Lenguajes
de
especificacin.
Entre
estos
ASN.1
(ISO
CCITT)
para
descripcin
de
PDUs.
b) Validacin. Esta actividad se propone descubrir los
errores de autoconsistencia lgica que pudiese tener la
especificacin, en un esfuerzo por encontrar aquellos
errores que pueden existir en cualquier protocolo, con
independencia
de
la
funcin
especfica
que
realice.
DESARROLLO DE PROTOCOLOS
-
Crculos
ejecuta
Pgina 4
viciosos
(livelocks):
indefinidamente
una
el
protocolo
secuencia
de
pasos
Verificacin.
protocolo
Es
la
especificado
tarea
de
comprobar
realiza
que
correctamente
el
las
combinacin
de
fallos.
En
la
prctica
la
Anlisis
de
prestaciones.
El
objetivo
de
la
punto
de
vista,
midiendo
parmetros
tales
como
modificaciones
en
la
especificacin
que
DESARROLLO DE PROTOCOLOS
Pgina 5
ineficacias
en
el
producto
final.
Esta
que
Existen
deber
someterse
diversas
tcnicas
el
protocolo
para
ello
ejecutable.
incluso
un
ISO
con
el
nombre
de
TTCN
(Tree
and
Tabular
Combined Notation).
g)
Pruebas.
El
protocolo
ejecutable,
antes
de
su
unas
prestaciones
adecuadas
(tiempos
de
Los
principios
discutidos
anteriormente
pueden
DESARROLLO DE PROTOCOLOS
2.-
Pgina 6
mdulo
de
estructuras
abstraccin
se
usarn
antes
para
de
llevar
decidir
a
cabo
que
estos
decidir
negra.
como
se
Probablemente
organiza
internamente
consistir
en
cada
cajas
negras
caja
ms
difciles
de
implementar,
ms
difciles
de
de
protocolos
ms
simples,
consiste
en
separarlos,
identificar
y
los
resolverlos
individualmente.
5.-
6.-
No
introduzca
desarrollo
debe
restricciones
ser
innecesarias.
fcilmente
extensible.
Un
buen
Un
buen
DESARROLLO DE PROTOCOLOS
Pgina 7
Implemente el protocolo.
9.-
El
problema
de
la
implementacin
de
un
protocolo,
cuestiones
principalmente
ejecutable
tres
que
vas
partir
de
conviene
para
una
abordar.
obtener
un
especificacin:
Existen
protocolo
automtica,
est
descrita
la
especificacin,
el
cual
genera
el
En
primer
estrategias
lugar
para
se
establecen
implementar
los
criterios
correctamente
los
protocolos.
b)
continuacin
se
realiza
un
diseo
informtico
DESARROLLO DE PROTOCOLOS
Pgina 8
DESARROLLO DE PROTOCOLOS
Pgina 9
obtenidos
automticamente
forman
el
conjunto
del
protocolo ejecutable.
un
protocolo
pasa
necesariamente
por
una
fase
de
DESARROLLO DE PROTOCOLOS
Pgina 10
DESARROLLO DE PROTOCOLOS
Representacin de
capas
Pgina 11
Claridad conceptual
Fcil mantenimiento/sustitucin
Facilidad de pruebas
Varias capas
en un proceso
nico
Tareas
Mdulos
Comunicacin entre
capas
Asncrona
Monocola
Ahorra espacio
Centraliza funciones de gestin de colas
Lgica de gestin ms compleja
Multicola
Dificultades
Control de flujo.
Soluciones:
Ejec. atmica.
Solucin:
Asig. de prioridades a
los eventos
Inconvenientes
Dificultades de coordinacin
Limita el paralelismo
Eleva el nmero de cambios de contexto.
DESARROLLO DE PROTOCOLOS
Pgina 12
comprenden
ms
de
una
capa
del
modelo
OSI
hay
que
una
gran
claridad
conceptual,
facilita
el
cabe
que
varias
capas
sean
agrupadas
en
un
slo
al
usuario
la
constitucin
interna
del
DESARROLLO DE PROTOCOLOS
Pgina 13
b)
Representacin
de
los
Figura
proceso
5.b.-
procesos.
El
Varias
trmino
capas
por
proceso
ambiguo.
Su
concrecin
informtica
puede
la
unidad
elemental
en
la
planificacin
de
tarea
(fig.
6a)
se
obtienen
unos
lmites
claros
DESARROLLO DE PROTOCOLOS
algunos inconvenientes entre los que cabe destacar:
Pgina 14
DESARROLLO DE PROTOCOLOS
Pgina 15
contnuamente
transfirindose
de
un
proceso
denominado
contexto),
"context
switching"
una
de
involucra
serie
(cambio
operaciones
de
del
sistema
operativo
transfiere
control
una
tarea
DESARROLLO DE PROTOCOLOS
Pgina 16
diseador
debe
proporcionar
un
sistema
de
gestin
de
es
ms
rpida
(al
eliminar
los
"context
asncrona.
La
comunicacin
asncrona
se
basa
en
la
(Interface
Data
Units:
Unidades
de
Datos
de
la
(tareas/mdulos)
que
proporcionen
el
sistema
de
todas
las
conexiones
entre
las
dos
capas
una
sistema
de
dichas
monocola
almacenamiento
en
conexiones
general
centraliza
(sistema
tiende
las
multicola).
ahorrar
funciones
de
El
espacio
de
gestin
de
DESARROLLO DE PROTOCOLOS
Pgina 17
La
comunicacin
asncrona
entre
capas
presenta
dos
DESARROLLO DE PROTOCOLOS
Pgina 18
Existen
tres
formas
posible
de
abordar
esta
cuestin:
- Si se utiliza una tcnica multicola (cada conexin
emplea un par de colas), puede asignarse a estas colas
un tamao fijo por lo que si una capa las encuentra
llenas
deber
esperarse,
adecuando
de
esta
forma
su
es
necesario
que
existan
primitivas
Por
ltimo,
una
solucin
alternativa
consiste
en
para
procesarlo
simplemente
no
concede
la
La
segunda
de
las
dificultades
que
surgen
como
DESARROLLO DE PROTOCOLOS
Pgina 19
le
es
informacin.
control
existan
de
en
devuelto
Aunque
flujo
la
una
este
vez
procesada
enfoque
ejecucin
comunicacin
evita
atmica
asncrona,
completamente
los
problemas
de
eventos,
introduce
la
de
que
serias
de
elevando
paralelismo
el
nmero
en
de
la
ejecucin
"context
de
los
switchings"
mismos
cuando
los
DESARROLLO DE PROTOCOLOS
Tratamiento
de eventos
Orden de tratamiento
Pgina 20
FIFO
Simple
Con prioridades
Aleatorio
Simple
Con prioridades
Efecto de la lectura
Permanece en la cola.
Requiere:
Desaparece de la cola.
Requiere:
Almacenamiento interno de
eventos
Especificacin de eventos
almacenados
Representac
in de
esperas
En rutinas: necesita
gestor de mdulos
Simple
Transferencia cuando debe actuar
Transferencia de orden aleatorio
En corrutinas
Simple
Transferencia cuando debe actuar
Transferencia en orden aleatorio
En tablas (estado,
evento, condicin)
Ms lento
Representac
in de
temporizado
res
En proceso externo
DESARROLLO DE PROTOCOLOS
Pgina 21
prioritario,
sea
no
el
ms
antiguo
(fig.
8b).
anlisis
de
prestaciones
pruebas,
ya
que
DESARROLLO DE PROTOCOLOS
Pgina 22
Otro
aspecto
considerar
en
el
tratamiento
de
los
por
consideracin
encontrarse
el
evento,
en
el
debe
estado
adecuado,
realizarse
una
toma
en
operacin
DESARROLLO DE PROTOCOLOS
Pgina 23
DESARROLLO DE PROTOCOLOS
Pgina 24
ser
rechazado
es
necesario
que
se
proceda
un
no
de
los
tratados
eventos
en
un
almacenados.
estado
son
Por
tanto,
descartados.
los
Este
sistema requiere:
- un mecanismo de gestin del almacenamiento interno de
eventos.
- una especificacin de los eventos que, por no poder
ser
tratados
en
un
estado,
deban
ser
las
esperas.
Existen
almacenados
internamente.
b)
Representacin
de
principalmente
una
operativo
el
tarea
que
independiente,
controla
la
siendo
ejecucin
de
el
las
sistema
distintas
DESARROLLO DE PROTOCOLOS
Pgina 25
{
for (;;)
{
espera_a();
lee_evento_a();
procesa_evento_a();
}
}
main() /* Mquina B */
{
for (;;)
{
espera_b();
lee_evento_b();
procesa_evento_b();
}
}
mdulos
especfico,
representarse
de
dos
la
espera
formas.
En
de
una
mquina
puede
primer
lugar,
puede
DESARROLLO DE PROTOCOLOS
Pgina 26
en
orden
aleatorio,
principalmente en simulacin.
Por
ltimo,
representan
mediante
tambin
mdulos
cuando
de
una
las
tarea
mquinas
nica,
se
pueden
mdulos
mediante
la
tcnica
de
corrutinas.
Una
vez
control
tambin
segn
la
tcnica
de
DESARROLLO DE PROTOCOLOS
Pgina 27
arranca_maquina_a();
arranca_maquina_b();
for (;;)
{
corrutina_maquina_a();
corrutina_maquina_b();
}
}
maquina_a() /* Mquina A */
{
for (;;)
{
espera_a();
lee_evento_a();
procesa_evento_a();
}
}
maquina_b() /* Mquina B */
{
for (;;)
{
espera_b();
lee_evento_b();
procesa_evento_b();
}
}
arranca_maquina_a()
{
reserva_espacio_pila();
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) maquina_a();
}
arranca_maquina_b()
{
reserva_espacio_pila();
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) maquina_b();
}
corrutina_maquina_a()
{
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) longjmp(punto_salto_maquina_a,1);
}
corrutina_maquina_b()
{
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) longjmp(punto_salto_maquina_b,1);
}
DESARROLLO DE PROTOCOLOS
Pgina 28
espera_maquina_a()
{
valor=setjmp(punto_salto_maquina_a);
if (valor==0) longjmp(punto_salto_gestor_modulos,1);
}
espera_maquina_b()
{
valor=setjmp(punto_salto_maquina_b);
if (valor==0) longjmp(punto_salto_gestor_modulos,1);
}
La
reserva
de
espacio
en
la
pila
es
una
condicin
"setjmp"
"longjmp"
con
las
que
se
han
DESARROLLO DE PROTOCOLOS
Pgina 29
se
expresan
(estado,
combinacin
adicional
de
que
las
evento,
estado
se
mquinas
de
condicin).
evento,
imponga,
se
estados
Para
para
expresan
cada
cada
mediante
posible
condicin
tabularmente
las
similares).
estructura
de
Estas
(estado,
sentencias
evento,
pueden
condicin),
tomar
o
bien
una
de
ejecuta
mayor
velocidad,
ya
que
no
hay
que
ir
DESARROLLO DE PROTOCOLOS
Pgina 30
de
representacin
de
transiciones
elegido,
es
la
enciende
aleatoriamente
una
de
las
lmparas.
Si
el
apaga.
Transcurrido
un
segundo
se
vuelve
encender
por
descuido
del
jugador,
se
encienden
las
dos
lmpara.
Este
sencillo
juego
puede
modelarse
de
anexos
presentan
las
"maqsimp1",
tres
"maqsimp2"
alternativas
de
"maqsimp3"
representacin
de
DESARROLLO DE PROTOCOLOS
Pgina 31
DESARROLLO DE PROTOCOLOS
Pgina 32
sealar.
Fundamentalmente
son
dos
las
formas
de
13a)
la
En
el
primero
de
estos
activacin o cancelacin de un
enfoques
timer
se
(fig.
traducen
en
una
DESARROLLO DE PROTOCOLOS
Pgina 33
el
valor
del
reloj
(real
simulado).
Una
vez
avise
(active
el
proceso
de
gestin
de
timers)
el
evento
correspondiente
en
original.
la
mquina
DESARROLLO DE PROTOCOLOS
Pgina 34
La
representacin
de
los
temporizadores
mediante
timer.
en
vigor
consideracin.
El
de
un
proceso
evento,
de
la
ste
no
cancelacin
es
de
tomado
un
en
timer
DESARROLLO DE PROTOCOLOS
Pgina 35
Una
cuestin
que
se
plantea
frecuentemente
en
el
una
determinada
capa
es
descrita
mediante
una
nica
estados
con
valores
de
variables
distintas,
Pero
intentan
si
varios
utilizar
programas
de
un
sistema
simultneamente
las
multitarea
facilidades
una
individual,
copia
que
se
de
la
mquina
encuentra
en
de
un
estado,
estado
la
mquina-
absolutamente
representacin
de
estas
mquinas
mltiples
puede
mquinas
individuales
se
plasma
mediante
un
proceso
DESARROLLO DE PROTOCOLOS
Pgina 36
mquinas-individuales
existan.
Esta
solucin
implica
Proceso nico
Variables indexadas
Corrutinas
Si
iguales
se
opta
mediante
por
un
representar
nico
las
proceso
mltiples
(fig.
15)
mquinas
todas
las
son
independientes.
Esto
se
traduce
en
una
la
que
corresponde.
Cuando
se
transfiere
DESARROLLO DE PROTOCOLOS
Pgina 37
DESARROLLO DE PROTOCOLOS
Pgina 38
La
segunda
alternativa
implica
el
uso
de
corrutinas
DESARROLLO DE PROTOCOLOS
Pgina 39
ubicadas en la pila.
(fig.
se
correspondiente
16),
puede
a
la
la
efectuar
ejecucin
de
una
utilizando
un
nico
mquina-tipo,
el
cual
mquina
cdigo
utiliza
las
DESARROLLO DE PROTOCOLOS
Pgina 40
de
tanto,
la
zona
adecuada
no
tienen
que
de
la
estar
pila.
Las
indexadas
variables,
con
lo
que
por
se
facilita
la
generacin
automtica.
implementacin
de
El
programa
mquinas
anexo
mltiples
respecto
lo
mencionado
en
estas
lneas
(ver
DESARROLLO DE PROTOCOLOS
Pgina 41
En
un
informacin
determinado
que
nivel,
circula,
digamos
denominada
nivel
N,
(N)-PDU,
la
est
bastante
considerable,
principalmente
para
el
La
comprobacin
temprana
de
la
consistencia
El
uso
de
hardware
especfico
para
tratamiento
DESARROLLO DE PROTOCOLOS
Pgina 42
DESARROLLO DE PROTOCOLOS
Pgina 43
Empaquetamiento/desempaquetamiento,
situacin
en
la
En
mejoran
general
las
la
concatenacin
prestaciones
(la
el
empaquetamiento
eficiencia)
aunque,
en
retardo.
Sin
embargo
la
segmentacin
puede
reducir
Adicionalmente
la
segmentacin
complica
DESARROLLO DE PROTOCOLOS
Pgina 44
El
produce
flujo
en
de
todo
informacin
protocolo
de
de
una
capa
otra
comunicaciones,
que
supone
se
una
de
coordinacin
una
zona
con
de
el
memoria
resto
de
del
tamao
zonas
de
adecuado,
la
memoria,
la
(tabla
4):
a)
ubicacin
de
las
zonas
de
DESARROLLO DE PROTOCOLOS
a)
Ubicacin
de
las
Pgina 45
zonas
de
almacenamiento.
Para
esta
de
todas
las
capas
del
protocolo
presenta
obviamente,
cuando
la
estructura
dada
las
se
enmarca
(lenguaje,
sistema
operativo,
plataforma,
se
utiliza
esta
tcnica,
en
general
se
aprovecha
reservas
propias
de
la
situacin
global
ms
debe
solicitudes
ponerse
de
una
especial
capa
cuidado
capas
en
agoten
evitar
que
rapidamente
las
la
saturacin
de
la
memoria
las
capas
encargadas
DESARROLLO DE PROTOCOLOS
Pgina 46
Ubicacin zonas de
almacenamiento
Gestor de memoria
Sistema Operativo
Codificacin ms simple
Cuidado con asignacin dinmica
Por copia
Simplicidad
Fuerte sobrecarga de proceso
Por referencia
Gestin ms compleja
Mayor velocidad
Almacenamiento de PDUs
Contiguas
No contiguas
Gestor ms complejo
Buen aprovechamiento de la memoria
Liberacin de la memoria
Donde
En la capa ms baja
(transmisin)
En la capa ms alta
(recepcin)
Peligros
DESARROLLO DE PROTOCOLOS
Pgina 47
proporcionan
programacin
que
el
sistema
operativo
se
use
traduce
se
el
lenguaje
normalmente
en
de
una
por
el
contrario
redunda
en
una
cierta
prdida
de
han
hecho
necesariamente
de
otros
mdulos
comunicaciones.
del
Si
programa,
por
el
no
contrario
se
c)
Paso
de
PDU's
entre
capas.
Tres
son
las
formas
de
mediante
la
tcnica
de
"impreso"
mediante
la
el
nivel
(N+1),
aadindole
la
cabecera
cola
DESARROLLO DE PROTOCOLOS
enrgicamente
Pgina 48
desaconsejada,
slo
se
justifica
por
la
de
aplicacin,
excepcin
de
las
PDUs
de
control)
inferiores.
De
esta
forma
un
nivel
le
pasa
al
la
informacin
pertinente
dicho
nivel.
Por
memoria
distintas
punteros
no
contigua
partes
de
unas
de
para
una
zonas
almacenar
cada
PDU,
utilizando
otras
(fig.
una
para
21a)
de
las
unirlas
una
lista
d)
Almacenamiento
almacenar
los
de
PDUs
PDU's.
La
consiste
en
tcnica
ms
ubicarlas,
simple
sin
para
ninguna
si,
como
es
frecuente,
tamaos
muy
diferentes,
la
las
gestin
PDUs
del
pueden
ser
de
almacenamiento
se
vacantes
las
PDUs
despus
de
ser
extraidas
de
la
DESARROLLO DE PROTOCOLOS
Pgina 49
borran
ficheros,
puede
solucionarse
bien
con
una
trozos
de
tamao
fijo
(relativamente
pequeos)
el
DESARROLLO DE PROTOCOLOS
Pgina 50
la
misma
cuando
ya
no
resulta
necesario
su
uso.
Una
tanto
esta
cuestin
debe
dedicrsele
un
especial
la
liberacin
de
la
memoria
correspondiente
debe
de
impreso
PDUs
de
se
realiza
por
referencia
dispersin-recopilacin),
la
DESARROLLO DE PROTOCOLOS
Pgina 51
deber
encargadas
estudiarse
del
con
cautela
almacenamiento
cuales
temporal
son
las
de
la
considerarse
con
cuidado
la
capa
capas
que
DESARROLLO DE PROTOCOLOS
Pgina 52
despus,
comunicaciones.
el
problema
Ms
an,
del
hardware
cuando
se
especfico
habla
de
de
estos
El
manejo
del
hardware
de
comunicaciones
puede
gestin
directa
sistema
operativo.
La
comunicaciones
puede
usando
gestin
las
directa
realizarse,
facilidades
del
hardware
suponiendo
que
del
de
el
tcnica
de
exploracin
consiste
en
la
comprobacin
DESARROLLO DE PROTOCOLOS
Gestin directa
Pgina 53
Exploracin
Ineficaz
Fuerte sobrecarga
Posible prdida de informacin
Interrupciones
Sistema eficaz
Codificacin compleja
DMA
Sin interrupciones
Con interrupciones
Codificacin simple
Mayor coordinacin con otras
tareas
Mayores tiempos de respuesta
Sobrecarga
Usando
avisa
la
cuando
tcnica
est
de
interrupciones
listo
para
el
transmitir
dispositivo
una
nueva
sistema
es
en
general
mucho
ms
adecuado
pues
no
hay
que
interrupciones
considerar
es,
tambin
normalmente,
una
que
el
tarea
de
manejo
una
de
cierta
complejidad.
puede
memoria
realizar
(DMA).
En
la
gestin
esta
mediante
alternativa
acceso
la
directo
transmisin
a
o
DESARROLLO DE PROTOCOLOS
Pgina 54
frecuente,
por
interrupciones.
Cuando
el
dispositivo
concreto
(driver).
ellos
recibe
se
el
accede
nombre
mediante
de
la
manipulador
invocacin
de
recepcin
de
informacin.
Algunas
de
estas
una
ms
eficaz
gestin
de
las
transferencias
de
de
prdida
tareas,
de
pero
control,
por
los
el
contrario
tiempos
de
hay
una
respuesta
cierta
son
ms
DESARROLLO DE PROTOCOLOS
Pgina 55
de
dnde
se
ubique
el
protocolo,
pudiendo
de
los
procesos.
comunicaciones
(o
Si
se
utiliza
"front-end")
la
un
frontal
relacin
con
de
otros
entre
comunicacin
estar
los
procesadores
normalmente
respectivos.
basada
en
un
Dicha
protocolo
la
informacin
complejos
que
procesador
principal
comunicacin.
La
puedan
de
manejar
estar
las
los
protocolos
ms
presentes,
liberando
al
tareas
intercomunicacin
procesador
principal
siguientes
mtodos:
suele
por
entre
realizarse
BUS
(fig.
ms
pesadas
el
por
22a),
de
la
el
frontal
alguno
de
los
normalmente
con
DESARROLLO DE PROTOCOLOS
Ubicacin
En un front-end
Pgina 56
En el mismo procesador
DESARROLLO DE PROTOCOLOS
Pgina 57
procesos
se
realizar
mediante
el
manejo
de
las
tareas
que
proporcione
el
sistema
operativo
y,
DESARROLLO DE PROTOCOLOS
eventualmente
tambin,
Pgina 58
a
travs
de
zonas
globales
de
(aunque
puedan
estar
compartidas
entre
varios
general
de
consideraciones
de
diseo
globales
de
la
ANEXOS
DESARROLLO DE PROTOCOLOS
Pgina 60
ANEXOS
Programa GESCOR.C.
DESARROLLO DE PROTOCOLOS
{
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) maquina_a();
}
else arranca_maquina_a(reserva);
return;
}
corrutina_maquina_a()
{
int valor;
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) longjmp(punto_salto_maquina_a,1);
return;
}
maquina_b()
{
int valor,paso;
printf("Activada mquina B\n");
paso=0;
for (;;)
{
valor=setjmp(punto_salto_maquina_b);
if (valor==0) longjmp(punto_salto_gestor_modulos,1);
printf("Mquina B. Paso %d\n",++paso);
} /* Fin del bucle infinito */
} /* Fin del mdulo B */
arranca_maquina_b(reserva)
int reserva;
{
int valor;
reserva--;
if (reserva<=0)
{
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) maquina_b();
}
else arranca_maquina_b(reserva);
return;
}
corrutina_maquina_b()
{
int valor;
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) longjmp(punto_salto_maquina_b,1);
return;
}
Programa GESTOR.
Pgina 61
DESARROLLO DE PROTOCOLOS
Pgina 62
100
/* Este define marca el nmero de veces
que se activa recursivamente la rutina de
llamada de mdulos antes de llamar
definitavemente al mdulo. Es una medida
indirecta de la cantidad de espacio
reservado en el stack para la llamada a
subrutinas de cada mquina individual */
DESARROLLO DE PROTOCOLOS
Pgina 63
*
reservando espacio de stack para ellas y esbleciendo
*
los puntos de salto a las mismas. La activacin de
*
estas rutinas se hace en forma de corrutinas que,
*
por tanto, estn siempre activas. La llamada a cada
*
una de las tareas de cada uno de los mdulos se hace
*
recursivamente.
*
*
En una segunda fase realiza un bucle infinito para
*
dar control en orden aleatorio a cada una de las tareas
*
que componen la especificacin.
*
*
Adicionalmente deberan incluirse en el proceso de
*
inicilizacin como corrutinas y de cesin de control
*
en cada uno de los pasos del bucle infinito, todas
*
aquellas rutinas de simulacin, almacenamiento,
*
presentacin, y control general de la ejecucin de
*
de la especificacin que fuesen necesarias. El orden
*
de estas rutinas no tiene por que ser aleatorio sino
*
que normalmente se har su activacin en un orden
*
determinado al final de la activacin de todas las
*
mquinas individuales.
*
*********************************************************************/
gestor()
{
int i,valor;
int modulo,tarea;
/**** Fase de inicializacin *********/
valor=setjmp(salto_vuelta_modulo_A); /* Establece punto de vuelta
de la corrutina */
if (valor==0) llamada_modulo_A(0); /* Activa la primera tarea del
primer mdulo */
/***** Fase de cesin cclico de control
********/
while(1)
{
for (i=0;i<n_total_tareas;i++)
{
decide_tarea_aleatoriamente(i,&modulo,&tarea);
switch (modulo)
{
case 0:
valor=setjmp(salto_vuelta_modulo_A); /* Punto de vuelta de la
corrutina */
if (valor==0)
longjmp(salto_ida_modulo_A[tarea],1); /* Va a la corrutina
correspondiente a la
tarea calculada del
mdulo A */
break;
case 1:
valor=setjmp(salto_vuelta_modulo_B);
if (valor==0) longjmp(salto_ida_modulo_B[tarea],1);
break;
} /* Fin del switch */
} /* Fin del bucle de llamada a todas las mquinas individuales */
valor=setjmp(salto_vuelta_mmi);
if (valor==0) longjmp(salto_ida_mmi,1);
printf("\n");
DESARROLLO DE PROTOCOLOS
Pgina 64
}
return;
}
/****************************************************************
*
*
Esta rutina calcula aleatoriamente el mdulo y la tarea
*
a los que debe cederseles el control.
*
*
Para ello calcula unas tablas aleatorias que son inicializadas
*
cada vez que se ejecuta un paso en todas las mquinas
*
individuales.
*
****************************************************************/
decide_tarea_aleatoriamente(vez,modulo,tarea)
int vez,*modulo,*tarea;
{
static int tabla_modulo[n_total_tareas]={0,0,0,1,1}; /* Las constantes
*/
static int tabla_tarea[n_total_tareas] ={0,1,2,0,1}; /* son obtenidas
por
el generador de
cdigo C */
static int tabla_modulo_elegido[n_total_tareas];
static int tabla_tarea_elegida[n_total_tareas];
static int tarea_elegida[n_total_tareas];
int i,j,n,contador;
/***** La primera activacin en cada paso dispara el clculo de
las tablas aleatorias *****/
if (vez==0)
{
for (i=0;i<n_total_tareas;i++) tarea_elegida[i]=0;
for (i=0;i<n_total_tareas;i++)
{
n=random(n_total_tareas-i);
contador=-1;
for (j=0;j<n_total_tareas;j++)
{
if (tarea_elegida[j]==0) contador++;
if (n==contador)
{
tarea_elegida[j]=1;
tabla_modulo_elegido[i]=tabla_modulo[j];
tabla_tarea_elegida[i]=tabla_tarea[j];
break;
}
} /* Fin de la busqueda de la tarea elegida */
} /* Fin del for i */
} /* Fin del calculo de las tablas aleatorias */
/***** Determinacin del mdulo y tarea basado en las tablas *****/
*modulo=tabla_modulo_elegido[vez];
*tarea=tabla_tarea_elegida[vez];
return;
}
/*******************************************************************
*
*
Mdulo A correspondiente al cuerpo de un mdulo en ESTELLE
*
DESARROLLO DE PROTOCOLOS
Pgina 65
*
Aqu figurarn las transiciones, actuaciones y, en
*
general todos aquellos procesos necesarios para la
*
ejecucin de una mquina individual.
*
*
La rutina tiene una primera fase de inicializacin
*
donde va activando recursivamente todas las mquinas
*
individuales. Cuando finaliza, activa la primera mquina
*
individual del mdulo siguiente.
*
*
La rutina no finaliza nunca sino que se le transfiere
*
y devuelve el control mediante la tcnica de corrutinas
*
*********************************************************************/
modulo_A(tarea)
int tarea;
{
int valor;
int paso;
int j;
char buf[2];
/**** Variables tomadas como ejemplo para comprobar que los valores
de las mismas son independientes para cada mquina individual */
j=random(100);
buf[0]=random(100);
buf[1]=random(100);
printf("Entra en mdulo A con tarea= %d; j= %d; buf: %d %d\n",
tarea,j,buf[0],buf[1]);
paso=-1;
while (1)
{
/****** Fase de inicializacin de la corrutina *****/
valor=setjmp(salto_ida_modulo_A[tarea]);
if (valor==0)
if( tarea < (n_tareas_modulo_A-1) && arrancando_modulo_A)
llamada_modulo_A(++tarea,RESERVA_STACK); /* Activa otra
tarea del mimo mdulo */
else
{
if (arrancando_modulo_A)
{
arrancando_modulo_A=0;
valor=setjmp(salto_vuelta_modulo_B);
if (valor==0)
llamada_modulo_B(0,RESERVA_STACK); /* Activa la primera
tarea del mdulo
siguiente */
}
longjmp(salto_vuelta_modulo_A,1);
}
/******
paso++;
printf("Mdulo A: Tarea %d; Paso %d; ",tarea,paso);
j++;
buf[0]++;
buf[1]++;
printf("j= %d; Buf: %d %d\n",j,buf[0],buf[1]);
} /* Fin del bucle infinito */
} /* Fin del mdulo A */
DESARROLLO DE PROTOCOLOS
Pgina 66
/*********************************************************************
*
*
Rutina para reservar espacio en el stack. Esta rutina debe
*
ser generada por el generador de cdigo para cada uno de
*
los mdulos de la especificacin.
*
*
Si la activacin de un mdulo que se realiza para cada mquina
*
individual se hiciera directamente llamando a la rutina
*
correspondiente, las variables del mdulo llamado se almacenaran
*
en el stack a continuacin de las variables del mdulo llamante
*
EN EL MOMENTO DE LA LLAMADA. Si posteriormente el mdulo llamante
*
al tener control en alguno de sus ejecuciones, necesitara ampliar
*
el nmero de variables almacenados en el stack, machacara
*
las variables del mdulo llamado.
*
*
Para evitarlo, la activacin se hace de forma que las variables
*
del mdulo llamado no empiecen a continuacin de las del mdulo
*
llamador. Para ello se realiza un cierto nmero de veces la
*
llamada recursiva a esta rutina antes de llamar definitivamente
*
la rutina correspondiente. Con ello las variables de esta rutina
*
son las que se colocan en la pila una y otra vez a continuacin
*
de las variables del mdulo llamante, y sern por tanto las
*
variables destruidas por el mdulo llamante en caso de ampliar
*
sus necesidades de uso del stack. Las variables destruidas no
*
necesitan ser conservadas por lo que esta destruccin no afecta
*
al funcionamiento del sistema.
*
***********************************************************************/
llamada_modulo_A(tarea,reserva)
int tarea,reserva;
{
reserva--;
if (reserva<=0) modulo_A(tarea);
else llamada_modulo_A(tarea,reserva);
return;
}
/******** Rutina correspondiente al mdulo B *******/
modulo_B(tarea)
int tarea;
{
int valor;
int paso;
int k;
char baf[2];
k=random(100);
baf[0]=random(100);
baf[1]=random(100);
printf("Entra en mdulo B con tarea= %d; k= %d; baf: %d %d\n",
tarea,k,baf[0],baf[1]);
paso=-1;
while (1)
{
valor=setjmp(salto_ida_modulo_B[tarea]);
if (valor==0)
if( tarea < (n_tareas_modulo_B-1) && arrancando_modulo_B)
llamada_modulo_B(++tarea,RESERVA_STACK);
else
{
if (arrancando_modulo_B)
{
arrancando_modulo_B=0;
DESARROLLO DE PROTOCOLOS
Pgina 67
valor=setjmp(salto_vuelta_mmi);
if (valor==0)
llamada_mmi(RESERVA_STACK); /* Al ser el timo mdulo ESTELLE
activa el primer mdulo de gestin,
en este ejemplo el mmi que, adems,
es el nico */
}
longjmp(salto_vuelta_modulo_B,1);
}
paso++;
printf("Mdulo B: Tarea %d; Paso %d; ",tarea,paso);
k++;
baf[0]++;
baf[1]++;
printf("k= %d; Baf: %d %d\n",k,baf[0],baf[1]);
}
}
/****** Rutina de llamada al mdulo B *****/
llamada_modulo_B(tarea,reserva)
int tarea,reserva;
{
reserva--;
if (reserva<=0) modulo_B(tarea);
else llamada_modulo_B(tarea,reserva);
return;
}
/********************************************************************
*
*
Rutina que simula el Man Machine Interface (MMI)
*
********************************************************************/
mmi()
{
int tecla;
printf("Entra en el mmi\n");
while (1)
{
tecla=leetecla();
printf("MMI: Se puls la tecla %d\n",tecla);
}
}
/****** Rutina de llamada al mmi *****/
llamada_mmi(reserva)
int reserva;
{
reserva--;
if (reserva<=0) mmi();
else llamada_mmi(reserva);
return;
}
/**************************************************************
*
*
Rutina de lectura de tecla
*
*
Si no se ha pulsado niguna tecla devuelve el control
*
al gestor de tareas con tcnica de corrutina.
*
DESARROLLO DE PROTOCOLOS
Pgina 68
*
Cuando se pulsa una tecla devuelve el control al MMI
*
para que ejecute un ciclo no muy largo y velva a llamar
*
a leetecla. Esta cesin de control se hace con tcnica de
*
subrutina normal.
*
*****************************************************************/
leetecla()
{
int i,j,valor;
while(!kbhit())
{
valor=setjmp(salto_ida_mmi);
if (valor==0) longjmp(salto_vuelta_mmi,1);
}
i=getch();
if (i!=0) return(i);
j=getch();
return(j<<8);
}
Programa GESCORM.C.
main() /* El main tan slo sirve para dar soporte a la rutina gestor */
{
printf("\n\n\n");
gestor_modulos();
}
#define
#define
jmp_buf
jmp_buf
jmp_buf
n_maquinas_tipo_a 3
n_maquinas_tipo_b 2
punto_salto_maquina_a[n_maquinas_tipo_a];
punto_salto_maquina_b[n_maquinas_tipo_b];
punto_salto_gestor_modulos;
gestor_modulos()
{
int i;
DESARROLLO DE PROTOCOLOS
Pgina 69
DESARROLLO DE PROTOCOLOS
Pgina 70
{
int valor;
reserva--;
if (reserva<=0)
{
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) maquina_b(tarea);
}
else arranca_maquina_b(tarea,reserva);
return;
}
corrutina_maquina_b(tarea)
int tarea;
{
int valor;
valor=setjmp(punto_salto_gestor_modulos);
if (valor==0) longjmp(punto_salto_maquina_b[tarea],1);
return;
}
Programa MAQSIMP1.C.
Representacin
mediante tablas.
de
una
mquina
de
estados
typedef struct
{
int
condicion;
int
accion;
int
nuevo_estado;
void
*siguiente_transicion;
} transicion;
typedef struct
{
int codigo;
int parametro;
} evento;
#define NULA
#define NUM_ES_A
#define NUM_EV_A
enum
enum
enum
enum
0
2
2
estados_a {ES1_A,ES2_A};
eventos_a {EV1_A,EV2_A};
condiciones_a {P1_A,P2_A};
salidas_a {SAL1_A,SAL2_A,SAL3_A,SAL4_A};
transicion transicion_ES1A_EV1A={NULA,SAL2_A,ES2_A,NULA};
transicion transicion_ES1A_EV2A={NULA,NULA,ES1_A,NULA};
simple
DESARROLLO DE PROTOCOLOS
Pgina 71
transicion transicion_ES2A_EV1A={NULA,SAL2_A,ES2_A,NULA};
transicion transicion_ES2A_EV2A_1={P1_A,SAL3_A,ES1_A,NULA};
transicion transicion_ES2A_EV2A_2={P2_A,SAL4_A,ES2_A,NULA};
transicion maquina[NUM_ES_A][NUM_EV_A];
int estado_a=ES1_A;
int accion_inicial_a=SAL1_A;
evento lee_evento();
int estado_luz_roja,estado_luz_verde;
inicia_maquina_a()
{
maquina[ES1_A][EV1_A]=transicion_ES1A_EV1A;
maquina[ES1_A][EV2_A]=transicion_ES1A_EV2A;
maquina[ES2_A][EV1_A]=transicion_ES2A_EV1A;
maquina[ES2_A][EV2_A]=transicion_ES2A_EV2A_1;
transicion_ES2A_EV2A_1.siguiente_transicion=&transicion_ES2A_EV2A_2;
accion_a(accion_inicial_a);
}
maquina_a()
{
evento ultimo_evento;
transicion transicion_disparada,transicion_anterior;
ultimo_evento=lee_evento();
transicion_disparada=maquina[estado_a][ultimo_evento.codigo];
do
{
if (condicion_a(transicion_disparada.condicion))
{
estado_a=transicion_disparada.nuevo_estado;
accion_a(transicion_disparada.accion);
}
else
{
transicion_anterior=transicion_disparada;
transicion_disparada=*(transicion
*)(transicion_disparada.siguiente_transicion);
}
} while (transicion_anterior.siguiente_transicion!=NULA);
} /* Fin del programa */
condicion_a(condicion)
int condicion;
{
switch (condicion)
{
case P1_A:
if ( hay_solo_una_luz_encendida() &&
boton_y_luz_del_mismo_color() ) return(1);
else return(0);
case P2_A:
if (!hay_solo_una_luz_encendida() )return(1);
else return(0);
}
}
accion_a(accion)
int accion;
DESARROLLO DE PROTOCOLOS
Pgina 72
{
switch (accion)
{
case SAL1_A:
activa_timer();
break;
case SAL2_A:
enciende_luz_roja_o_verde();
activa_timer();
break;
case SAL3_A:
apaga_una_luz();
break;
case SAL4_A:
informa_perdida_juego();
break;
}
}
Programa MAQSIMP2.C.
Representacin
mediante seleccin
condicin).
de
en
una mquina
de
estados
simple
cdigo de tipo (estado, evento,
typedef struct
{
int codigo;
int parametro;
} evento;
enum estados_a {ES1_A,ES2_A};
enum eventos_a {EV1_A,EV2_A};
int estado_a=ES1_A;
evento lee_evento();
int estado_luz_roja,estado_luz_verde;
inicia_maquina_a()
{
activa_timer();
return;
}
maquina_a()
{
evento ultimo_evento;
DESARROLLO DE PROTOCOLOS
Pgina 73
ultimo_evento=lee_evento();
switch(estado_a)
{
case ES1_A:
switch (ultimo_evento.codigo)
{
case EV1_A:
enciende_luz_roja_o_verde();
activa_timer();
estado_a=ES2_A;
break;
case EV2_A:
break;
} /* Fin del switch de los eventos del estado ES1_A */
break;
case ES2_A:
switch (ultimo_evento.codigo)
{
case EV1_A:
break;
case EV2_A:
if ( hay_solo_una_luz_encendida() && boton_y_luz_del_mismo_color()
)
{
apaga_una_luz();
estado_a=ES1_A;
}
else if (!hay_solo_una_luz_encendida())
{
informa_perdida_juego();
}
break;
} /* Fin del switch de los eventos del estado ES2_A */
break;
} /* Fin del switch de los estados */
} /* Fin de la maquina a */
Programa MAQSIMP3.C
Representacin
mediante seleccin
condicin).
de
en
DESARROLLO DE PROTOCOLOS
Pgina 74
typedef struct
{
int codigo;
int parametro;
} evento;
enum estados_a {ES1_A,ES2_A};
enum eventos_a {EV1_A,EV2_A};
int estado_a=ES1_A;
evento lee_evento();
int estado_luz_roja,estado_luz_verde;
inicia_maquina_a()
{
activa_timer();
return;
}
maquina_a()
{
evento ultimo_evento;
ultimo_evento=lee_evento();
switch(ultimo_evento.codigo)
{
case EV1_A:
switch (estado_a)
{
case ES1_A:
enciende_luz_roja_o_verde();
activa_timer();
estado_a=ES2_A;
break;
case ES2_A:
break;
} /* Fin del switch de los estados del evento EV1_A */
break;
case EV2_A:
switch (estado_a)
{
case ES1_A:
break;
case ES2_A:
if ( hay_solo_una_luz_encendida() && boton_y_luz_del_mismo_color()
)
{
apaga_una_luz();
estado_a=ES1_A;
}
else if (!hay_solo_una_luz_encendida())
{
informa_perdida_juego();
}
break;
} /* Fin del switch de los estados del evento EV2_A */
break;
} /* Fin del switch de los eventos */
DESARROLLO DE PROTOCOLOS
Pgina 75
} /* Fin de la maquina a */
Programa MAQSIMP.C.
DESARROLLO DE PROTOCOLOS
Pgina 76
break;
case EV2_A:
break;
} /* Fin del switch de los eventos del estado ES1_A */
break;
case ES2_A:
switch (ultimo_evento.codigo)
{
case EV1_A:
enciende_luz_roja_o_verde();
activa_timer();
break;
case EV2_A:
if ( hay_solo_una_luz_encendida() && boton_y_luz_del_mismo_color()
)
{
apaga_una_luz();
estado_a=ES1_A;
}
else if (!hay_solo_una_luz_encendida())
{
informa_perdida_juego();
}
break;
} /* Fin del switch de los eventos del estado ES2_A */
break;
} /* Fin del switch de los estados */
} /* Fin de la maquina a */
activa_timer()
{
genera_suceso(EV1_A,MAQUINA_A,0,0,5.);
return;
}
apaga_una_luz()
{
int luz;
luz=genera_error(0.5);
if (luz)
if (estado_luz_roja==1) estado_luz_roja=0;
else
estado_luz_verde=0;
else
if (estado_luz_verde==1) estado_luz_verde=0;
else
estado_luz_roja=0;
printf("%5.0f %d %d\n",tiempo_transcurrido(),
estado_luz_roja,estado_luz_verde);
return;
}
boton_y_luz_del_mismo_color()
{
int boton;
boton=ultimo_evento.parametro; /* 0:rojo; 1:verde */
if ( (boton==0) && (estado_luz_roja==1) ) return(1);
if ( (boton==1) && (estado_luz_verde==1) ) return(1);
return(0);
}
DESARROLLO DE PROTOCOLOS
Pgina 77
hay_solo_una_luz_encendida()
{
int i;
i=estado_luz_roja+estado_luz_verde;
if (i==1) return(1);
else
return(0);
}
enciende_luz_roja_o_verde()
{
int luz;
luz=genera_error(0.5);
if (luz) estado_luz_roja=1;
else
estado_luz_verde=1;
printf("%5.0f %d %d\n",tiempo_transcurrido(),
estado_luz_roja,estado_luz_verde);
return;
}
informa_perdida_juego()
{
printf("Has perdido la partida. Para salir del juego pulsa x\n");
return;
}
lee_evento()
{
struct suceso ultimo_suceso;
int *puntero;
lee_proximo_suceso(&ultimo_suceso);
ultimo_evento.codigo=ultimo_suceso.codigo;
puntero=ultimo_suceso.parametros;
ultimo_evento.parametro=*puntero;
return;
}
lee_teclado()
{
char tecla;
static int boton;
tecla=getch();
if (tecla=='r')
{
boton=0;
genera_suceso(EV2_A,MAQUINA_A,0,&boton,0.);
return;
}
if (tecla=='v')
{
boton=1;
genera_suceso(EV2_A,MAQUINA_A,0,&boton,0.);
return;
}
if (tecla=='x') exit();
}