Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Antonino Mazzeo » 15.Esercitazione: Gestione dei semafori


Sommario

  • Modello concettuale
  • Struttura
  • Operazioni
    • Signal
    • Wait for zero
    • Wait

Semafori: modello concettuale

  • Creazione ed inizializzazione di un semaforo

key_t chiave_sem=IPC_PRIVATE;

//richiesta di 2 semafori ed inizializzazione

sem=semget(chiave_sem,2,IPC_CREAT|0664);

//Inizializzazione dei due semafori

semctl(sem,0,SETVAL,val1);

semctl(sem,1,SETVAL,val2);

Schema esplicativo (semaforo)

Semaforo, struttura

  • La semget definisce un ARRAY di più semafori
  • Ogni semaforo dell’array è una struttura dati che comprende tra i suoi campi i seguenti:
    • unsigned short semval; /* valore semaforo*/
    • unsigned short semzcnt; /* # proc che aspettano 0 */
    • unsigned short semncnt; /* # proc che aspettano incr.*/
    • pid_t sempid; /* proc dell’ultima op. */
  • e su questi agisce la primitiva semop

Semop – semaphore operations

int semop(int semid, struct sembuf *sops, unsigned nsops);

  • Ognuno degli nsops elementi, riferiti dal puntatore sops, specifica un’operazione da compiere sul semaforo. L’operazione è descritta da una struttura, struct sembuf, la quale include i seguenti campi:
    • unsigned short sem_num; /* numero di semaforo */
    • short sem_op; /* operazione da compiere */
    • short sem_flg; /* flags */
  • Ogni operazione è eseguita sul semaforo individuato da sem_num
  • I valori che può assumere il campo sem_op specificano tre possibili tipologie di operazioni che si possono compiere sul semaforo:
    • sem_op < 0 : wait
    • sem_op==0 : wait_for_zero
    • sem_op > 0 : signal

Signal e Wait for zero

  • Se sem_op è un intero positivo (signal), l’operazione consiste nell’addizionare il valore di sem_op al valore del semaforo
  • Se sem_op ha valore nullo, l’operazione specificata (wait-for-zero) è articolata nei seguenti passi:
    • Se il valore semval è zero, l’operazione procede immediatamente
    • Altrimenti (semval ≠ 0) si procederà come di seguito
      • se è specificato il flag IPC_NOWAIT in sem_flg, la system call fallisce restituendo il codice di errore EAGAIN a mezzo della variabile errno
      • altrimenti la variabile semzcnt è incrementata di uno, forzando il processo a sospendersi finché una delle seguenti condizioni si verificherà: semval diventa 0 o il semaforo è rimosso e la system call fallisce ( errno = EIDRM)

Wait

  • Se sem_op ha valore negativo (wait), l’operazione si articolerà come di seguito:
  • se (semval ≥ |sem_op| ) l’operazione procede immediatamente e se specificato il SEM_UNDO flag il sistema aggiornerà il contatore “undo count” (semadj) del processo per il semaforo in questione
  • se (semval < |sem_op| )
  • se specificato il flag IPC_NOWAIT la system call fallisce (errno = EAGAIN )
  • altrimenti il valore del campo semncnt (il contatore dei processi sospesi nell’attesa che il valore del semafaro venga incrementato) viene incrementato di 1. Il processo si sospende.

Prossima lezione

Esercitazione: Problema dei produttori e consumatori

I materiali di supporto della lezione

Semafori

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93