Vous êtes sur la page 1sur 10

Semforos

Editar

Semforo
Es una variable numrica entera de tipo protegida (slo la maneja el sistema operativo), que se
manipula a travs de operaciones atmicas bien definidas.
Los semforos se emplean para permitir el acceso a diferentes partes de programas
(llamados secciones crticas) donde se manipulan variables o recursos que deben ser
accedidos de forma especial. Segn el valor con que son inicializados se permiten a ms o
menos procesos utilizar el recurso de forma simultnea.
Caracteristicas

Slo pueden tomar valores numricos.

Reside en el Kernell del sistema operativo.

Son funciones atmicas no interrumpidas.

Son funciones ya diseadas.

Un semforo positivo representa un nmero de recursos disponibles.

Un semforo negativo representa a los procesos en espera.

Debe ser binario (0,1) e inicializarse en 1.


Tipos

Binarios: Toma solamente los valores 0 1.

Contadores: su contenido puede ser mayor de 1.


Operaciones Bsicas

WAIT
Pregunta a los procesos si su contador es > = que cero, en caso de no ser as, los
decrementa. El proceso que cambia en este caso a negativo (1) desde la cola de procesos
Listos a ser ejecutados es el que automticamente toma el control del procesador.
WAIT = DOWN = P(S): while S < = 0 do;
S:=S-1

SIGNAL
A partir de un tiempo t definido por el despachador se ejecuta, y pregunta a los procesos si su
contador es < que cero en caso de que sea afirmativa la respuesta, saca a este proceso de su
ejecucin y depende de su estado.
SIGNAL = UP = V(S): S:=S+1
Uso del semforo para el manejo de secciones criticas
Procedure proceso_dos;
begin
while Ejecucion do

begin
Actividades_preliminares_dos;
P(Activo);
Seccion_critica_dos;
V(Activo);
otras_actividades_dos;
end
end;
BEGIN
IniciaSemaforo(Activo,1);
COBEGIN
Proceso_uno;
Proceso_dos;
COEND
END.
Problema del Barbero Dormiln

En una barbera se atienden n-clientes y se tienen los siguientes recursos: espejo,


tijeras y clientes. Cada cliente puede ser atendido por cualquiera de los barberos que existen,
siempre y cuando est sentado; o est en la cola cuya capacidad es siete (7)

Si la silla est vaca; el barbero duerme

Si la silla est llena, el barbero trabaja


Solucin
Program Barbero_Dormilon;
var barbero,cliente,critica:semaforo
Esperando:Integer
Ejecucion:Boolean;
Procedure Barbero;
begin
while ejecucion do
begin
P(clientes);
P(critica);
Esperando=Esperando-1;
V(Barberos);
V(critica);
Cortar_el_pelo;
end
end;
procedure cliente;
begin
P(critica);
If esperando<Cantidad _ Sillas;
then begin
Esperando:=Esperando+1;
V(clientes);
V(critica);
P(barbero);
Obtener_corte_de_pelo;
end
else V(critica);
end;
BEGIN (*principal*)
IniciaSemaforo (clientes,0);

IniciaSemaforo (barbero,0);
IniciaSemaforo (critica,1);
COBEGIN
Barbero;
Clientes;
COEND
END.

Semforo (informtica)
Un semforo es una variable especial (o tipo abstracto de datos) que constituye el mtodo clsico
para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de
almacenamiento del sistema o variables del cdigo fuente) en un entorno de multiprocesamiento (en
el que se ejecutarn varios procesos concurrentemente). Fueron inventados por Edsger Dijkstra en
1965 y se usaron por primera vez en el sistema operativo THEOS.
ndice
[ocultar]

1 Operaciones

2 Usos

3 Ejemplo de uso

4 Vase tambin

5 Enlaces externos

Operaciones[editar editar cdigo]


Los semforos slo pueden ser manipulados usando las siguientes operaciones (ste es el cdigo
con espera activa):

Inicia(Semforo s, Entero v)
{
s = v;
}
En el que se iniciar la variable semforo s a un valor entero v.

P(Semforo s)
{
if(s>0)
s = s-1;
else
wait();
}
La cual mantendr en espera activa al regido por el semforo si ste tiene un valor inferior o igual al
nulo.

