Volver al temario
Tema 04 · 70 páginas

Comunicación y sincronización

Tema completo Modo estudio
TEXTO ORIGINAL · Páginas 1517 Ver PDF

2.2.1. Definición de semáforo

Texto íntegro de la conversión. Las figuras y la disposición de las notas se pueden consultar en el PDF.

2.2.1. Definición de semáforo

Un semáforo es una variable (asumimos que es de tipo semaphore) que tiene asociado un contador. El semáforo se manipula utilizando las tres operaciones siguientes:

  • sem_init(semaphore s, unsigned int valor): inicializa el contador del semáforo asignando el valor indicado. El valor inicial del contador debe ser mayor o igual que cero.
  • Sem_wait(semaphore s): de manera atómica, espera a que el contador sea mayor que cero; cuando lo sea, decrementará el valor del contador (figura 11).
  • Sem_signal(semaphore s): de manera atómica, incrementa el valor del contador asociado al semáforo (figura 12).

sem_wait (semaphore s) { while (s <= 0) /* atómicamente */ espera();

s = s - 1; }

Figura 11. Pseudo-código de sem_wait

Página 16

sem_signal (sempahore s) { s = s + 1; /* atómicamente */

}

Figura 12. Pseudo-código de sem_signal

Observaciones:

  • Existen dos tipos de semáforos en función del rango de valores que pueda alcanzar el contador asociado al semáforo: binarios (el contador sólo puede valer 0 o 1) y n-arios (el contador puede tomar cualquier valor mayor o igual que cero). Los semáforos binarios son los que implementan de modo más natural el acceso en exclusión mutua a una región crítica.

  • Cabe destacar que las operaciones realizan sus acciones de manera atómica. Supongamos que el contador asociado a un semáforo vale 0 y dos procesos están esperando haciendo un sem_wait a que el contador tome un valor mayor que cero. Si ahora algún proceso ejecuta un sem_signal sobre este semáforo e incrementa el contador del semáforo, únicamente uno de los procesos que ejecuta el sem_wait verá que el contador vale 1 y lo decrementará; el otro proceso deberá continuar esperando hasta que se realice otro sem_signal.

  • Si varios procesos están esperando haciendo un sem_wait a que el contador del semáforo tome un valor mayor que cero y algún proceso ejecuta un sem_signal sobre este semáforo, se plantea un problema de elección. ¿Cuál de los procesos en espera ha de ver este incremento del semáforo? Inicialmente, consideraremos que esta elección será aleatoria, pero más adelante volveremos sobre este tema.

  • Las operaciones básicas no devuelven cuál es el valor actual del contador asociado al semáforo. Algunas implementaciones de semáforos ofrecen una operación para obtener este valor pero en este documento no las consideraremos.

  • Los nombres de las operaciones sem_wait y sem_signal no son estándar. En la literatura o en implementaciones concretas podéis encontrar que la operación sem_wait se denomina P, down, signal, acquire o pend; la operación sem_signal se puede denominar V, up, wait, release o post. Es importante no confundir las llamadas al sistema UNIX wait y signal con las operaciones sobre semáforos wait y signal.

Página 17

Ver fragmento extraído sin normalizar
2.2.1.  Definición de semáforo


Un semáforo es una variable (asumimos que es de tipo semaphore) que tiene
asociado un contador. El semáforo se manipula utilizando las tres operaciones
siguientes:


•  sem_init(semaphore s, unsigned int valor): inicializa el contador
     del semáforo asignando el valor indicado. El valor inicial del contador debe
     ser mayor o igual que cero.
•  Sem_wait(semaphore s): de manera atómica, espera a que el contador
     sea mayor que cero; cuando lo sea, decrementará el valor del contador
     (figura 11).
•  Sem_signal(semaphore s): de manera atómica, incrementa el valor del
     contador asociado al semáforo (figura 12).


    sem_wait (semaphore s) {
       while (s <= 0) /* atómicamente */
          espera();

       s = s - 1;
    }


Figura 11. Pseudo-código de sem_wait

## Página 16

<!-- source-page: 16 -->

GNUFDL • PID_00214803                                                                                  16                                                                                         Comunicación y sincronización


    sem_signal (sempahore s) {
       s = s + 1; /* atómicamente */

    }


Figura 12. Pseudo-código de sem_signal

Observaciones:


•    Existen dos tipos de semáforos en función del rango de valores que pueda
    alcanzar el contador asociado al semáforo: binarios (el contador sólo pue-
    de valer 0 o 1) y n-arios (el contador puede tomar cualquier valor mayor o
    igual que cero). Los semáforos binarios son los que implementan de modo
    más natural el acceso en exclusión mutua a una región crítica.


•    Cabe destacar que las operaciones realizan sus acciones de manera ató-
    mica. Supongamos que el contador asociado a un semáforo vale 0 y dos
    procesos están esperando haciendo un sem_wait a que el contador tome
    un valor mayor que cero. Si ahora algún proceso ejecuta un sem_signal
    sobre este semáforo e incrementa el contador del semáforo, únicamente
    uno de los procesos que ejecuta el sem_wait verá que el contador vale 1
    y lo decrementará; el otro proceso deberá continuar esperando hasta que
    se realice otro sem_signal.


•    Si varios procesos están esperando haciendo un sem_wait a que el conta-
    dor del semáforo tome un valor mayor que cero y algún proceso ejecuta
    un sem_signal sobre este semáforo, se plantea un problema de elección.
    ¿Cuál de los procesos en espera ha de ver este incremento del semáforo?
    Inicialmente, consideraremos que esta elección será aleatoria, pero más
    adelante volveremos sobre este tema.


•    Las operaciones básicas no devuelven cuál es el valor actual del conta-
    dor asociado al semáforo. Algunas implementaciones de semáforos ofre-
    cen una operación para obtener este valor pero en este documento no las
    consideraremos.


•    Los nombres de las operaciones sem_wait y sem_signal no son estándar.
    En la literatura o en implementaciones concretas podéis encontrar que la
    operación sem_wait se denomina P, down, signal, acquire o pend;
    la operación sem_signal se puede denominar V, up, wait, release
    o post. Es importante no confundir las llamadas al sistema UNIX wait y
    signal con las operaciones sobre semáforos wait y signal.

## Página 17

<!-- source-page: 17 -->

GNUFDL • PID_00214803                                                                                  17                                                                                         Comunicación y sincronización

Descargar Markdown originalEstudiar este apartado