Escolar Documentos
Profissional Documentos
Cultura Documentos
Contenido
1
La
receta:
descripcin
terica.......................................................................................................................... 2
Patrones
de
cdigo:
bloqueo
condicional
y
desbloqueo.................................................................... 2
Los
pasos
de
la
receta........................................................................................................................................ 4
2
La
tcnica
en
accin.............................................................................................................................................. 5
Paso
1.
Esquema
bsico
del
algoritmo....................................................................................................... 5
Paso
2.
Localizar
los
puntos
de
bloqueo
y
las
condiciones............................................................... 5
Paso
3.
Escribir
las
condiciones
de
bloqueo
de
manera
formal...................................................... 6
Paso
4.
Localizar
los
puntos
de
desbloqueo............................................................................................. 6
Paso
5.
Aplicar
los
patrones
de
cdigo
...................................................................................................... 7
Paso
6.
Optimizar
el
cdigo.......................................................................................................................... 10
3
Cerrojos
y
variables
condicin...................................................................................................................... 10
4
Versin
simplicicada:
cola
de
espera
nica.............................................................................................. 10
5
Conclusin.............................................................................................................................................................. 12
Los
patrones
de
cdigo
que
resuelven
los
bloqueos
y
desbloqueos
son
exactamente
tres:
bloqueo
de
un
proceso
desbloqueo
de
un
proceso
desbloqueo
de
todos
los
procesos
que
estn
en
cola
En
los
siguientes
apartados
describimos
esos
tres
patrones.
Variables
compar=das
Esta
receta
se
basa
en
dos
semforos
y
una
variable
entera.
Semforo
mutex
=
1;
Semforo
colaCOND
=
0;
int
contadorCOND
=
0;
Cdigo
de
bloqueo
Este
cdigo
se
debe
escribir
en
cada
punto
donde
detectemos
que
debe
existir
un
bloqueo
condicional.
El
cdigo
debe
insertarse
justo
antes
del
cdigo
original
que
slo
puede
ejecutarse
cuando
se
cumpla
la
condicin
lgica
del
bloqueo.
P
(
mutex
);
//
esperar
hasta
que
se
cumpla
una
condicin
lgica
COND
while
(
COND
)
{
contadorCOND++;
//
registra
que
hay
alguien
en
espera
V
(mutex);
//
libera
el
mutex
para
no
provocar
interbloqueos
P
(colaCOND);
//
bloquea
al
proceso
P
(mutex);
//
vuelve
a
adquirir
el
mutex
para
reevaluar
COND
}
//
Colocar
aqu
el
cdigo
que
toque
variables
de
estado.
//
Este
cdigo
se
ejecuta
en
exclusin
mutua
(mutex
est
adquirido).
V
(
mutex
);
Justo despus de la operacin P(mutex) podra haber otras instrucciones, por ejemplo para
actualizar variables de estado. Esto depender de cada sistema que estemos desarrollando.
2
La
tcnica
en
accin
Ahora
que
se
ha
presentado
la
receta,
la
aplicaremos
a
un
ejemplo
simple
y
conocido:
el
primer
problema
de
los
lectores
y
escritores.
Recordemos
que
en
este
problema
hay
dos
tipos
de
procesos
que
acceden
a
una
base
de
datos:
lectores
y
escritores.
Se
debe
permitir
el
acceso
concurrente
de
los
lectores;
y
mientras
un
proceso
escritor
est
accediendo
a
la
base
de
datos,
no
puede
haber
ningn
otro
proceso
(ni
escritor
ni
lector).
En
el
llamado
primer
problema,
los
lectores
tienen
preferencia
sobre
los
escritores.
Vamos
a
aplicar
los
pasos
de
la
receta
a
este
problema
y
ver
cmo
evoluciona
el
programa
que
vamos
escribiendo.
El
segundo
punto
de
desbloqueo
es
interesante,
porque
puede
dar
lugar
a
dos
clases
de
desbloqueos
(a
los
lectores
o
al
escritor).
Hay
que
anotar
esos
dos
posibles
desbloqueos,
porque
cada
uno
generar
cdigo
diferente.
Marcaremos
los
puntos
de
desbloqueo
en
el
cdigo
de
esta
forma:
//
Variables
de
estado
int
nlectores
=
0;
int
nescritores
=
0;
//
Proceso
lector
Lector()
{
//
bloquearse
si
hay
algn
escritor
trabajando
bloquearse
si:
nescritores
>
0
nlectores++;
...
leer
de
la
base
de
datos
nlectores--;
si
nlectores
==
0
desbloquear
a
un
escritor
}
//
Proceso
escritor
Escritor()
{
//
bloquearse
si
hay
otro
proceso
trabajando
(lector
o
escritor)
bloquearse
si:
nlectores>0
or
nescritores>0
nescritores++;
...
escribir
en
la
base
de
datos
nescritores--;
si
hay
lectores
esperando
desbloquear
a
todos
los
lectores
si
no
hay
lectores
y
hay
escritores
esperando
desbloquear
a
un
escritor
}
No
hay
que
preocuparse
mucho
por
decinir
las
condiciones
que
preceden
a
los
desbloqueos.
Si
no
se
tiene
muy
claro
cules
pueden
ser
esas
condiciones,
se
puede
indicar
que
el
desbloqueo
ocurra
siempre.
En
ese
caso
el
algoritmo
seguir
siendo
correcto,
aunque
algo
menos
eciciente,
ya
que
se
harn
desbloqueos
de
ms.
En
caso
de
duda,
mejor
forzar
al
desbloqueo
siempre.
Siguiendo
las
reglas
generales,
para
nuestro
ejemplo
tenemos
que
crear
estos
objetos:
Un
mutex,
que
siempre
es
necesario.
Dos
colas
de
espera,
una
para
gestionar
el
bloqueo
de
los
lectores
( colaLectores)
y
otra
para
gestionar
el
bloqueo
de
los
escritores
( colaEscritores).
Dos
contadores
enteros,
uno
para
cada
cola.
Tambin
es
importante
colocar
el
cdigo
que
actualiza
las
variables
de
estado
dentro
de
la
proteccin
del
mutex.
En
nuestro
caso,
se
trata
de
la
manipulacin
de
las
variables
nlectores
y
nescritores.
Cdigo
de
inicializacin
//
Variables
de
estado
int
nlectores
=
0;
int
nescritores
=
0;
//
Control
de
la
exclusin
mutua
Semforo
mutex
=
1;
//
Cola
de
espera
de
los
lectores
Semforo
colaLectores
=
0;
int
contadorLectores
=
0;
//
Cola
de
espera
de
los
escritores
Semforo
colaEscritores
=
0;
int
contadorEscritores
=
0;
Proceso
lector
Lector()
{
//
bloquearse
si
hay
algn
escritor
trabajando
//
bloquearse
si:
nescritores
>
0
P
(
mutex
);
while
(
nescritores
>
0
)
{
contadorLectores++;
V
(
mutex
);
P
(
colaLectores
);
P
(
mutex
);
}
nlectores++;
V
(
mutex
);
...
leer
de
la
base
de
datos
...
//
actualizacin
de
variables
de
estado
y
desbloqueo
P
(
mutex
);
2007-2014
J.M.
Santos
Espino,
A.
Quesada,
E.
Rodrguez,
F.
Santana
nlectores--;
if
(
nlectores
==
0
)
{
if
(
contadorEscritores
>
0
)
{
contadorEscritores--;
V
(
colaEscritores
);
}
}
V
(
mutex
);
}
Proceso
escritor
Escritor()
{
//
bloquearse
si
hay
otro
proceso
trabajando
(lector
o
escritor)
//
bloquearse
si:
nlectores>0
or
nescritores>0
P
(
mutex
);
while
(
nlectores>0
or
nescritores
>
0
)
{
contadorEscritores++;
V
(
mutex
);
P
(
colaEscritores
);
P
(
mutex
);
}
nescritores++;
V
(
mutex
);
...
escribir
en
la
base
de
datos
...
//
actualizacin
de
variables
de
estado
y
desbloqueo
P
(
mutex
);
nescritores--;
if
(
contadorLectores
>
0
)
{
//
desbloqueamos
a
todos
los
lectores
while
(
contadorLectores
>
0
)
{
contadorLectores--;
V
(
colaLectores
);
}
}
else
{
//
desbloqueamos
a
un
escritor
if
(
contadorEscritores
>
0
)
{
contadorEscritores--;
V
(
colaEscritores
);
}
}
V
(
mutex
);
}
Cdigo
de
inicializacin
//
Variables
de
estado
int
nlectores
=
0;
int
nescritores
=
0;
10
Proceso
lector
Lector()
{
//
bloquearse
si
hay
algn
escritor
trabajando
P
(
mutex
);
while
(
nescritores
>
0
)
{
bloqueo();
}
nlectores++;
V
(
mutex
);
...
leer
de
la
base
de
datos
...
//
actualizacin
de
variables
de
estado
y
desbloqueo
general
P
(
mutex
);
nlectores--;
desbloqueoGeneral();
V
(
mutex
);
}
11
Proceso
escritor
Escritor()
{
//
bloquearse
si
hay
otro
proceso
trabajando
(lector
o
escritor)
P
(
mutex
);
while
(
nlectores>0
or
nescritores
>
0
)
{
bloqueo();
}
nescritores++;
V
(
mutex
);
...
escribir
en
la
base
de
datos
...
//
actualizacin
de
variables
de
estado
y
desbloqueo
general
P
(
mutex
);
nescritores--;
desbloqueoGeneral();
V
(
mutex
);
}
5
Conclusin
Hemos
presentado
una
tcnica
general
para
resolver
problemas
de
sincronizacin
a
travs
de
semforos.
La
tcnica
no
garantiza
una
solucin
ptima,
pero
s
da
la
seguridad
de
que
el
cdigo
es
correcto
y
que
el
procedimiento
de
resolucin
siempre
es
el
mismo,
sin
necesidad
de
requerir
ingenio,
creatividad
o
inspiracin.
La
estrategia
ms
simple
requiere
slo
tres
variables
globales:
un
mutex,
una
cola
y
un
contador
de
esperas.
Es
la
recomendable
cuando
lo
que
se
quiere
es
obtener
una
solucin
correcta
sin
que
preocupe
la
eciciencia.
Esta
tcnica
general
es
la
que
ha
dado
lugar
a
la
creacin
de
herramientas
de
programacin
concurrente
presentes
en
los
actuales
entornos
de
programacin.
La
tcnica
nos
puede
servir
para
aplicarla
en
cualquiera
de
esos
entornos
( pthreads,
Java,
etc.).
12