Monitor e Monitor Java: introduzione alla sincronizzazione tra processi

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

Tullio Buzzi
Istituto Tecnico Statale - Settore Tecnologico
Riferimenti:
Libro pag. 213-215 + 281 + 285
Monitor e monitor Java:
introduzione
Richiamo: meccanismi per la
sincronizzazione tra processi
2
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:
1. Gli spin lock (o semafori binari, o semafori di
basso livello)
2. I semafori di Dijkstra (o semafori a conteggio, o
semafori generalizzati)
3. I monitor

Visualizza gratis il Pdf completo

Registrati per accedere all’intero documento e trasformarlo con l’AI.

Anteprima

Monitor e monitor Java: introduzione

Riferimenti

Libro pag. 213-215 + 281 + 285

Richiamo: meccanismi per la sincronizzazione tra processi

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:

  1. Gli spin lock (o semafori binari, o semafori di basso livello)
  2. I semafori di Dijkstra (o semafori a conteggio, o semafori generalizzati)
  3. I monitor

Introduzione ai monitor

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:

  • di più alto livello
  • meno potenti
  • ed in certi casi meno efficienti,

Ma:

  • di più semplice uso
  • più sicuri. Infatti con i semafori il programmatore può causare situazioni di deadlock o, per un improprio posizionamento delle primitive P() e V(), interferenza

Introduzione ai monitor

Con i semafori:

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.

Introduzione ai monitor

L'idea nasce da un articolo di Dijkstra del 1971, ma:

  • la prima notazione linguistica per i monitor è di Brinch Hansen (1973) (Monitor di Hansen)
  • Nel 1974 Hoare propone la sua semantica dei monitor - più generale di quella di Hansen (Monitor di Hoare)

Monitor: l'idea

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.

  • Se un processo si accinge a usare la stanza e la chiave è appesa alla porta, esso può aprire la stanza, entrare e servirsi delle procedure del monitor.
  • Se non c'è la chiave appesa, il processo deve attendere che l'attuale utilizzatore abbia lasciato la stanza -rimettendo a posto la chiave.
  • Non è lecito a nessuno stare nella stanza per sempre.

Monitor: l'idea

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.

Terminologia

Quando un processo ha acquisito le «chiavi della stanza», si dice che ha acquisito il lock sul monitor, che è entrato nel monitor

Riflessione

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.

Monitor e semafori

  • Il monitor può essere implementato se si hanno a disposizione nel linguaggio di programmazione i semafori (es. in C) e, viceversa,
  • dato il costrutto monitor, è possibile implementare i semafori (costruendo ad es. una classe Semaforo)

I monitor di Hoare

MONITOR DI HOARE

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 */ }

I monitor di Hoare

Dove:

  • Per accedere alle variabili (private) è necessario utilizzare le procedure entry (public)
  • Un solo processo alla volta è attivo nel monitor (il codice necessario alla realizzazione di ciò è inserito direttamente dal compilatore nel programma eseguibile)
  • Nel monitor possono essere presenti anche procedure non entry (private). Queste procedure possono essere utilizzate solamente all'interno della classe Monitor (es. chiamate dalle procedure entry per svolgere il proprio lavoro)

Utilizzo dei monitor

La sincronizzazione tra processi/thread prevede due livelli di gestione:

  1. Mutua esclusione nell'accesso a risorse condivise
  2. Gestione dell'ordine con il quale i processi hanno accesso alla risorsa

Vediamo il primo punto in linguaggio Java. Il secondo punto verrà affrontato nel prossimo anno di corso.

In Java: il modificatore synchronized

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:

  • Metodi
  • Parti di codice di un metodo

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.

Sintassi:

  • Tutto il metodo: public synchronized void increment (){ int i = get(); i++; /*ricordare che i++ non è atomica in Java, quindi va sincronizzata*/ set(i); }
  • Parte del codice: public void increment (){ synchronized (this) { int i = get(); i++; /*ricordare che i++ non è atomica in Java, quindi va sincronizzata*/ set(i); }//qui codice non sincronizzato }

Il modificatore synchronized: significato

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).

La clausola synchronized: note

  • Utilizzando la seconda forma (sincronizzazione di blocco di codice) è possibile effettuare il lock anche su un oggetto diverso dall'oggetto corrente (this).
  • È possibile applicarla anche a metodi statici (per es. per sincronizzare l'accesso a variabili di classe) [In Java ad ogni classe è associato un oggetto Class, quindi il monitor viene associato a quell'oggetto]

Sincronizzazione dei thread tramite monitor

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.

Non hai trovato quello che cercavi?

Esplora altri argomenti nella Algor library o crea direttamente i tuoi materiali con l’AI.