Logo Studenta

apoyo teorico tp3 - semaforos

¡Estudia con miles de materiales!

Vista previa del material en texto

PCC
SEMAFOROS
SEMAFOROS
Principio fundamental de su funcionamiento
Dos o mas procesos pueden cooperar por medio de “mardarse” señales, de forma q se pueda obligar a detener a un proceso en una posición determinada hasta q reciba una señal especifica. 
Para la señalización se usan variables especiales llamadas semáforos. 
Para transmitir una señal por el semáforo S, los procesos ejecutan la SIGNAL(S).
Para recibir una señal del semáforo S, los procesos ejecutan una operación WAIT(S).
Si la señal correspondiente aun no se ha transmitido, el proceso es suspendido hasta que tenga lugar la transmisión.
Definición de un semáforo
Las soluciones a la exclusión mutua anteriormente vistas tienen ciertas desventajas ya que los procesos esperan de una forma activa. 
Un proceso q no esta “haciendo nada” ocupa un procesador lo cual limita la eficiencia del sistema. 
Analizaremos la primitiva de comunicación entre procesos denominada semáforos, que bloquea al proceso en lugar de desperdiciar tiempo de CPU, cuando no se le permite entrar en su sección critica o realizar una acción determinada.
Un semáforo puede definirse como una variable de tipo SEMAPHORE, y como cualquier tipo puede ser utilizado en la definición de array’s y registros.
SEMAFOROS
Var 
	Sem: semaphore;
	Sem_array:array[1..10] of semaphore;
Type 
	Sem_record=record of
		S:semaphore;
		I:integer;
	End;
SEMAFOROS
En líneas generales podemos considerar a los semáforos como un tipo de datos abstracto que solo admite como posibles valores enteros. 
Las distintas operaciones q se puede realizar sobre los semáforos son las siguientes:
Wait(s): decrementa el valor de s si éste es mayor que 0. Si s es igual a 0 el proceso se bloqueara en el semáforo.
Signal(s): desbloqueara algún proceso bloqueado en s, y en el caso de q no haya ningún proceso incrementa el valor de s.
Initial(s,v): se utiliza para inicializar el semáforo s al valor v donde v es mayor q 0. Esta operación es exclusiva de pascal fc y solo se puede utilizar en el programa principal.
SEMAFOROS
Las operaciones wait y signal se pueden expresar así
Wait(s);
If s>0 then
	s:=s-1
else bloquear proceso;
 
signal(s);
if (hay proceso bloqueado)then
 desbloquear un proceso
else s:=s+1;
SEMAFOROS
Una de las características principales de los semáforos es que todas las operaciones asociadas al wait y al signal deben ejecutarse de forma indivisible.
La utilización de un semáforo implica la exclusión mutua en la ejecución de las operaciones en él definidas.
Hay q tener en cuenta q habrá situaciones en las q se ejecute una operación signal sobre un semáforo y que en dicho semáforo exista mas de un proceso bloqueado
Ante esta situación existe la posibilidad de usar cualquier política para gestionar la cola de procesos bloqueados (LIFO, FIFO o AL AZAR)
Pero la única q es realmente valida es la FIFO, ya que si la implementamos como una cola LIFO existe mucha probabilidad de que los primeros procesos nunca se ejecuten.
Con menos probabilidad una implementación con desbloqueos al azar también implica la posibilidad de inanición. Por ello la lista de procesos desbloqueados tiene que tener estructura FIFO.
SEMAFOROS 
 Implementación de un semáforo (estructura interna)
Type semaphore=record of
	Valor: integer;
	L:lista de procesos;
End;
Procedure initial(var s:semaphore; s0:integer);
Begin
	s.valor:=s0;
	inicializar(s.L);
end;
procedure wait(var s:semaphore);
begin
	if s.valor>0 then s.valor:=s.valor-1;
	else 
 begin
		insertar proceso en s.L;
		bloquearlo;
	end;
end;
procedure signal(var s:semaphore);
begin
if not vacia(L) then
begin
		eliminar un proceso de s.L;
		desbloquearlo;
end;
	else s.valor:=s.valor+1;
end;

Continuar navegando