Corso di “Programmazione a oggetti”
Programmazione concorrente
Costrutti e meccanismi di alto livello a supporto
della programmazione concorrente in ambiente
globale
Tipi di Monitor
9.07.2006
2.2.3.2 G. Cantone
1
Monitor Regione
exit && m.look() ==NULL /m.cont=1;
enter
ATTESA
MUTEX
m (1)
exit &&
P=m.look()!=NULL /
P==m.get();
ATTIV
O
P
exit
m.cont==1 /m.cont=0;
Precondizione /Postcondizione
9.07.2006
2.2.3.2 G. Cantone
2
Monitor
Regione Critica Condizionale
c1.signal/while (c1.cont>0 )
{m.put(c1.get()); c1.cont--;}
ATTESA
BLOCCAT
SYNC
s O
COND
c1
cl.wait
c1.signal
c1.wait
enter
ATTESA
MUTEX
m(1)
(exit || wait ) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
3
Monitor tipo
Regione Critica Condizionale
Un processo già in attesa su condizione, una volta
passato in esecuzione, dovrà valutare nuovamente la
condizione di avanzamento (un altro processo, già in
attesa sul semaforo di ingresso o ivi ricollocato,
entrando per primo nel monitor, potrebbe alterare lo
stato del monitor medesimo):
while(!<B>) cond.wait;
9.07.2006
2.2.3.2 G. Cantone
4
Monitor Java: notifyAll()
Corrisponde a un monitor tipo Regione Critica
Condizionale con un solo stato di attesa. Vi è un’unica
condizione di attesa, implicita.
È una classe Java che include almeno un metodo
synchronized.
Tutti metodi synchronized operano in mutua
esclusione. Con il segnalamento notifyAll(),
TUTTI i processi in attesa vengono rimessi in ingresso
del monitor.
9.07.2006
2.2.3.2 G. Cantone
5
Monitor/Implementazione/Casi reali
Monitor Java notifyAll
BLOCCAT
O
notifyAll/while (ai.cont>0 )
{m.put(ai.get()); ai.cont--;}
Attesa
interna
ai
wait
c.notifyAll
enter
synchronized
ATTESA
MUTEX
m(1)
(exit || wait ) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
6
Monitor Java
Con il segnalamento notify(), UN processo, scelto
a caso fra quelli eventualmente in attesa, viene
rimesso in ingresso del monitor.
9.07.2006
2.2.3.2 G. Cantone
7
Monitor Java: notify()
BLOCCAT
O
notify/ai.cont>0 =>
{m.put(ai.get()); ai.cont--;}
Attesa
interna
ai
wait
c.notify
enter
synchronized
ATTESA
MUTEX
m(1)
(exit || wait ) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
8
Variante Monitor MRCC
È una variante del precedente MRCC. Se il
processo attivo si sospende, allora libera il
monitor. Un processo attivo può risvegliare
un qualunque numero di processi i quali
però sono forzati ad abbandonare il monitor,
il cui controllo resta al processo segnalante.
L’uscita forzata potrebbe creare problemi, in
quanto i processi forzati a uscire non
potrebbero disporre dei giusti valori dei dati.
9.07.2006
2.2.3.2 G. Cantone
9
Variante Monitor RCC
c.signal/if (c.cont>0 )
{m.put(c.get()); c.cont--;}
BLOCCAT
O
C
wait
c.signal
enter
synchronized
ATTESA
MUTEX
m(1)
(exit || wait ) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
10
Ulteriori tipi di monitor
Aspetti comuni
I processi in attesa su coda
interna sono, in termini di
risveglio, privilegiati rispetto a
quelli in attesa all’esterno.
9.07.2006
2.2.3.2 G. Cantone
11
Monitor Monitore
Modificata
9.07.2006
!
a
ATTESA
BLOCCAT
COND
c(0)O
Cond
c(0)
Come necessario
per programma
c.wait
c.signal &&c.cont>0;
enter
ATTESA
MUTEX
m(1)
a: (exit || c.wait || (c.signal
&& c.cont==0)) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
c.signal || exit
enter && m.cont==1;/m.cont=0;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
12
Monitor/Casi reali
Monitor di Hoare
Monitor Hansen
Simili al Monitore.
Impiegano Condition e uniQueue
rispettivamente
9.07.2006
2.2.3.2 G. Cantone
13
Monitor/Implementazione/Casi reali
Monitor Concurrent Pascal
0..MAXP-1
!
a
ATTESA
BLOCCAT
QUEUE
q(0)O
QUEUE
q(0)
q.delay
q.continue &&q.queue;
enter
ATTESA
MUTEX
m(1)
a: (exit || delay || (q.continue
&& !q.queue)) &&m.look()
!=NULL/ P==m.get();
ATTIV
O
P
continue || exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
14
Altri monitor/Aspetti Comuni
Una C.signal() NON comporta l’abbandono
dello stato ATTIVO.
Ciò perché il processo segnalato potrebbe
portare il monitor in uno stato diverso da
quello lasciato dal processo che emette il
segnale e, per questo, inconsistente per lo
stesso.
9.07.2006
2.2.3.2 G. Cantone
15
Monitor Mediatore
ATTESA
BLOCCAT
COND
O
c(0)
Cond
c(0)
enter
ATTESA
MUTEX
m(1)
Come necessario
per programma
c.signal &&c.cont>0;
(exit || c.wait) &&u.cont==0
&& m.look() !=NULL
/P==m.get();
c.wait
c.signal &&
c.cont==0
ATTIV
O
P
exit(
exit
c.signal &&
c.cont>0
enter && m.cont==1;
PENDENTE
URGENTE
u(0)
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
16
Monitor/Implementazione/Avanzamentosospensione
Monitor Gladiatore
ATTESA
ELIGIBILI
e
c.signal &&
c.cont>0
Come necessario
per programma
ATTESA
BLOCCAT
COND
c O
Cond
c(0)
c.wait
c.signal
((exit || c.wait ) && e.cont>0) /
P== e.get()
enter
ATTESA
MUTEX
m
((exit || c.wait) &&e.cont==0)
&& m.look()!=NULL /
P==m.get()
ATTIV
O
P
exit
enter && m.cont==1;/m.cont=0;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
17
Monitor/ICasi reali
Monitor Mesa
ATTESA
ELEGIBILI
e(0)
c.notify &&
c.cont>0
Come necessario
per programma
ATTESA
BLOCCAT
COND
c O
Cond
c(0)
c.wait
c.notify
((exit || c.wait ) && e.cont>0) /
P== e.get()
enter
ATTESA
MUTEX
m(1)
((exit || c.wait) &&e.cont==0)
&& m.look()!=NULL /
P==m.get()
ATTIV
O
P
exit
enter && m.cont==1;
9.07.2006
Molte postcondizioni non riportate
2.2.3.2 G. Cantone
18
Scarica

OP0506_L22_TipiDiMonitor