Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Ingegneria
 
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