Sei sulla pagina 1di 2

SEMAFORI

Nello scambio di informazioni i processi cooperano tra di loro per completare un


determinato lavoro, prendendo in esame un processo P, detto produttore, crea e
deposita in memoria un messaggio che verr poi utilizzato da un altro processo C detto
consumatore.

Il messaggio in se dunque una risorsa consumabile dato che una volta utilizzata non
esister pi.

Per far si che io due processi siano sincronizzati devono essere presenti delle regole:

- Il produttore pu inserire un nuovo messaggio se il buffer non pieno.


- Il produttore pu prelevare un messaggio se il buffer non vuoto.

Caso particolare avviene quando un processo deve essere solamente avvertito quando si
verifica un determinato evento senza aver bisogno di alcun dato rendendo cos il
messaggio che ricever vuoto, in questo caso il buffer verr sostituito con una variabile
intera v (variabile semaforo) che rappresenta il contatore dellinsieme dei messaggi inviati
ma non di quelli ricevuti.

Le due operazioni per sincronizzare i processi saranno:

- Signal(v), il produttore crea e deposita il messaggio.


- Wait(v), il consumatore preleva il messaggio.

Anche in questo caso sono necessarie delle regole per sincronizzare le operazioni:

- La variabile semaforo v deve essere uguale alla differenza tra messaggi ricevuti e
messaggi inviati, v = ricevuti inviati.
- Se i messaggi ricevuti sono inferiori a quelli inviati, un processo quando eseguir la
wait(v) incrementer il contatore dei messaggi ricevuti.
- Se ricevuti e inviati hanno lo stesso valore allora il processo che eseguir la wait(v)
verr messo in attesa (o in coda) aspettando larrivo del messaggio.
- Quando un processo eseguir la signal(v) il numero dei messaggi spediti si
incrementer di 1 e se ci sono processi in coda al semaforo ne verr prelevato
soltanto uno di essi e si incrementer il valore dei messaggi ricevuti.

Laccesso alla risorse avverr in mutua esclusione in quanto in primo processo che
eseguir listruzione wait(v) si ritrover nella condizione in cui i messaggi inviati sono
superiori a quelli spediti e potr procedere incrementando i messaggi ricevuti, quindi ogni
altro processo che tenter di eseguire nuovamente la wait(v) avr una condizione nel
quale entrambi i valori sono uguali e verr messo in attesa di nuovi messaggi.

Ma qui sorge un altro problema di comunicazione tra il produttore e il consumatore,


consideriamo due processi P e C che sono in esecuzione su due CPU differenti e che
devono per forza comunicare tramite un solo registro di scambio R e che prima di
depositare il messaggio, il registro deve essere vuoto, e prima di prelevarlo deve essere
pieno; partendo da questo inoltre la soluzione finale deve essere valida con un
qualunque tempo di esecuzione.

Capitanelli Marco 5A Pag. 1


SEMAFORI
Dobbiamo impiegare due semafori per raggiungere la soluzione (FineP FineC), il primo
verr settato a vero quando il processo P avr depositato il messaggio nel registro e allo
stesso modo una volta prelevato il messaggio verr fatto con FineC.

Inizialmente avremo il registro r vuoto, FineP = falso e FineQ = vero, i valori di entrambi i
semafori garantiscono che in ogni istante un solo processo potr accedere a R.

Per consentire al produttore di creare nuovi messaggi senza il vincolo di aspettare il


consumatore, questi verranno memorizzati in un array creando anche una coda di
messaggi che verranno mano a mano presi una volta che il consumatore ha terminato
quello precedente.

Quindi possiamo stabilire nuove regole di sincronizzazione anche per questo tipo di
comunicazione:

- Il numero di messaggi ricevuti sempre inferiore al numero di messaggi spediti


- Il numero dei messaggi depositati non prelevati deve ezssere sempre inferiore alla
capacit dellarray

Capitanelli Marco 5A Pag. 2