Programmazione ad Oggetti 1 - SoftEng
Transcript
Programmazione ad Oggetti 1 - SoftEng
Programmazione ad Oggetti Sommario •Thread •Sincronizzazione Threads M.Torchiano M. Morisio •Sincronizzazione in Java Slide 1 Politecnico di Torino M.Torchiano M. Morisio Processi e Thread Un processo è una applicazione in esecuzione, possiede uno spazio di indirizzi, codice, dati ed altre risorse del sistema operativo. Threads user interface thread Slide 3 Politecnico di Torino process background job thread I/O parallel threads Il thread (filo) è l’entità di base a cui il sistema operativo assegna tempo di CPU. Un thread può eseguire qualsiasi parte del codice di un’applicazione, anche quello correntemente eseguito da un altro thread. Tutti i thread di un processo condividono lo stesso spazio di indirizzi e le risorse del sistema operativo. M.Torchiano M. Morisio M.Torchiano M. Morisio Politecnico di Torino Multitasking Un sistema operativo multitasking suddivide il tempo di CPU tra i thread che ne hanno bisogno. Esso assegna delle slices di CPU time ai thread. In un sistema operativo preemptive, un thread viene eseguito finché • non termina la sua time slice o termina l’esecuzione; • non si blocca (sincronizzazione con altri thread) • un altro thread acquista priorita’ maggiore Utilizzando time slice limitate (20 ms) si ha l’impressione che i thread vengano eseguiti in parallelo. (L’esecuzione e’ veramente parallela in sistemi multiprocessor). M.Torchiano M. Morisio Politecnico di Torino Version 1.2 © 2004 Marco Torchiano M. Morisio Slide 5 Slide 2 Politecnico di Torino Slide 4 Multitasking Dal punto di vista dell’utente il multitasking offre la possibilità di avere varie applicazioni aperte che lavorano contemporaneamente. Per lo sviluppatore il vantaggio consiste nel poter create applicazioni che usano più processi e processi che contengono più thread. Assegnando delle priorità di esecuzione ai diversi thread è possibile mantenere la prontezza di risposta da parte dell’applicazione ed avere un lavoro svolto in background. M.Torchiano M. Morisio Politecnico di Torino Slide 6 1 Programmazione ad Oggetti Difetti Il sistema operativo deve consumare memoria per mantenere le informazioni sui thread e sui processi. Ma le informazioni sui thread sono più limitate. Un elevato numero di thread spreca tempo di CPU nello switching. La programmazione concorrente richiede la sincronizzazione tra i vari thread per evitare conflitti. L’errata sincronizzazione può condurre a problemi come deadlock e race conditions. M.Torchiano M. Morisio Slide 7 Politecnico di Torino Scheduling Lo scheduling è il meccanismo che decide a quale thread assegnare la prossima slice di CPU time. Lo scheduler mantiene una lista di thread eseguibile per ogni livello di priorità. Quando un thread termina l’esecuzione viene messo in coda; il prossimo thread da eseguire viene prelevato in testa alla lista a più alta priorità. I thread sospesi o bloccati (su un semaforo o in attesa di input) non sono messi nella lista dei thread eseguibili. M.Torchiano M. Morisio Scheduling - Java VM lista di thread runnable, ordinati per priorita’. Quando il thread corrente termina (end run o sincronizzazione), il primo della lista runnable viene eseguito preemptive: se un thread acquista priorita’ piu’ alta di quello in corso, quello in corso viene preempted • ma NON assumere che il thread running abbia sempre la priorita’ piu’ alta Slide 9 Politecnico di Torino Priorità La priorità usata dallo scheduler dipende da: •classe del processo (idle, normal, high, real-time) •livello del thread (-2..+2) •bonus di priorità assegnato dal SO. I primi due formano la priorità di base. no time slice: se thread running non termina (end run o sincronizzazione) lo scheduler non lo preempt per thread di priorita’ uguale (o piu’ bassa) M.Torchiano M. Morisio Slide 8 Politecnico di Torino Il SO arrangia dinamicamente la priorità del thread, senza mai scendere sotto la priorità di base: •aumentando quando il thread viene sbloccato, •diminuendo quando il thread consuma tutta la propria time slice. M.Torchiano M. Morisio Politecnico di Torino Slide 10 Sincronizzazione Oggetti per la sincronizzazione Per sincronizzare diversi thread si utilizzano le funzioni wait sugli oggetti di sincronizzazione. Event: notifica uno o più thread che si è verificato un evento. Mutex: può essere posseduto da un unico thread per volta, consentendo un accesso mutuamente esclusivo alle risorse condivise. Semaphore: limita il numero massimo di thread che possono accedere simultaneamente ad una risorsa. Timer: notifica un thread dopo un certo periodo. CriticalSection: equivale ad un mutex. Gli oggetti di sincronizzazione possiedono uno stato che può essere signaled o nonsignaled; eseguendo una chiamata ad una funzione wait: •su un oggetto signaled il thread prosegue, •su un oggetto nonsignaled il thread viene sospeso. M.Torchiano M. Morisio Politecnico di Torino Version 1.2 © 2004 Marco Torchiano M. Morisio signaled nonsignaled Slide 11 M.Torchiano M. Morisio Politecnico di Torino Slide 12 2 Programmazione ad Oggetti Semafori Un semaforo mantiene un contatore tra zero ed un numero massimo specificato. Il contatore viene: •decrementato quando un thread completa una wait, •incrementato quando rilascia il semaforo. Quando il contatore è zero, il semaforo è nonsignaled ed i thread vengono fermati; il semaforo diventa signaled quando il contatore assume un valore maggiore di zero. Slide 13 Politecnico di Torino Le regioni critiche consentono l’accesso in mutua esclusione ad una risorsa condivisa. Un thread possiede una regione critica se ha completato una chiamata wait e non ha ancora rilasciato l’oggetto. Lo stato di una RC è signaled quando non è posseduta da alcun thread e diventa nonsignaled altrimenti. Un semaforo con valore massimo 1 è detto binario, esso si comporta come una regione critica. M.Torchiano M. Morisio Regioni Critiche Gli oggetti CriticalSection devono essere usati all’interno dello stesso processo; mentre i Mutex non hanno tale vincolo. M.Torchiano M. Morisio Timer Un timer è un oggetto il cui stato diventa signaled quando viene raggiunto il tempo specificato. Un timer può essere: •manual-reset: resta signaled finché non viene impostato un nuovo tempo, •synchronization: resta signaled finché un thread non completa una wait. •periodic: viene riattivato ogni volta che termina il periodo specificato. M.Torchiano M. Morisio Slide 15 Politecnico di Torino Thread in Java derivare dalla classe Thread •class X extends Thread {} •t = new X; t.start(); // genera e fa partire implementare l’interfaccia Runnable •class Y implements Runnable { public void run() {}} •new Thread (new Y) // genera il Thread, gli passa X.run da eseguire M.Torchiano M. Morisio Slide 16 Politecnico di Torino Esempio realizzare due thread, ciascuno conta fino a X. Slide 14 Politecnico di Torino extends Thread class Counter extends Thread { private int num; public Counter(int n) { num = n; } public void run(){ int i; for(i=0; i<num; ++i) System.out.print(i+" "); } public static void main(String args[]){ Counter c1,c2; c1 = new Counter(10); c2 = new Counter(5); c1.start(); c2.start(); } } M.Torchiano M. Morisio Politecnico di Torino Version 1.2 © 2004 Marco Torchiano M. Morisio Slide 17 M.Torchiano M. Morisio Politecnico di Torino Slide 18 3 Programmazione ad Oggetti implements Runnable Sincornizzazione in Java synchronized class Counter2 implements Runnable { private int num; •si applica a metodo o blocco •permette l’accesso a un solo thread public Counter2(int n) { num = n; } public void run(){ int i; for(i=0; i<num; ++i) System.out.print(i+" "); } public static void main(String args[]){ Thread t1,t2; t1 = new Thread(new Counter2(10)); t2 = new Thread(new Counter2(5)); t1.start(); t2.start(); } } M.Torchiano M. Morisio Politecnico di Torino Slide 19 M.Torchiano M. Morisio Politecnico di Torino Sincronizzazione in Java Java FIFO import java.util.Vector; void notify() •Wakes up a single thread that is waiting on this object's monitor. public class FIFO{ private Vector V; void notifyAll() •Wakes up all threads that are waiting on this object's monitor. •Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. M.Torchiano M. Morisio Politecnico di Torino Version 1.2 © 2004 Marco Torchiano M. Morisio FIFO() {V=new Vector(3);} public synchronized void Insert(Object o) { V.addElement(o); notify(); } void wait() Slide 21 Slide 20 M.Torchiano M. Morisio public synchronized Object Extract() throws Exception { Object temp; if (V.size()==0) wait(); temp=V.elementAt(0); V.removeElementAt(0); return(temp); } } Politecnico di Torino Slide 22 4