Riassunto e Appunti sulla programmazione concorrente (Monitor e Semaforo) + programma e processo + stati di un processo + I thread + MULTITHREADING (Informatica)
Definizioni
Programma: insieme statico (entità passiva) di istruzioni che descrive le
azioni da compiere.
Processo: entità attiva che rappresenta l’esecuzione delle azioni specificate
dal programma, è un’entità logica in evoluzione (un processo in esecuzione
avanza il proprio stato).
Risorsa del sistema: un qualsiasi elemento hardware o software che viene
usato da un processo e che ne condiziona la creazione e l’avanzamento,
Caratteristiche del Processo
Un processo può essere visto come l’insieme della sua immagine e dalle risorse che sta utilizzando, dove:
L’immagine del processo:
process ID, Program Counter, Stato dei Registri
Stack, Codice, Dati ecc..
Le risorse:
file aperti, dispositivi di I/O…
Proprio spazio di indirizzamento
Stati di un processo
NUOVO->PRONTO->ESECUZIONE->TERMINATO/FINE
->SOSPESO->PRONTO->ESECUZIONE->ECC...
NEW->READY->RUNNING->TERMINATED
->WAITING->->READY->RUNNING
esecuzione (running): il processo ha il controllo di un processore
pronto (ready): il processo è pronto ad essere eseguito, ed è in attesa che
lo scheduler lo metta in esecuzione;
sospeso o bloccato: il processo è fermo in attesa del risultato/risorsa
• overhead
L’esecuzione delle operazioni di context switch richiede tempo utile di CPU
che, quindi, viene così sprecato per effettuare queste operazioni “non
produttive”: questo tempo impiegato prende il nome di overhead
Processo
• Pesante / Leggero
Processo->Pesante
la parte del processo che possiede le risorse viene definita
processo pesante (processo o task)
Thread
Thread->Leggero-> ridurre l’overhead
la parte del processo alla quale viene assegnata la CPU viene
definita processo leggero (thread)
•“segmento di codice” (tipicamente una funzione) eseguito in
modo sequenziale all’interno di un processo pesante.
•Sono definiti all’interno di un processo ne condividono le risorse
•Risiedono nello stesso spazio di indirizzamento
•Hanno accesso a tutti i suoi dati.
Ogni thread viene eseguito in parallelo agli altri thread nell’ambito dello stesso processo, andando a condividere lo spazio di indirizzamento e quindi le strutture dati.
MULTITHREADING
si indica la molteplicità di flussi di esecuzione
all’interno di un processo pesante
CARATTERISTICHE DEI THREAD
• Un identificatore di thread (ID)
• Un program counter
• Un insieme di registri
• Uno stato di esecuzione(running, ready, blocked)
• Un contesto che è salvato quando il thread non è in esecuzione
• Uno stack di esecuzione
• Uno spazio di memoria privato per le variabili locali.
TCB -> THREAD CONTROL BLOCK
che è simile a PCB(Process Control Block), e
contiene i Registri, lo Stack, le
variabili “locali” e lo stato esecuzione
Thread utente e kernel
• Thread livello utente
Il kernel non vede i Thread
I Thread sono gestiti nello spazio utente
1 processo = 1 tabella dei thread personale
Nella tabella->TCB
Gestionr tabella dei thread ->run-time
Vantaggi
• Creazione e distruzione dei thread più veloce
• Portabilità su più sistemi operativi
Svantaggi
• Chiamate bloccanti al kernel di un singolo thread bloccano l’intero processo
• Non è possibile schedulare più thread in contemporanea,
(non si verifica il multithreading)
• Il kernel in questo contesto non conosce i thread del processo utente
• Thread livello kernel
Il kernel conosca i thread e li gestisca.
Non runtime->tabella dei thread nello spazio kernel
La creazione e distruzione dei thread è svolta all’interno del kernel.
Vantaggi
• Se un thread esegue una chiamata di sistema
bloccante potrà essere schedulato un altro thread.
• Possibilità di eseguire il multithreading dello stesso
processo per sistemi con più cpu
Svantaggi
• Creazione e distruzione dei thread lenta
• Più overhead
• Non è portabile su più sistemi operativi
• soluzioni ibride (molti a uno)
Più thread nello spazio utente
Un thread nello spazio kernel
I thread nello spazio utente comunicano con il kernel attraverso il thread kernel di riferimento utile per la schedulazione.
Nel caso in cui un thread si blocca tutto il processo rimane bloccato.
• soluzioni ibride (uno a uno)
1 thread utente -> 1 thread kernel
SI più thread in parallelo In caso di blocco non vengono bloccati tutti i thread
Più thread a livello kernel-> Più overhead
Programmazione Concorrente
È l'insieme di Tecniche e strumenti impiegati per descrivere il comportamento di più attività o processi che si intende far eseguire contemporaneamente in un sistema.
Sistema concorrente: quando vengono eseguite contemporaneamente un numero diverso di attività che possono cooperare tra di loro per raggiungere un obiettivo comune
oppure
competere per utilizzare risorse condivise.
Due processi si dicono concorrenti se la prima operazione di uno di essi ha inizio prima del completamento dell’ultima operazione dell’altro.
ERRORI
Mutua Esclusione e Sezioni Critiche
Non si può sapere quando e per quanto tempo un processo avrà bisogna di una risorsa, ma sappiamo che ,nel caso della mutua esclusione, una risorsa può essere assegnata solo ad un processo alla volta.
sezione critica: la sequenza di istruzioni con la quale un processo accede e modifica un insieme di variabili condivise.
• nessuna coppia di processi può trovarsi simultaneamente nella sezione critica;
• l’accesso alla regione critica non deve essere regolato da alcuna assunzione temporale o dal
numero di CPU;
• nessun processo che sta eseguendo codice al di fuori della regione critica può bloccare un
processo interessato a entrarvi;
• nessun processo deve attendere indefinitamente per poter accedere alla regione critica.
BLOCCO THREAD
• starvation (o blocco individuale): si verifica quando un processo rimane in attesa di un
evento che non accadrà mai, e quindi non può portare a termine il proprio lavoro,
• deadlock (stallo o blocco multiplo): si verifica quando due o più processi rimangono in
attesa di eventi che non potranno mai verificarsi a causa di condizioni cicliche nel
possesso e nella richiesta di risorse.
Come gestire la sessione critica
LOCK
1) un processo eseguire una serie di operazioni per occupare la
risorsa in maniera unica
UNLOCK
2) un processo eseguire una serie di operazioni per rilasciare la
risorsa per farla usare ad un' altro processo
LOCK
SEZIONE CRITICA
UNLOCK
TestAndSet(x)-> che controlla e modifica il valore di un bit in modo ininterrompibile
Set(x)-> che ne effettua il semplice settaggio
synchronized->identifica la sezione critica
• Metodo sincronizzato
• Blocco sincronizzato
La mutua esclusione è realizzata per mezzo di un lock
(semaforo binario)
JAVA
Oggetto: un contenitore di dati e funzioni
(Stato, Comportamento ed Identità)
Classe: un insieme di oggetti che hanno lo stesso insieme
di comportamente stati.
Java associa un lock ad ogni oggetto
L’esecuzione del metodo sincronizzato nome_metodo consiste in:
1. acquisire automaticamente il lock per conto del thread in esecuzione (acquisisce la sezione critica);
2. eseguire il corpo del metodo
3. rilasciare il lock, anche se l'esecuzione del corpo è terminata da un eccezione (rilascia la sezione critica)
Mentre un thread detiene un lock, nessun altro thread può acquisirlo
MONITOR
definisce la regione critica e mette a disposizione sottoprogrammi che possono accedere a variabili e strutture dati interne a esso: un solo processo o thread alla volta può essere attivo entro il monitor e può quindi richiamare queste procedure.
entry
Il monitor permette di aggiungere alla definizione di tipo di dati astratto una specifica della sincronizzazione fra i threads per mezzo dell’invocazione dei seguenti metodi:
• wait(): tale metodo rilascia il lock (mutua esclusione) sull'oggetto e sospende il thread che lo invoca in attesa di una notifica.
• notifyAll(): tale metodo risveglia tutti i thread sospesi sull'oggetto in attesa di notifica.
I thread risvegliati competono per acquisire il lock (mutua esclusione) sull'oggetto.
• notify(): tale metodo risveglia un thread scelto casualmente tra quelli sospesi sull'oggetto in attesa di notifica.
Il thread risvegliato compete per acquisire il lock (mutua esclusione) sull'oggetto.
Tali metodi wait(), notify() e notifyAll() devono essere invocati dall'interno di un metodo
o blocco sincronizzato
Commenti
Posta un commento