La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 1 Programmi concorrenti: quanto è lungo un millisecondo? In un normale personal computer.

Presentazioni simili


Presentazione sul tema: "Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 1 Programmi concorrenti: quanto è lungo un millisecondo? In un normale personal computer."— Transcript della presentazione:

1 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 1 Programmi concorrenti: quanto è lungo un millisecondo? In un normale personal computer odierno, il processore può eseguire centinaia di migliaia di istruzioni in un solo millisecondo Il processore può rimanere inattivo (idle) per intervalli di tempo molto lunghi in attesa che succeda qualcosa come: - lutente prema un tasto - vengano trasferiti dati da un hard disk - venga caricato il prossimo frame di una animazione Un programma altamente interattivo lascia il processore idle per il 99% del tempo Programmare con threads significa anche utilizzare meglio le risorse del computer

2 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 2 Eseguire un programma concorrente: lo scheduler Lo SCHEDULER è un componente del sistema run-time di JAVA che Determina quale thread debba essere eseguito in un dato momento Supponiamo che un programma in esecuzione abbia i threads a, b, c, d, di cui: a e b sono eseguibili, c è effettivamente in esecuzione, e d è sospeso in attesa di operazioni di I/O - c esegue una sleep(3) lo scheduler manda in esecuzione a o b - a va in esecuzione - a richiede una operazione di I/Olo scheduler manda in esecuzione b - b va in esecuzione e terminail processore è idle finchè almeno uno fra a, c o d ritorna eseguibile

3 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 3 Scheduling di trame e priorità Priorità: ogni thread ha assegnata una priorità, che regola lassegnazione alle trame della risorsa processore Su di un computer a N processori, solitamente gli N threads di maggiore priorità che non siano bloccati in attesa di un notify, vanno effettivamente in esecuzione Altri threads con la stessa priorità oppure quelli con priorità più bassa attendono normalmente che quelli di priorità più alta terminino oppure che siano bloccati Per avere controllo sulle priorità dei thread, JAVA fornisce i metodi getPriority( )setPriority( )yield( ) e le costanti MIN_PRIORITYNORM_PRIORITYMAX_PRIORITY

4 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 4 Scheduling: quando e come usare le priorità Trame corrispondenti a processi continui --> BASSA PRIORITA Trame corrispondenti a eventi rari --> ALTA PRIORITA Esempio: Screen saver In una applicazione abbiamo un thread che riceve input dalla tastiera e visualizza i risultati, mentre un secondo thread realizza uno screen saver SE LO SCREEN SAVER E ATTIVO, QUALUNQUE TASTO PREMUTO DEVE AVERE EFFETTO IMMEDIATO STOPPANDO LO SCREEN SAVER, CHE QUINDI DOVRA AVERE PRIORITA PIU BASSA

