Ecco una ripartizione delle loro caratteristiche chiave e dell'uso:
* Meccanismo di sincronizzazione: I semafori impediscono le condizioni di gara, in cui più processi che cercano di accedere e modificare contemporaneamente la stessa risorsa possono portare a risultati imprevedibili e errati. Endono un ordine di accesso controllato.
* Valore contatore: Un semaforo mantiene un valore intero non negativo. Questo valore rappresenta il numero di risorse o permessi disponibili.
* `sem_wait ()` (o `sem_trywait ()`): Questa operazione diminuisce il valore del semaforo. Se il valore è maggiore di zero, è decrementato e il processo continua. Se il valore è zero, il processo blocca (attende) fino a quando il valore del semaforo diventa maggiore di zero (un altro processo lo aumenta usando `sem_post`). `sem_trywait ()` è una versione non bloccante; Restituisce un errore se il valore di semaforo è zero.
* `sem_post ()`: Questa operazione aumenta il valore del semaforo. Se un processo viene bloccato in attesa sul semaforo, uno dei processi di attesa verrà risvegliato.
* Tipi: Linux fornisce semafori nominati e senza nome.
* Semafori senza nome: Questi vengono creati usando `sem_init ()` e sono accessibili solo all'interno del processo o del gruppo di thread in cui sono stati creati. In genere sono utilizzati per la sincronizzazione all'interno di un singolo processo.
* Chiamati semafori: Questi sono creati usando `sem_open ()` ed esistono nella memoria condivisa del sistema. È possibile accedere a più processi, abilitando la comunicazione tra process (IPC). I semafori nominati sono identificati da un nome univoco.
* Semafori binari: Un semaforo con un valore massimo di 1 è spesso chiamato semaforo binario. Si comporta come un blocco Mutex (Reciproco esclusione), consentendo a un solo processo di accedere alla risorsa condivisa alla volta.
* Conteggio dei semafori: Un semaforo con un valore superiore a 1 è un semaforo di conteggio. Può rappresentare più istanze di una risorsa, consentendo a più processi di accedere alla risorsa contemporaneamente al valore del semaforo.
Esempio (concettuale):
Immagina una stampante condivisa da più processi. Un semaforo di conteggio potrebbe essere utilizzato per controllare l'accesso:
1. Inizializzazione: Il semaforo è inizializzato al numero di stampanti (ad es. 3).
2. Il processo 1 vuole stampare: Chiama `sem_wait ()`. Il valore di semaforo viene decrementato (3 diventa 2) e il processo procede alla stampa.
3. Il processo 2 vuole stampare: Chiama `sem_wait ()`. Il valore di semaforo viene decrementato (2 diventa 1) e il processo procede alla stampa.
4. Il processo 3 vuole stampare: Chiama `sem_wait ()`. Il valore di semaforo viene decrementato (1 diventa 0) e il processo procede alla stampa.
5. Il processo 4 vuole stampare: Chiama `sem_wait ()`. Il valore di semaforo è 0, quindi il processo blocca fino a quando una stampante non sarà disponibile.
6. Processo 1 termina la stampa: Chiama `sem_post ()`. Il valore di semaforo viene incrementato (0 diventa 1) e il processo 4 viene risvegliato.
Biblioteche chiave: In Linux, i semafori sono in genere accessibili utilizzando le funzioni di semaforo POSIX dichiarate in `
Informazioni correlate
sistemi © www.354353.com