PDA

View Full Version : Procedura di attesa multiprocessore


giannola
16-02-2007, 06:28
Stavo studiando sul libro di sistemi operativi la procedura di attesa dei processi in un sistema multiprocessore per entrare in una sezione critica.
Il libro in particolare diceva che per evitare l'attesa attiva causata dalla lock si poteva aggiungere anche la wait.

Dunque lo schema per ogni processo era

lock(x)
wait(mutex)
unlock(x)
.
.
sezione critica
.
lock(x)
signal(mutex)
unlock(x)

Ma facendo una controprova ho notato come questa procedura conduce ad una sequenza morta.
Infatti, posto ad esempio il semaforo mutex ad 1, se il primo processo si blocca sulla sezione critica, un secondo processo si sospenderà trovando mutex = 0, ed in pratica non andrà ad eseguire la unlock.
A quel punto tutti i processi risulteranno impossibilitati ad entrare nella lock.
Come è possibile che un libro di univarsità riporti un errore tanto grave ?

ilsensine
16-02-2007, 08:57
lock(x)
wait(mutex)
unlock(x)
.
.
.
lock(x)
signal(mutex)
unlock(x)

"x" sarebbe...?

giannola
16-02-2007, 10:27
"x" sarebbe...?

x sarebbe il registro che indica la risorsa condivisa.:)

cmq ho ricevuto risposta dal docente autore del libro: in pratica qualunque sia l'esito della wait (dunque anche se sospensiva), la unlock viene eseguita ugualmente, come se fossero un' unità atomica.;)

cionci
16-02-2007, 17:56
Ma lock e unlock cosa fanno in questo caso ?
E più che altro ce n'è bisogno ?

cionci
16-02-2007, 19:17
Azz..non avevo visto che era multiprocessore...allora in tal caso sono d'accordo... Comunque sarebbe stato più chiaro con una implementazione della wait...
In ogni caso questi devono essere spin lock da quello che mi ricordo.

giannola
18-02-2007, 06:51
Azz..non avevo visto che era multiprocessore...allora in tal caso sono d'accordo... Comunque sarebbe stato più chiaro con una implementazione della wait...
In ogni caso questi devono essere spin lock da quello che mi ricordo.

infatti il mio prof. nn era molto d'accordo sulla soluzione (esattamente le perplessità che avevo io) e mi ha fatto rispondere tramite assistente:

Comunque, rimane il fatto che la soluzione è formalmente scorretta, poichè una volta in attesa sul semaforo mutex, il lock sulla variabile x non viene mai rilasciato (o almeno non è specificato).

Infatti, nelle soluzioni "vere" questo problema è risolto usando una prcedura atomica wait che si mette a dormire su una variabile, e in contemporanea rilascia il lock acquisito precedentemente).
Si veda a proposito la funzione pthread_cond_wait(&cond_var,&mutex). Non potevo illustrarle questo esempio perchè non avete fatto le variabili condizione (può vedere al riguardo il libro nell'ultima parte dove parla dei thread in ambiente linux).