5 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 5 Sincronizzazione Accedere concorrentemente ai dati comuni in maniera sicura: bloccare un oggetto Metodi synchronized class Account { private double saldo; public Account (double somma_iniz) { saldo = somma_iniz; } public synchronized double getSaldo ( ) { return saldo; } public synchronized void deposito (double somma) { saldo += somma; } public synchronized void trasferisci (Account conto, double somma) { saldo -= somma; conto.deposito(somma); }

6 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 6 Sincronizzazione (continua) Il campo saldo deve essere privato per garantire la consistenza dei dati Il costruttore Account non è sincronizzato dato che può essere eseguito solamente alla creazione delloggetto Sono necessari altri meccanismi di sincronizzazione se si vuole imporre un ordine preciso tra due trame concorrenti nellaccesso ai dati comuni class Account { private double saldo; public Account (double somma_iniz) { saldo = somma_iniz; } public synchronized double getSaldo ( ) { return saldo; } public synchronized void deposito (double somma) { saldo += somma; }

7 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 7 Sincronizzazione (continua) Non è affatto detto che loggetto bloccato sia poi effettivamente usato allinterno della istruzione sincronizzata public static void abs (int[ ] values) { synchronized (values) { for (int i = 0; i < values.length; i++) { if (values[i] <0) values[i] = - values[i]; } Istruzioni synchronized: bloccare un oggetto durante lesecuzione di una istruzione synchronized (expression) statement LOGGETTO RISULTANTE VIENE BLOCCATO DURANTE LESECUZIONE DI statement

8 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 8 Classi non sincronizzate in programmi multithreaded Soluz.1: Creare una sottoclasse ridefinendo ogni metodo come segue: synchronized metodo (parametri) { super(parametri); } Soluz.2: Usare i metodi della classe non synchronized in istruzioni synchronized Problema: come fare ad usare in maniera consistente in una applicazione multithreaded una classe che non è stata progettata come synchronized ?

9 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 9 Comunicazione fra trame: wait e notify wait() e notify() sono metodi della classe Object che possono essere chiamati solamente dallinterno di codice sincronizzato wait( ) rilascia atomicamente il blocco sulloggetto e arresta la trama mettendola in attesa notify( ) sveglia la trama (ovvero, una delle trame) in attesa sullo stesso oggetto notifyAll( ) sveglia tutte le trame in attesa sullo stesso oggetto

10 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 10 wait e notify (esempio) class Risorse { int quanti; public synchronized void produci ( ) { quanti++; notify( ); } public synchronized void consuma ( ) { while (quanti == 0) wait ( ); quanti--; }

11 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 11 Problemi di Deadlocks Se abbiamo due threads T1 e T2 e due oggetti O1 e O2 su cui effettuare la sincronizzazione, può accadere che: - T1 blocca O1 - T2 blocca O2 - T1 si arresta in attesa dello sblocco di O2 - T2 si arresta in attesa dello sblocco di O1 -nulla può proseguire e lapplicazione è bloccata indefinitamente: deadlock

12 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 12 Deadlock in generale Loggetto O1 esegue un metodo sincronizzato che invoca un metodo sincronizzato su O2, che a sua volta invoca un metodo sincronizzato.... … su On che infine invoca un metodo sincronizzato su O1 O1 O2 On m1( ) m2( ) m3( ) m n ( ).... m n+1 ( ) JAVA non ha alcun meccanismo per scoprire un deadlock, né potenziale (cioè in fase di compilazione), né effettivo (a run-time) LA CORRETTEZZA DEI PROGRAMMI CONCORRENTI È RESPONSABILITÀ ESCLUSIVA DEL PROGRAMMATORE

13 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 13 Deadlocks: un esempio class Trasferimento extends Thread { private Account conto1; private Account conto2; private double importo; public Trasferimento (Account c1, Account c2, double quanto) { conto1 = c1; conto2 = c2; importo = quanto; } public void run ( ) {// trasferisci() è un metodo sincronizzato!! conto1.trasferisci (conto2, importo); } public static void main (String[ ] args) { double saldo1 = Integer.parseInt (args[1]); double saldo2 = Integer.parseInt (args[3]); Account c1 = new Account (args[0], saldo1); Account c2 = new Account (args[2], saldo2); new Trasferimento (c1, c2, 1000).start(); new Trasferimento (c2, c1, 2000).start(); }

14 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 14 Deadlocks: un esempio class Account {..... public synchronized void trasferisci (Account c2, double quanto) { synchronized (c2) { c2.deposito(quanto); saldo -= quanto; }

15 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 15 Fine dellesecuzione di una trama: gli interrupt QUANDO TERMINA LESECUZIONE DI UNA TRAMA? Il metodo run( ) del thread termina Il thread riceve un messaggio di stop( ) dallesterno e muore immediatamente Il thread riceve dallesterno un messaggio di interrupt( ) e decide di eseguire stop( ) volontariamente... thread2.interrupt( );... while (!isInterrupted( )) { // fa qualcosa } stop( );... thread1 thread2

16 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 16 Attesa del termine di una trama: join( ) Se una trama t1 manda ad unaltra trama t2 il messaggio t2.join( ), lesecuzione di t1 viene sospesa fino a che t2 non è terminata class CalcThread extends Thread { private double result; public void run ( ) { calculate( ); } public double getResult ( ) { return result; } public void calculate ( ) { // calcola il valore di result } class ShowJoin { public static void main (String[ ] args) { CalcThread calc = new CalcThread( ); calc.start( ); faQualcosaAltro( ); try { calc.join( ); System.out.println(risultato = + calc.getResult( )); } catch (InterruptedException e) { System.out.println(Nessun risultato); }

17 Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 17 Trame di tipo daemon e user Di solito le trame create da un programma sono di tipo user, e la applicazione termina quando tutte le trame user attivate terminano E possibile trasformare una trama in daemon con il messaggio setDaemon(true), mentre il metodo getDaemon( ) testa lo stato daemon/user di una trama Se una trama daemon crea altre trame, queste saranno anchesse di tipo daemon e il loro stato non potrà essere mutato


Scaricare ppt "Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 1 Programmi concorrenti: quanto è lungo un millisecondo? In un normale personal computer."

Presentazioni simili


Annunci Google