Anteprima
Vedrai una selezione di 1 pagina su 5
Sistemi operativi - System Call per la gestione dei semafori in Linux Pag. 1
1 su 5
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

System Call per la gestione dei semafori in Linux

Domenico Cotroneo
Dipartimento di Informatica e Sistemistica
Semafori: modello concettuale
Processore
DC B s.count=1 A(sq)
Coda proc.sospesi semaforo (sr)
Coda proc. pronti

void wait(sempahore s) {
    s.count--;
    if (s.count<0){
        sq.insert(Process);
        suspend(Process);
    }
}

void signal(sempahore s) {
    s.count++;
    if (s.count<=0){
        sq.remove(Process);
        resume(Process);
    }
}

Creazione ed inizializzazione di un semaforo
key_t chiave_sem=IPC_PRIVATE;
sem=semget(chiave_sem,2,IPC_CREAT|0664);
semctl(sem,0,SETVAL,val1);
semctl(sem,1,SETVAL,val2);

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

Un <unsigned short semval; /* semaphore value */> <unsigned short semzcnt; /* # waiting for zero */> <unsigned short semncnt; /* # waiting for increase */> <pid_t sempid; /* process that did last op */>

è su questi che agisce la primitiva semop (in particolare sulla struttura semid indicata da semid)

<semop - semaphore operations> <nsops sops>

Ognuno degli elementi, riferiti dal puntatore sops, specifica un'operazione da compiere sul semaforo. L'operazione è descritta da struct sembuf, una struttura, sops, la quale include i seguenti campi:

<unsigned short sem_num; /* semaphore number */> <short sem_op; /* semaphore operation */> <short sem_flg; /* operation flags */>

sem_flg: IPC_NOWAIT e SEM_UNDO. Se si specifica SEM_UNDO, l'operazione sarà annullata nel momento in cui il processo che l'ha eseguita termina.

<semop - semaphore operations> <sops>

L'insieme delle

Le operazioni specificate sono eseguite in maniera atomica. Ogni operazione è eseguita sul semaforo individuato da sem_num. In altre parole, indica su quale semaforo, tra quelli presenti nell'array, dovrà essere eseguita l'operazione. Il primo semaforo dell'array ha indice 0. Il campo sem_op può assumere tre possibili tipologie di operazioni che si possono compiere sul semaforo: - wait: se sem_op < 0, si esegue una wait_for_zero. - signal: se sem_op == 0, si esegue una signal. - 2: se sem_op > 0, si esegue una signal. Se sem_op è un intero positivo, l'operazione consiste nell'addizionare il valore di sem_op al valore del semaforo (semval += sem_op). Inoltre, nel caso in cui sia specificato il flag SEM_UNDO, il sistema aggiorna il contatore "undo count" (semadj) del processo per il semaforo in questione. È utile osservare che quest'ultima operazione non verrà mai bloccata. Al fine

di eseguire l'operazione di "signal", il processo chiamante dovrà sicuramente avere i permessi necessari alla modifica dei valori del semaforo.

sem_op == 0: "wait_for_zero"

Se ha valore nullo, l'operazione specificata ("wait-for-zero") è articolata nei seguenti passi:

1. se il valore è zero, l'operazione procede immediatamente (il processo non si sospende)

2. Altrimenti (semval ≠ 0) si procederà come di seguito:

sem_flg, la system call

i. se è specificato il flag IPC_NOWAIT infallisce restituendo il codice di errore EAGAIN a mezzo della errno sops variabile (nessuna delle operazioni specificate in sarà eseguita).

semzcnt

ii. altrimenti la variabile (che indica il numero di processi sospesi nell'attesa che il valore del semaforo diventi nullo) è incrementata di uno, forzando il processo a sospendersi finché una delle seguenti condizioni si verificherà:

semval

semzcnt diventa 0, (allora il valore di è decrementato).
a) errno
b) Il semaforo è rimosso: la system call fallisce ( = EIDRM).
Al fine di eseguire l’operazione di “wai_for_zero”, il processo chiamante dovrà almeno avere i permessi in lettura dei valori del semaforo.
sem_op <0 0: “wait” (1/2)
sem_op
Se ha valore negativo, l’operazione si articolerà come di seguito:
  1. se (semval ≥ |sem_op| ) l’operazione procede immediatamente e se SEM_UNDO il sistema aggiornerà il contatore specificato il flagundo count semadj“ ” ( ) del processo per il semaforo in questione.
  2. se (semval < |sem_op| )
    1. se specificato il flag IPC_NOWAIT la system call fallisce errno( = EAGAIN )
    2. altrimenti il valore del campo semcnt (il contatore dei processi sospesi nell’attesa che il valore del semfaro venga incrementato) viene incrementato di 1. Il processo si sospende
Al fine di eseguire l’operazione di “wait”,Il processo chiamante dovrà sicuramente avere i permessi necessari alla modifica dei valori del semaforo. 3
Dettagli
Publisher
A.A. 2012-2013
5 pagine
SSD Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Menzo di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Cotroneo Domenico.