Aquí hay un desglose de sus características y uso clave:
* Mecanismo de sincronización: Los semáforos evitan las condiciones de carrera, donde múltiples procesos que intentan acceder y modificar el mismo recurso simultáneamente pueden conducir a resultados impredecibles e incorrectos. Hacen una orden de acceso controlada.
* Valor de contador: Un semáforo mantiene un valor entero no negativo. Este valor representa el número de recursos o permisos disponibles.
* `sem_wait ()` (o `sem_trywait ()`): Esta operación disminuye el valor del semáforo. Si el valor es mayor que cero, se disminuye y el proceso continúa. Si el valor es cero, el proceso bloquea (espera) hasta que el valor del semáforo se vuelve mayor que cero (otro proceso lo incrementa usando `SEM_POST`). `sem_trywait ()` es una versión sin bloqueo; Devuelve un error si el valor semáforo es cero.
* `sem_post ()`: Esta operación incrementa el valor del semáforo. Si se bloquea un proceso esperando en el semáforo, uno de los procesos de espera se despertará.
* Tipos: Linux proporciona semáforos con nombre y sin nombre.
* semáforos sin nombre: Estos se crean usando `sem_init ()` y solo son accesibles dentro del grupo de proceso o hilo donde se crearon. Por lo general, se usan para la sincronización dentro de un solo proceso.
* nombrado semáforos: Estos se crean usando `sem_open ()` y existen en la memoria compartida del sistema. Se puede acceder mediante múltiples procesos, habilitando la comunicación entre procesos (IPC). Los semáforos nombrados se identifican por un nombre único.
* semáforos binarios: Un semáforo con un valor máximo de 1 a menudo se llama semáforo binario. Actúa como un bloqueo mutex (exclusión mutua), lo que permite solo un proceso para acceder al recurso compartido a la vez.
* Contando semáforos: Un semáforo con un valor mayor que 1 es un semáforo de conteo. Puede representar múltiples instancias de un recurso, lo que permite múltiples procesos para acceder al recurso al mismo tiempo al valor del semáforo.
Ejemplo (conceptual):
Imagine una impresora compartida por múltiples procesos. Se podría usar un semáforo de conteo para controlar el acceso:
1. Inicialización: El semáforo se inicializa al número de impresoras (por ejemplo, 3).
2. El proceso 1 quiere imprimir: Llama `sem_wait ()`. El valor semáforo se disminuye (3 se convierte en 2), y el proceso procede a imprimir.
3. El proceso 2 quiere imprimir: Llama `sem_wait ()`. El valor semáforo se disminuye (2 se convierte en 1), y el proceso procede a imprimir.
4. El proceso 3 quiere imprimir: Llama `sem_wait ()`. El valor semáforo se disminuye (1 se convierte en 0), y el proceso procede a imprimir.
5. El proceso 4 quiere imprimir: Llama `sem_wait ()`. El valor de semáforo es 0, por lo que el proceso bloquea hasta que una impresora esté disponible.
6. El proceso 1 termina la impresión: Llama a `sem_post ()`. El valor semáforo se incrementa (0 se convierte en 1), y el proceso 4 se despierta.
Bibliotecas clave: En Linux, se accede generalmente a los semáforos utilizando las funciones de Semafore Posix declaradas en `