V(Semforo s)
{
if(!procesos_bloqueados)
s = s+1;
else
signal();
}
Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operacin P
duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la
operacin V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje ms
entendible, la operacin P suele denominarse "wait" o "espera" y la operacin V "signal" o "seal".
El porqu de los nombres de estas funciones, V y P, tiene su origen en el idioma holands.
"Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra us la palabra
inventada prolaag [1], que es una combinacin de probeer te verlagen (intentar decrementar). El
valor del semforo es el nmero de unidades del recurso que estn disponibles (si slo hay un
recurso, se utiliza un "semforo binario" cuyo valor inicial es 1).
La verificacin y modificacin del valor, as como la posibilidad de irse a dormir (bloquerse) se
realiza en conjunto, como una sola e indivisible accin atmica. El sistema operativogarantiza que al
iniciar una operacin con un semforo, ningn otro proceso puede tener acceso al semforo hasta
que la operacin termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los
problemas de sincronizacin y evitar condiciones de competencia.
Si hay n recursos, se inicializar el semforo al nmero n. As, cada proceso, al ir solicitando un
recurso, verificar que el valor del semforo sea mayor de 0; si es as es que existen
recursos libres, seguidamente acaparar el recurso y decrementar el valor del semforo.
Cuando el semforo alcance el valor 0, significar que todos los recursos estn siendo utilizados, y
los procesos que quieran solicitar un recurso debern esperar a que el semforo sea positivo, esto
es: alguno de los procesos que estn usando los recursos habr terminado con l e incrementar el
semforo con un signal o V(s).

Inicia se utiliza para inicializar el semforo antes de que se hagan peticiones sobre l, y toma por
argumento a un entero. La operacin P cuando no hay un recurso disponible, detiene la ejecucin
quedando en espera activa (o durmiendo) hasta que el valor del semforo sea positivo, en cuyo
caso lo reclama inmediatamente decrementndolo. V es la operacin inversa: hace disponible un
recurso despus de que el proceso ha terminado de usarlo. Las operaciones P y V han de ser
indivisibles (o atmicas), lo que quiere decir que cada una de las operaciones no debe ser
interrumpida en medio de su ejecucin.

La operacin V es denominada a veces subir el semforo (up) y la operacin P se conoce tambin


como bajar el semforo (down), y tambin son llamadas signal y wait o soltar ytomar.
Para evitar la espera activa, un semforo puede tener asociada una cola de procesos (normalmente
una cola FIFO). Si un proceso efecta una operacin P en un semforo que tiene valor cero, el
proceso es detenido y aadido a la cola del semforo. Cuando otro proceso incrementa el semforo
mediante la operacin V y hay procesos en la cola asociada, se extrae uno de ellos (el primero que
entr en una cola FIFO) y se reanuda su ejecucin.

Usos[editar editar cdigo]


Los semforos se emplean para permitir el acceso a diferentes partes de programas
(llamados secciones crticas) donde se manipulan variables o recursos que deben ser accedidos
de forma especial. Segn el valor con que son inicializados se permiten a ms o menos procesos
utilizar el recurso de forma simultnea.
Un tipo simple de semforo es el binario, que puede tomar solamente los valores 0 y 1. Se
inicializan en 1 y son usados cuando slo un proceso puede acceder a un recurso a la vez. Son
esencialmente lo mismo que los mutex. Cuando el recurso est disponible, un proceso accede y
decrementa el valor del semforo con la operacin P. El valor queda entonces en 0, lo que hace que
si otro proceso intenta decrementarlo tenga que esperar. Cuando el proceso que decrement el
semforo realiza una operacin V, algn proceso que estaba esperando comienza a utilizar el
recurso.
Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse un
semforo inicializado en 0. El proceso que debe ejecutar primero en la secuencia realiza la
operacin V sobre el semforo antes del cdigo que debe ser ejecutado despus del otro proceso.
ste ejecuta la operacin P. Si el segundo proceso en la secuencia es programado para ejecutar
antes que el otro, al hacer P dormir hasta que el primer proceso de la secuencia pase por su
operacin V. Este modo de uso se denomina sealacin (signaling), y se usa para que un proceso o
hilo de ejecucin le haga saber a otro que algo ha sucedido.

Ejemplo de uso[editar editar cdigo]


Los semforos pueden ser usados para diferentes propsitos, entre ellos:

Implementar cierres de exclusin mutua o locks

Barreras

Permitir a un mximo de N threads (hilos) acceder a un recurso, inicializando el semforo


en N

Notificacin. Inicializando el semforo en 0 puede usarse para comunicacin entre threads


sobre la disponibilidad de un recurso

En el siguiente ejemplo se crean y ejecutan n procesos que intentarn entrar en su seccin crtica
cada vez que puedan, y lo lograrn siempre de a uno por vez, gracias al uso del semforo s
inicializado en 1. El mismo tiene la misma funcin que un lock.

const int n

/* nmero de procesos */

variable semaforo s; /* declaracin de la variable semforo de


valor entero*/
Inicia (s,1)

/* Inicializa un semforo de nombre s con valor 1 */

