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