PAG.
1.
Introduccin..
SEMAFOROS
2.
3.
4.
5.
6.
10
7.
Simulacin de semforos...
12
7.1 Generales..
12
7.2 Binarios..
12
8.
Implementacin de semforos..
13
9.
Conclusiones
28
10.
Referencias bibliogrficas..
29
1. INTRODUCCION
de
la
actualizacin
mltiple
ocurre
cuando
dos
procesos
intentan
modificar
simultneamente el valor de una variable global lo que puede dar lugar a obtener resultados
incorrectos sobre la variable.
El objetivo de este trabajo es dar a conocer herramientas esenciales en la sincronizacin de tareas o
procesos, dichas herramientas basadas en variables y mtodos que controlan el grado de
concurrencia y fluidez de un programa. El trabajo esta dividido en dos partes de las cuales la primera
hace nfasis en los llamados Semforos los cuales son variables que estn formadas por un valor
numrico y una coleccin de procesos en espera y ayudan a que no se produzcan errores dentro del
programa donde es implementado.
La segunda parte de este trabajo monogrfico contara y estar asociada directamente con temas
relacionados con los Monitores, y en ella describimos las caractersticas bsicas asociadas a los
monitores como son las variables condicin, las operaciones de suspensin y reactivacin, y las
distintas disciplinas que pueden implementarse al realizar esta ultima operacin.
Con este trabajo se busca el entendimiento de mtodos y soluciones que nos atraen menos
dificultades para enfrentarnos a la complejidad del manejo del paralelismo y la concurrencia, del
mismo modo entender conceptos ligados directamente a estos temas.
SEMFOROS
Un semforo tiene asociada una lista de procesos, en la que se incluyen los procesos suspendidos
a la espera de su cambio de estado.
En funcin del rango de valores que puede tomar, los semforos se clasifican en:
Semforos binarios: Pueden tomar solo los valores 0 y 1.
var mutex: BinSemaphore;
Un semforo puede tomar valores enteros no negativos (esto es, el valor 0 o un valor entero
positivo). La semntica de estos valores es: 0 semforo cerrado, y >0 semforo abierto.
Frecuentemente, el que un semforo sea binario o general, no es funcin de su estructura interna
sino de cmo el programador lo maneja. [CTRR10]
UN SEMFORO:
var p: semaphore;
Wait (p): Si el semforo no es nulo (abierto) decrementa en uno el valor del semforo. Si el valor
del semforo es nulo (cerrado), el thread que lo ejecuta se suspende y se encola en la lista de
procesos en espera del semforo.
Pseudocdigo de la operacin: wait(p);
if p>0
then p:= p-1;
else Suspende el proceso y lo encola en la lista del semforo.
La operacin wait (como la semntica de su nombre indica) es una potencial causa de retraso en
la ejecucin de un proceso. Sin embargo, es importante resaltar que no siempre que se ejecute
una sentencia wait se produce el retraso, sino solo cuando al ejecutarla, el semforo este
cerrado, esto es tiene el valor 0.
Signal (p): Si hay algn proceso en la lista de procesos del semforo, activa uno de ellos para
que ejecute la sentencia que sigue al wait que lo suspendi. Si no hay procesos en espera en la
lista incrementa en 1 el valor del semforo.
Pseudocdigo de la operacin: signal (p);
if Hay algn proceso en la lista del semforo
then Activa uno de ellos
else p:= p+1;
La ejecucin de la operacin signal (p) nunca provoca una suspensin del thread que lo ejecuta. Si
hay varios procesos en la lista del semforo, la operacin signal solo activa uno de ellos. Este se
elige de acuerdo con un criterio propio de la implementacin (FIFO, LIFO, Prioridad, etc.).
Lo importante del semforo es que se garantiza que la operacin de chequeo del valor del semforo,
y posterior actualizacin segn proceda, es siempre segura respecto a otros accesos concurrentes.
[FOAR06]
UN SEMFORO:
var p: semaphore;
Admite una operacin no segura:
initial(p, Valor_inicial): Asigna al semforo p el valor inicial que se pasa como argumento. Esta
operacin es no segura y por tanto debe ser ejecutada en una fase del programa en la que se
tenga asegurada que se ejecuta sin posibilidad de concurrencia con otra operacin sobre el
mismo semforo. [CTRR10]
4. CONDICIN DE SINCRONIZACIN Y EXCLUSIN MUTUA CON SEMFOROS
Condicin de Sincronizacin
var datoDisponible:
process Productor;
var dato: Tipo_Dato;
begin
repeat repeat
produceDato(var dato);
dejaDato(dato);
signal(datoDisponible);
forever;
end:
process Consumidor;
var dato: Tipo_Dato;
begin
repeat
wait(datoDisponible);
tomaDato(var dato);
consume(dato);
forever;
end;
Este representa una implementacin del problema de productor consumidor con buffer ilimitado.
La condicin de buffer ilimitado solo no introduce lmite a la operacin del productor. La nica
restriccin es la del consumidor (este no puede tomar el dato si este no se ha producido). Esta
restriccin se formula en funcin de la condicin de sincronizacin:
e ! (produccini consumisini)
El problema que se plantea es que el consumidor debe esperar sin leer el buffer hasta tanto que el
dato que corresponda haya sido previamente colocado. Obviamente, el consumidor es el que tiene
que esperar en este caso, luego debe contener una sentencia wait.
Esta versin resuelve el problema productor consumidor entre dos procesos. Sin embargo no prev
la posibilidad de que en el caso de que existan varios productores y varios consumidores, estos no
pueden dejar simultneamente el dato en el buffer o no puedan tomar simultneamente el dato del
buffer. Un problema se va a producir si las actividades Dejar_dato y Tomar_dato no son atmicas.
Condicin de exclusin mutua
program Exclusion_Mutua;
var mutex: binsemaphore;
process type Proceso;
begin
repeat
wait(mutex);
(* Cdigo de la seccin crtica *)
signal(mutex);
forever;
end;
var p, q, r: Proceso;
begin
initial(mutex,1);
cobegin p; q; r; coend;
end;
Se plantea una solucin del problema de exclusin mutua entre tres procesos P, Q y R, respecto de
una seccin crtica dada. Se va a utilizar un semforo Seccion_Libre" para controlar el acceso a la
misma.
El valor del semforo indica el nmero de procesos que se encuentran ejecutando la seccin crtica.
Cuando toma el valor 0, significa que algn proceso est en su seccin crtica, mientras que cuando
toma el valor 1 significa que no hay ningn proceso ejecutndola. La estructura del programa
garantiza que el semforo es binario, y nunca tomar un valor superior a 1.
De acuerdo con la semntica expuesta, el semforo debe ser inicializado al valor 1, ya que al
comenzar, ningn proceso se encuentra en la zona crtica.
Cuando uno de los procesos va a iniciar su seccin crtica, ejecuta una sentencia wait. Si no hay otro
proceso ejecutando la seccin crtica, el proceso accede directamente a Ejecutarla sin necesidad de
ninguna espera. En caso contrario, se incorpora a la lista asociada al semforo en espera de que le
toque su turno de ejecucin de la seccin crtica.
Cuando uno de los procesos concluye la ejecucin de su seccin crtica, ejecuta una sentencia
signal y continua la ejecucin de las sentencias posteriores a esta, sin esperar mayor confirmacin.
Con la ejecucin de la sentencia signal el semforo analiza la lista de procesos en espera, y si hay al
menos uno en ella, le activa y le permite concluir la sentencia wait que lo introdujo en la lista.
[CTRR10]
CRITICA DE LOS SEMAFOROS
Ventajas de los semforos:
Son de muy bajo nivel y un simple olvido o cambio de orden conducen a bloqueos.
Requieren que la gestin de un semforo se distribuya por todo el cdigo. La depuracin de
los errores en su gestin es muy difcil.
Los semforos son los componentes bsicos que ofrecen todas las plataformas hardware y software
como base para construir los mecanismos de sincronizacin. Las restantes primitivas se basan en su
uso implcito. [FOAR06]
Semforos binarios
Semforos generales
Existe el algoritmo de lector/escritor sin prioridad y con prioridad al lector y otro con prioridad al
escritor.
[DOPE09]
Lector(){
Hace_Cosas()
Down(EM)
NL = NL +1
if(NL = 1) then
Down(DB)
Up(EM)
Leer()
Down(EM)
NL = NL -1
if(NL = 0) then
Up(DB)
Up(EM)
Problema Productor-Consumidor
Algoritmo Productor-Consumidor
//IS: Inicializa Semforo
Productor(){
IS(lleno, 0)
IS(vacio, 7)
IS(EM, 1)
repeat
hace_cosas()
x = produce()
Down(vacio)
Down(EM)
Push(x)
Up(EM)
Up(lleno)
Hace_mas_cosas()
untilFIN
}
Consumidor(){
repeat
Hace_algo()
Down(lleno)
Down(EM)
y = Pop()
Up(EM)
Up(vacio)
consume();
UntilFin
}
[DOPE09]
7. SIMULACION DE SEMAFOROS
7.1.
Generales
Un semforo general es una variable que toma valores 0, 1, 2, y que slo puede ser
accedida por dos procedimientos predeterminados con los siguientes efectos:
P(s)
1. si s=0 entonces se suspende la ejecucin hasta que se ejecute una operacin signal
2. si s>0 entonces s := s-1
V(s)
1. si alguna llamada wait est suspendida, se selecciona una llamada suspendida para
su reanudacin
2. si no hay llamadas suspendidas entonces s:= s+1
7.2.
Binarios
Inhibir las interrupciones que en el sistema operativo atiende los eventos de reloj y que
inducen los cambios de contexto por tiempo.
Utilizar instrucciones especiales de las que estn dotadas el hardware de la CPU, tales
como TAS (Test and set), que permiten en una operacin indescomponible, que verificar el
estado y establecer el nuevo valor de acuerdo con l.
Sincronizacin de procesos
-Para realizar una tarea, un proceso debe esperar hasta que otro anterior -haya
completado su actividad.
[CTRR10]
Implementacin de Semforo en Java
publicclassSemaforo{
privateintvalor;
/** Create a new instance of Semaforo*/
publicSemaforo(intv) {
valor = v;
}
publicsynchronizedvoidup(){
valor++;
notify();
}
}
publicsynchronizedvoidup
({
valor++;
notify();
}
}
publicsynchronizedvoiddown(){
while(valor <= 0){
try{
wait();
}catch(InterruptedExceptione){
;
}
}
valor--;
}
package Semaphore_Package is
type Semaphore is private;
type Binary_Semaphore is private;
function Init(N: Integer) return Semaphore;
procedure Wait (S: Semaphore);
procedure Signal(S: Semaphore);
function Init(N: Integer) return Binary_Semaphore;
procedure Wait (S: Binary_Semaphore);
procedure Signal(S: Binary_Semaphore);
Bad_Semaphore_Initialization: exception;
end Semaphore_Package;
[DOPE09]
9. CONCLUSIONES
Al finalizar esta monografa sobre semforos y monitores, se pueden textualizar las
siguientes conclusiones:
Los semforos generales son tiles cuando un recurso ser asignado, tomndolo de un
conjunto de recursos idnticos.
Los semforos binarios estn llamados a ser implementados por dos o ms procesos para
garantizar que slo uno pueda entrar en seccin crtica.
Si se utilizan mltiples CPU, cada semforo debe protegerse con una variable de cierre,
utilizando la instruccin TSL para asegurar que slo una CPU a la vez examine el
semforo.
La atomicidad es una caracterstica principal de los semforos y garantiza que al iniciar
una operacin con un semforo, ningn otro proceso puede tener acceso al semforo
hasta que la operacin termine o se bloquee.
Solo un proceso puede estar activo en un monitor en cada momento.
Al hacer automtica la exclusin mutua de regiones crticas, los monitores provocan que la
programacin paralela sea mucho menos propensa a error que con los semforos.
Los monitores son un concepto de un lenguaje de programacin. El compilador debe
reconocerlos y debe arreglrselas de alguna manera para lograr la exclusin mutua. La
mayora de los lenguajes no tienen monitores.
[FOAR06]
[WIKP10]
[CTRR10]
[DOPE09]
MONITORES
[MART90]
[WIKI10]
[MONC10]
[GALL09]
[UTFS10]
[UDEC10]
[ICTD10]
[CTRT10]
[EPSA10]