void P (int i)
{
while (cierto)
{
P(s)

/* En semforos binarios, lo correcto es poner un

P(s) antes de entrar en


la seccin crtica, para restringir el uso de
esta regin del cdigo*/
/* SECCIN CRTICA */

V(s)

/* Tras la seccin crtica, volvemos a poner el

semforo a 1 para que otro


proceso pueda usarla */
/* RESTO DEL CDIGO */
}
}
int main()
{
Comenzar-procesos(P(1), P(2),...,P(n));
}

Problema de la cena de los filsofos


(Redirigido desde El problema de los filsofos)

Ilustracin del problema de los filsofos cenando.

El problema de los filsofos cenando es un problema clsico de las ciencias de la


computacin propuesto por Edsger Dijkstra en 1965para representar el problema de la
sincronizacin de procesos en un sistema operativo. Cabe aclarar que la interpretacin est basada
en pensadores chinos, quienes coman con dos palillos, donde es ms lgico que se necesite el del
comensal que se siente al lado para poder comer.

ndice
[ocultar]

1 Enunciado del problema

2 Algunas posibles soluciones

3 Vase tambin

4 Enlaces externos

Enunciado del problema[editar editar cdigo]


Cinco filsofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada
filsofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son
necesarios dos tenedores y cada filsofo slo puede tomar los que estn a su izquierda y derecha.
Si cualquier filsofo toma un tenedor y el otro est ocupado, se quedar esperando, con el tenedor
en la mano, hasta que pueda tomar el otro tenedor, para luego empezar a comer.
Si dos filsofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condicin de
carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.

Si todos los filsofos toman el tenedor que est a su derecha al mismo tiempo, entonces todos se
quedarn esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
har porque todos se encuentran en la misma situacin (esperando que alguno deje sus tenedores).
Entonces los filsofos se morirn de hambre. Este bloqueo mutuo se denomina interbloqueo
o deadlock.
El problema consiste en encontrar un algoritmo que permita que los filsofos nunca se mueran de
hambre.

Algunas posibles soluciones[editar editar cdigo]

Por turno cclico

Se empieza por un filsofo, que si quiere puede comer y despus pasa su turno al de la derecha.
Cada filsofo slo puede comer en su turno. Problema: si el nmero de filsofos es muy alto, uno
puede morir de hambre antes de su turno.

Varios turnos

Se establecen varios turnos. Para hacerlo ms claro supongamos que cada filsofo que puede
comer (es su turno) tiene una ficha que despus pasa a la derecha. Si por ejemplo hay 7
comensales podemos poner 3 fichas en posiciones alternas ( entre dos de las fichas quedaran dos
filsofos).
Se establecen turnos de tiempo fijo. Por ejemplo cada 5 minutos se pasan las fichas (y los turnos) a
la derecha.
En base al tiempo que suelen tardar los filsofos en comer y en volver a tener hambre, el tiempo de
turno establecido puede hacer que sea peor solucin que la anterior. Si el tiempo de turno se
aproxima al tiempo medio que tarda un filsofo en comer esta variante da muy buenos resultados. Si
adems el tiempo medio de comer es similar al tiempo medio en volver a tener hambre la solucin
se aproxima al ptimo.

Colas de tenedores

Cuando un filsofo quiere comer se pone en la cola de los dos tenedores que necesita. Cuando un
tenedor est libre lo toma. Cuando toma los dos tenedores, come y deja libre los tenedores.
Visto desde el otro lado, cada tenedor slo puede tener dos filsofos en cola, siempre los mismos.
Esto crea el problema comentado de que si todos quieren comer a la vez y todos empiezan tomando
el tenedor de su derecha se bloquea el sistema (deadlock).

Resolucin de conflictos en colas de tenedores

Cada vez que un filsofo tiene un tenedor espera un tiempo aleatorio para conseguir el segundo
tenedor. Si en ese tiempo no queda libre el segundo tenedor, suelta el que tiene y vuelve a
ponerse en cola para sus dos tenedores.
Si un filsofo A suelta un tenedor (porque ha comido o porque ha esperado demasiado tiempo con el
tenedor en la mano) pero todava desea comer, vuelve a ponerse en cola para ese tenedor. Si el
filsofo adyacente B est ya en esa cola de tenedor (tiene hambre) lo toma y si no vuelve a cogerlo
A.
Es importante que el tiempo de espera sea aleatorio o se mantendr el bloqueo del sistema.

El portero del comedor

Se indica a los filsofos que abandonen la mesa cuando no tengan hambre y que no regresen a ella
hasta que vuelvan a estar hambrientos (cada filsofo siempre se sienta en la misma silla). La misin
del portero es controlar el nmero de filsofos en la sala, limitando su nmero a n-1, pues si hay n-1
comensales seguro que al menos uno puede comer con los dos tenedores.

Vous aimerez peut-être aussi