vuoi
o PayPal
tutte le volte che vuoi
System Call per la gestione dei semafori in Linux
Domenico CotroneoDipartimento 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 finedi 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:
- 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. - se (semval < |sem_op| )
- se specificato il flag
IPC_NOWAIT
la system call fallisceerrno( = EAGAIN )
- 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
- se specificato il flag