Slide dall'Università su Monitor e Monitor Java: introduzione. Il Pdf esplora i meccanismi di sincronizzazione tra processi, l'utilizzo dei monitor e l'applicazione del modificatore 'synchronized' in Java, con esempi di sintassi. Questo materiale di Informatica è utile per studenti universitari.
Mostra di più18 pagine


Visualizza gratis il Pdf completo
Registrati per accedere all’intero documento e trasformarlo con l’AI.
Libro pag. 213-215 + 281 + 285
Abbiamo già visto che gli strumenti che permettono di regolare l'accesso alle risorse condivise da parte delle sezioni critiche dei programmi concorrenti, nel modello a memoria comune, sono essenzialmente tre:
Il meccanismo semaforico è molto potente e può essere utilizzato praticamente per qualunque problema di sincronizzazione e di comunicazione fra processi. Rispetto ai semafori, i monitor sono:
Ma:
Viene lasciata al programmatore troppa responsabilità nell'utilizzo di queste strutture di con- trollo così delicate. I linguaggi evoluti di alto livello (ad es. Java) che supportano la programmazione concorrente, prevedono costrutti linguistici di più alto livello per realizzare il controllo delle regioni critiche: È il compilatore che introduce il codice necessario al controllo degli accessi.
L'idea nasce da un articolo di Dijkstra del 1971, ma:
Un monitor è una collezione di procedure e strutture-dati che, pur essendo condivisa fra più processi, può essere adoperata da uno solo alla volta. Il concetto è analogo a quello di una stanza per cui c'è una sola chiave.
Quando un processo chiama una procedura di monitor, le prime istruzioni [invisibili al programmatore] della procedura controlleranno se un qualche processo è attivo dentro il monitor; se è così, il processo chiamante sarà sospeso finché l'altro processo non avrà lasciato il monitor.
Quando un processo ha acquisito le «chiavi della stanza», si dice che ha acquisito il lock sul monitor, che è entrato nel monitor
Il monitor crea quindi una sorta di «protezione», «stanza sicura» per l'esecuzione delle aree critiche dei programmi concorrenti. Si noti come il concetto di monitor si applichi non alle risorse condivise (variabili, dati, attributi, oggetti ... ), bensì ai metodi (procedure). Ancora una volta sottolineiamo quindi la necessità di seguire nei nostri programmi le indicazioni dell'ingegneria del software per la OOP, nel caso specifico information hiding e incapsulamento: si accede alle variabili solamente attraverso i metodi.
Costrutto sintattico che associa un insieme di procedure/funzioni (public o entry) a una struttura dati comune a più processi, tale che: D le operazioni entry sono le sole operazioni permesse su quella struttura; D le operazioni entry sono mutuamente esclusive: un solo processo per volta può es- sere attivo nel monitor.
monitor <nome monitor>{ <dichiarazione delle variabili locali private> <inizializzazione delle variabili locali> /* definizione delle funzioni e procedure entry*/ procedura entry1() /* getter/setter delle variabili private */ { ... } procedura entryN( ) { .. . } /* getter/setter delle variabili private */ }
La sincronizzazione tra processi/thread prevede due livelli di gestione:
Vediamo il primo punto in linguaggio Java. Il secondo punto verrà affrontato nel prossimo anno di corso.
In Java il Monitor è legato ad un oggetto: ciascuna istanza di ogni classe, in quanto sottoclasse della classe Object, ha associato il proprio monitor. Il programmatore può segnalare alla JVM che un certo elemento deve far parte del monitor dell'oggetto attraverso il modificatore di accesso synchronized. Esso può essere applicato a:
Non si possono sincronizzare variabili (attributi), né classi. In altre parole, la clausola synchronized definisce la sezione critica del programma concorrente; a tale sezione critica viene associato per ogni oggetto un diverso monitor.
La regola è: Quando un oggetto è sottoposto a lock da parte di un thread, nessuna area sincronizzata - blocchi e metodi - che richieda il lock per quel determinato oggetto è eseguibile se non dal thread che detiene il lock. Attenzione quindi: Per realizzare effettivamente la mutua esclusione nell'accesso ad una risorsa, per es. una variabile, occorre sincronizzare tutti i metodi che hanno necessità di accedere a quella variabile. I metodi non sincronizzati non fanno parte del monitor, quindi ogni thread li può eseguire sull'oggetto senza effettuare controlli per l'accesso. Ovviamente va impedito l'accesso diretto alle variabili (devono essere dichiarate private).
Il costrutto Monitor consente di effettuare una sincronizzazione più completa tra processi/thread: oltre alla mutua esclusione, è possibile ad es. mettere in attesa e «svegliare» i processi/thread a seconda del verificarsi di certe condizioni più generali. Tutto ciò viene realizzato utilizzando delle procedure chiamate in letteratura wait() e signal(), i quali possono essere chiamati su variabili particolari dette «variabili condition». Il Java mette a disposizione i metodi wait(), notify() e notifyAll() della classe Object, che possono essere invocati solo dal thread che detiene il lock.