Descarga la aplicación para disfrutar aún más
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;
Compartir