View Single Post
Old 17-01-2012, 09:43   #2
bububu
Junior Member
 
Iscritto dal: Dec 2007
Messaggi: 11
Te lo dico per esperienza (anche io ne so qualcosa di esami di SO) una volta che entri nel "meccanismo" dei semafori il risolvere gli esercizi proposti è una cavolata (o quasi).

Nel link [http://www.2shared.com/file/f5Q6qL2t/Altro.html] trovi delle dispense che ho fatto assieme ad un mio amico. Una parte sono solo teoria (c'è un pò di tutto: kernel, processi, thread, programmazione concorrente, deadlock e posticipazione indefinita, scheduling, gestione memoria), una parte solo di esercizi risolti (in alcuni ci sono degli errori stupidi come il nome sbagliato in alcuni semafori me ne sono accorto ora). Spero ti siano di aiuto

Comunque per farla breve, breve, breve, anzi brevissima, il problema della mutua esclusione si verifica quando una qualsiasi risorsa viene letta/scritta da due "entità" (thread o chi per loro) in maniera contemporanea (parallelamente per intenderci).

Le casistiche di "risoluzione" di questo tipo di problemi a mio avviso sono solamente 3 (o comunque riconducibili ad una di queste)

1) Mutua esclusione (MUTEX): l'accesso ad una risorsa è esclusivo, quando leggo/scrivo nessun'altro ha accesso (semaforo inizializzato a 1)

Soluzione:
// codice uguale ad entrambi i thread
wait(S)
<regione critica>
signal(s)


2) Sincronizzazione completa: avvio il thread2 quando il thread1 ha finito di fare quel che deve fare (semafori incrociati uno inizializzato a 0 ed uno a 1)

Soluzione:
Thread 1
loop{
wait(S)
<regione critica>
signal(p)
}

Thread 2
loop{
wait(p)
<regione critica>
signal(s)
}

3) Sincronizzazione: (può essere ricondotto al caratteristico problema del buffer circolare). Voglio che il thread1 faccia qualcosa ogni N giri del thread2 (inizializzo un semaforo a 0 ed uno ad N)

(stesso codice del caso 2)


Spero di esserti stato di aiuto e di non aver scritto troppe gastronerie. In bocca al lupo per l'esame
bububu è offline   Rispondi citando il messaggio o parte di esso