SEMÁFOROS

SEMÁFOROS

Funcionamiento de los semáforos

Dos o más procesos pueden cooperar por medio de simples señales, de forma que se pueda obligar a detenerse a un proceso en una posición determinada hasta que reciba una señal específica. Cualquier requisito complicado de coordinación puede satisfacerse por medio de la estructura de señales adecuada. Para la señalización, se usan variables especiales llamadas semáforos. Para transmitir una señal por el semáforo, los procesos ejecutan la primitiva signal(s). Para recibir una señal del semáforo, los procesos ejecutan la primitiva wait(s); si la señal correspondiente aún no se ha transmitido, el proceso es suspendido hasta que tenga lugar la transmisión. Para lograr el efecto deseado, se pueden contemplar los semáforos como variables que tienen un valor entero sobre el que se definen las tres operaciones siguientes:

  1. Un semáforo debe inicializarse con un valor no negativo.
  2. La operación wait decrementa el valor del semáforo. Si el valor del semáforo se hace negativo, el proceso que ejecuta el wait se bloquea.
  3. La operación signal incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea a un proceso bloqueado por una posición wait.

Las primitivas wait y signal se suponen atómicas, es decir, no pueden ser interrumpidas y cada rutina puede considerarse como un paso indivisible. Una versión más limitada es el semáforo binario, que sólo puede tomar los valores 0 y 1. En principio los semáforos binarios son más sencillos de implementar y tienen la misma potencia de expresión que los semáforos generales. Tanto en los semáforos como en los semáforos binarios se emplea una cola para mantener los procesos esperando en el semáforo. La política más equitativa mediante la cual se quitan los procesos de dicha cola es la FIFO. La única exigencia estricta es que un proceso no debe quedar retenido en la cola de un semáforo indefinidamente porque otros procesos tengan preferencia.

Generalmente operadores como WAIT y SIGNAL operan en los semáforos de la siguiente manera. Cuando un proceso ejecuta un operador WAIT que tiene un valor de semáforo en 0, ese proceso se bloquea; si el valor es mayor que cero, el valor del semáforo es disminuido en 1 y el proceso continua. Cuando un proceso ejecuta un operador SIGNAL y hay procesos bloqueados (WAITING), uno de estos procesos es activado (puesto en la cola de listos). Si no hay procesos esperando el valor del semáforo se incrementa en 1. Se asume que procesos bloqueados por semáforos pierden el procesador y entran en una cola de espera (WAITING QUEUE) en vez de producir BUSY WAITING. También se asume que la cola de espera es FIFO.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: