Semaforos (Concurrencia)

Semáforos Sistemas Operativos 1 Universidad de San Carlos de Guatemala Guatemala, Marzo de 2009 Conceptos (I) • Los

Views 205 Downloads 7 File size 413KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Semáforos

Sistemas Operativos 1 Universidad de San Carlos de Guatemala

Guatemala, Marzo de 2009

Conceptos (I) • Los semáforos son una solución, del tipo soporte al sistema operativo para garantizar la exclusión mutua • Un semáforo es una estructura diseñada para sincronizar dos o más threads o procesos, de modo que su ejecución se realice de forma ordenada y sin conflictos entre ellos.

Conceptos (II) • Un semáforo nos sirve para poder permitir o restringir a los procesos o hilos el acceso a algún recurso compartido • Un semáforo básico es una estructura formada por una posición de memoria y dos instrucciones, una para reservarlo y otra para liberarlo. A esto se le puede añadir una cola de threads para recordar el orden en que se hicieron las peticiones.

Operaciones Básicas • Los semáforos cuentan con operaciones básicas, una de ellas es para reservarlo y la otra para liberarlo, wait (espera) y signal (señal) respectivamente, equivalente down y up. • Existe una tercera operación que consiste en inicializar el semáforo. • Existen algunos semáforos que manejan una cola de espera.

Wait, Down ó Espera • Decrementa en una unidad el semáforo

• Bloquea hilo/proceso si el semáforo es menor que cero, sino entonces permite a hilo/proceso continuar • Llamada W(semaforo) o down(semaforo)

Signal, Up ó Señal • Incrementa semáforo en uno y si hay algún proceso/hebra esperando lo despierta • Existe un valor máximo para incrementar el semáforo, este no se va a infinito • Llamada S(semáforo) o up(semáforo)

Inicializador • Los semáforos pueden ser de 2 tipos: Binarios o Generales (Contadores). • La operación de inicializador definirá si el semáforo será binario o no, es decir, si se inicializa con 1, el semáforo será binario ya que solo podrá manejar un recurso compartido, en caso de tener “N” recursos compartidos se inicializara con “N”. • Si tenemos “N” procesos inicializamos un semáforo para que solo “N” procesos acceda a un recurso compartido.

Semáforos con manejo de cola • Existen semáforos que tienen la operación de manejar una cola del tipo FIFO (PEPS) para llevar el control de los procesos que están solicitando los recursos, así cuando se liberen los recursos estos puedan asignarle dicho recurso al primer proceso que lo solicito.

Desventajas • No se puede imponer el uso correcto de los “Down” y “Up”

• No existe una asociación entre el semáforo y el recurso • Entre “Down” y “Up” el usuario puede realizar cualquier operación con el recurso.

Algoritmo semáforo //Para bloquear Down (semaforo){ if semaforo > 0 then semaforo=semaforo -1 else bloquear_el_proceso(); }

//constructor Init (semaforo, num) semaforo = num; end

//Para liberar Up (semaforo){ if hay_proceso_bloqueado then despertar_el_proceso() else semáforo = semáforo + 1 }

Implementación de Semáforo en Java public class Semaforo { private int valor; /** Creates a new instance of Semaforo */ public Semaforo(int v) { valor = v; }

public synchronized void up(){ valor++; notify(); } }

public synchronized void down(){ while(valor