programmazione concorrente e distribuita linguaggi costrutti memoria comune

7
Programmazione Concorrente e Programmazione Concorrente e Distribuita Distribuita Linguaggi costrutti memoria comune

Upload: bonaventura-pavone

Post on 03-May-2015

213 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

Programmazione Concorrente e Programmazione Concorrente e DistribuitaDistribuita

Linguaggi costrutti memoria comune

Page 2: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 2

Programmazione Concorrente e Distribuita

Concurrent Pascal Concurrent Pascal (75-77)(75-77)linguaggio soprattutto didatticotre tipi di moduli:

processiclassimonitor

Modula e Modula 2 Modula e Modula 2 (77-82)(77-82)linguaggio per applicazioni in tempo reale

modularecreazione dinamica di processimonitor (interface module)coroutine

Page 3: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 3

Programmazione Concorrente e Distribuita

Mesa Mesa (77)(77)linguaggio per pprogrammazione di sistemi

creazione dinamica di processi (fork)coroutine

monitor

Edison Edison (83)(83)

linguaggio per applicazioni in tempo realeprocessi (cobegin/coend)regioni critiche condizionali

Page 4: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 4

Programmazione Concorrente e Distribuita

Costrutti monitor in linguaggi di programmazione

AdaAdaLa programmazione dei monitor e’ semplificata con l’uso di oggetti protetti

Si puo’ accedere ad un oggetto protetto sono eseguite tramite entry e procedure . Tutte saranno garantite in M.E. in M.E.Non esistono condition ma barriere (del tipo when B)Le barriere si possono usare solo nelle entryLe barriere devono dipendere solo da variabili condiviseI processi che si bloccano su una barriera vengono memorizzati in una coda FIFO(ricordando anche la condizione B)Il processo che lascia l’oggetto protetto testa la condizione dei processi bloccati

Page 5: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 5

Problema Lettori Scrittori in Ada Problema Lettori Scrittori in Ada con oggetti protetticon oggetti protetti

protectedprotected RW RW isis entryentry StartRead; StartRead; procedureprocedure EndRead; EndRead; entryentry Startwrite; Startwrite; procedureprocedure EndWrite; EndWrite;privateprivate Readers: Natural :=0;Readers: Natural :=0; Writing: Boolean := false;Writing: Boolean := false;end end RW;RW;

protected bodyprotected body RW is RW is entryentry StartRead StartRead when notwhen not Writing Writing isis beginbegin Readers := Readers + 1;Readers := Readers + 1; endend StartRead; StartRead;

procedureprocedure EndRead EndRead isis

beginbegin

Readers := Readers - 1;Readers := Readers - 1;

endend EndRead; EndRead;

entryentry StartWrite StartWrite

when notwhen not Writing Writing andand Readers = 0 Readers = 0 isis

beginbegin

Writing := true;Writing := true;

endend StartWrite; StartWrite;

procedureprocedure EndWrite EndWrite isis

beginbegin

Writing := false;Writing := false;

endend EndWrite; EndWrite;

endend RW; RW;

Page 6: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 6

Monitor in Java

In Java non esiste un costrutto predefinito monitor ma e’ possibile costruire un oggetto analogo al costrutto monitor, utilizzando:

metodi synchronized wait (blocca il processo rilasciando il lock)

notify (analogo allo statement signal del monitor)

notifyAll (sveglia tutti I processi bloccati sul monitor)

Page 7: Programmazione Concorrente e Distribuita Linguaggi costrutti memoria comune

PCD 2006-2007 Linguaggi e concorrenza 7

Monitor in Java

classclass RWMonitor { RWMonitor { volatile intvolatile int readers = 0; readers = 0; volatile booleanvolatile boolean writing = false; writing = false;

synchronized voidsynchronized void StartRead() { StartRead() { whilewhile (writing) (writing) trytry { { waiwaitt();(); } } catchcatch(InterruptedException e) {}(InterruptedException e) {} readers = readers + 1;readers = readers + 1; notifyAll();notifyAll(); }}synchronized voidsynchronized void EndRead() { EndRead() { readers = readers - 1;readers = readers - 1; ifif (readers == 0) notifyAll(); (readers == 0) notifyAll(); }}

synchronized voidsynchronized void StartWrite() { StartWrite() {

whilewhile(writing || (readers != 0))(writing || (readers != 0))

trytry { {

wait();wait();

}}catchcatch (InterruptedException e) {} (InterruptedException e) {}

writing = true;writing = true;

}}

synchronized voidsynchronized void EndWrite() { EndWrite() {

writing = false;writing = false;

notifyAll();notifyAll();

}}

}}