i thread o “processi leggeri”
Transcript
i thread o “processi leggeri”
I THREAD O “PROCESSI LEGGERI” Processi (pesanti): entità autonome con poche risorse condivise (si prestano poco alla scrittura di applicazioni fortemente cooperanti) Ogni processo può essere visto come Immagine (descrittore di processo, Program counter, Stato dei registri, Codice, Dati ecc.) e risorse possedute (file aperti, dispositivi di I/O ecc.) Ogni processo ha un proprio spazio di indirizzamento (cioè due processi non condividono nessuna area di memoria) Ogni operazione di CONTEXT SWITCH (salvataggio del contesto del processo che viene sospeso e ripristino di quello che inizia o riprende la sua esecuzione) richiede tempo di CPU “sprecato” (overhead) Thread o processi leggeri (LWP Light Weight Process) Flusso di controllo che può essere attivato in parallelo ad altri Thread nell’ambito di uno stesso processo (nell’esecuzione dello stesso programma) Segmento di codice (una funzione) che viene eseguito in modo sequenziale all’interno di un processo (pesante). Ogni thread viene eseguito in parallelo agli altri thread mandati in esecuzione dallo stesso processo e condividono lo spazio di indirizzamento e quindi le strutture dati. Multithreading : molteplicità di flussi in esecuzione all’interno di un processo pesante. Per evolvere parallelamente agli altri thread o processi che si contendono la CPU i Thread mantengono comunque un TCB (Thread Control Blok) che contiene Un identificatore di Thead (ID) Un Program counter Un insieme di registri Uno stato di esecuzione (running, ready, blocked) Uno stack di esecuzione Uno spazio di memoria per le variabili locali NON HANNO una loro area dove è presente IL CODICE del programma in quanto condividono quella del processo che li genera così come ne condividono l’area DATI l’utilizzo dei Thread offre la possibilità di sfruttare al meglio architetture multiprocessore Le operazioni di context switch sono più semplici e veloci (condividendo i dati sono meno le informazioni da memorizzare e ripristinare) Un segmento di codice si dice thread-safe, se è in grado di supportare l’esecuzione da parte di più thread, garantendo che nessuno possa accedere a dati inconsistenti (cioè durante il loro aggiornamento) Creazione distruzione processi Allocazione, copia e deallocazione di grandi quantità di memoria Richiedono solo la creazione di uno stack per il thread Errore può danneggiare altri non può danneggiare thread e l’intero processo altri processi a cui appartiene Codice Un processo può modificare il proprio codice mediante il cambiamento di eseguibile Condivisione il codice è fissato e presente nella sezione text del processo cui appartiene E’ automatica perchè tutti E’ onerosa e deve i thread condividono la essere implementata memoria del processo cui dal programmatore appartengono E’ garantita automaticamente Mutua esclusione dall’isolamento dei vari processi limitate dall’overhead Prestazioni di gestione Limitata dalla Concorrenza difficoltà di comunicazione Thread Deve essere realizzata dal programmatore mediante semafori ecc. elevate elevate JAVA runtime MSDos Processo engine singolo Thread Processo singolo singolo Thread multipli per processo UNIX Processi MACH,LINUX multipli Thread Processi multipli singolo per Thread multipli processo per processo User Level Vengono implementati grazie ad apposite librerie (thread package) che contengono funzioni per creare, terminare, sincronizzare, effettuare lo scheduling ed il cambio di contesto (il nucleo gli ignora e gestisce solamente i processi) VANTAGGI: Efficienza di gestione (tempi di switching molto ridotti non richiedendo chiamate al kernel) Possono essere implementati su qualsiasi S.O.(alto grado di portabilità tra macchine e sistemi diversi) SVANTAGGI: Se un thread effettua una system call (ad es, per motivi di I/O) oltre a sospendere se stesso provoca la sospensione del processo che lo ha generato (quindi anche di tutti gli altri thread) Non è possibile sfruttare il parallelismo fisico in architetture multiprocessore(interni ad un processo e quindi assegnati ad un unico processore) Kernel Level (Linux,Unix e Windows) La gestione è affidata al kernel tramite chiamate di sistema, vengono gestiti come tutti gli altri processi,schedulati, sospesi, risvegliati, gli vengono assegnate risorse di sistema ecc. VANTAGGI: se un thread si sospende continuano ad evolversi altri thread generati dallo stesso processo (sono tra loro schedulati in modo autonomo) In architetture multiprocessor si può sfruttare al massimo il parallelismo fisico SVANTAGGI: Tempi lunghi impiegati dal kernel per il cambio di contesto, reso ancora più complesso in quanto deve gestire sia processi che thread Soluzione mista (Solaris) Permette di creare dei thread a livello utente che devono essere preventivamente definiti a livello di kernel e lasciano all’utente le politiche di scheduling e di sincronizzazione. VANTAGGI: se un thread si sospende questo non blocca necessariamente altri thread generati dallo stesso processo. Thread della stessa applicazione possono essere eseguiti in parallelo su processori diversi. Ciclo di vita di un Thread Idle Ready Sleeping Ranning Blocked Waiting Dead Utilizzo dei Thread Permettono di organizzare l’esecuzione di lavori con attività foreground (interattivo) e in background (lavoro nascosto) Nei fogli elettronici vengono utilizzati per le procedure di ricalcolo automatico, nei word processor per effettuare il controllo ortografico del documento che si stà creando Permettono di realizzare delle attività asincrone, quali le operazioni di garbage collection nella gestione della RAM oppure procedure di salvataggio automatico di dati (backup schedulati)