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