ACSO Programmazione di Sistema e Concorrente

Documenti analoghi
2. I THREAD. 2.1 Introduzione

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

I Thread. Laboratorio Software M. Grotto R. Farina

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

Lezione 5. Processi e thread. Sistemi operativi. Marco Cesati System Programming Research Group Università degli Studi di Roma Tor Vergata

I thread nel sistema operativo LINUX: Linuxthreads

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

Monitor pthreads. Esercizio

Linuxthreads: esercizio

Relazione tra thread e processi

Perche le CPU multicore

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

interoperabilità fra dispositivi forniti da diversi produttori; superare i problemi legati alla limitazione del numero di risorse.

Il Concetto di Processo

Processi in Linux. Stru/ura file eseguibili

Programmazione multiprocesso

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Thread. Thread. Creazione di nuovi processi. Applicazioni reali. La creazione di un nuovo processo costa I tempi di context switch sono elevati

Posix Threads: l evoluzione dei processi UNIX

Sistemi Operativi (M. Cesati)

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

Sistemi Operativi. Gianluca Della Vedova. Sistemi Operativi. Gianluca Della Vedova. Sistemi Operativi. Gianluca Della Vedova.

Ingegneria del Software

Programmazione Orientata agli Oggetti in Linguaggio Java

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Cosa e un processo? Stato del processo

SISTEMI OPERATIVI THREAD. Giorgio Giacinto Sistemi Opera=vi

Sistemi Operativi L-A. Esercizi 14 Giugno Esercizio monitor

Corso di Sistemi Operativi A.A CHIAMATE DI SISTEMA PER IL CONTROLLO DEI PROCESSI. Fabio Buttussi

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Concetto di processo. Processi. Immagine in memoria di un processo. Stati di un processo. Un SO esegue una varietà di attività:

I puntatori e l allocazione dinamica di memoria

Capitolo 3 -- Silberschatz

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Le system call: fork(), wait(), exit()

SISTEMI OPERATIVI. I thread. Prof. Luca Gherardi Prof.ssa Patrizia Scandurra (anni precedenti) (MODULO DI INFORMATICA II)

Processi programma processo processo Stati di un processo Attesa di caricamento new Pronto ( ready ) Esecuzione running Waiting ( in Attesa )

Gestione dei processi

Elementi di Architettura e Sistemi Operativi

CREAZIONE PROCESSI IN UNIX 20

Java Virtual Machine

Gestione dei File in C

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Processi in Linux. Igino Corona 20 Ottobre 2009

Il file system. Le caratteristiche di file, direttorio e partizione sono del tutto indipendenti dalla natura e dal tipo di dispositivo utilizzato.

La torta caprese. Ingredienti. Istruzioni: 5 uova 8 cucchiai di zucchero 1/8kg di burro ¼kg di mandorle dolci 100gr di cioccolato fondente

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

Introduzione alla programmazione in C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

19. Introduzione al multi-threading

GESTIONE DEI PROCESSI

Sistemi Operativi (modulo di Informatica II) I thread

I THREAD O PROCESSI LEGGERI Generalità

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

La gestione della memoria

Il sistema operativo LINUX Indice

Gestione di files Motivazioni

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione dei processi

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

SISTEMI OPERATIVI. I processi. Prof. Luca Gherardi Prof.ssa Patrizia Scandurra (anni precedenti) (MODULO DI INFORMATICA II)

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

GENERAZIONE PROCESSO FIGLIO (padre attende terminazione del figlio)

Linguaggio C. Fondamenti. Struttura di un programma.

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Quote of the day. (

PROGRAMMA DISCIPLINARE SVOLTO a. s / 2016

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

3.2 Concorrenza, parallelismo e parallelismo reale

POSIX - Gestione dei Segnali. E.Mumolo, DEEI mumolo@units.it

Il Sistema Operativo. Di cosa parleremo? Come si esegue un programma. La nozione di processo. Il sistema operativo

1 Processo, risorsa, richiesta, assegnazione 2 Concorrenza 3 Grafo di Holt 4 Thread 5 Sincronizzazione tra processi

Laboratorio di Algoritmi e Strutture Dati. La gestione della memoria dinamica Heap

(1) (2) (3) (4) 11 nessuno/a (1) (2) (3) (4) X è il minore tra A e B nessuno/a X è sempre uguale ad A X è il maggiore tra A e B

Sistemi Operativi (modulo di Informatica II) I processi

Linguaggio C - Funzioni

FONDAMENTI di INFORMATICA L. Mezzalira

Laboratorio di Sistemi Operativi Cognome Nome Mat.

Il costrutto monitor

Processi, Threads e Agenti

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Esercizio: gestione di un conto corrente

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

INFORMATICA 1 L. Mezzalira

Uso degli oggetti. Un programma Java. è un insieme di oggetti, ognuno istanza di una classe, che si inviano messaggi

SC che operano su thread. pthread_create() etc...

Sistemi Operativi (modulo di Informatica II) La comunicazione tra processi

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Capitolo 5: I thread

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Il Sistema Operativo (1)

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Linguaggio C Compilazione, linking e preprocessor

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Transcript:

ACSO Programmazione di Sistema e Concorrente P2 Modello Thread 2/12/2015

programma e parallelismo il tipo di parallelismo dipende dal grado di cooperazione (scambio di informazione) necessario tra attività svolte in parallelo processo macchina virtuale indipendente con meccanismi ad hoc per scambiare informazione tra processi (IPC) attività parallele indipendenti thread attività parallela che consente strutturalmente un grado di cooperazione elevato lo scambio di informazione è molto facilitato talvolta il thread è chiamato processo leggero la gestione del thread da parte del SO è meno onerosa rispetto alla gestione del processo (come strutture dati e funzioni del SO) - 2 -

concetto di thread thread flusso di controllo che può essere svolto in parallelo con altri thread nell ambito di uno stesso processo flusso di controllo = esecuzione sequenziale di istruzioni (macchina) il flusso di controllo del thread è una funzione (sottoprogramma) attivata alla creazione del thread poiché i thread sono attività parallele in uno stesso processo, essi condividono lo spazio di indirizzamento (quasi tutto non la pila) questa è un implementazione efficiente dello scambio di informazioni scopo dello studio del thread: capirne il principio di funzionamento per comprendere/affrontare alcuni dei problemi principali che si incontrano nella programmazione concorrente - 3 -

thread POSIX pthread esistono svariati modelli implementativi di thread qui si considera lo standard POSIX Portable Operating System Interface for Computing Environment standard POSIX insieme di standard di interfacce applicative (API) di SO utilizzando le funzioni/servizi delle API di POSIX, è garantita la portabilità dell applicazione su tutti i SO conformi a POSIX lo standard definisce le API ma non stabilisce quale debba essere la loro implementazione in uno specifico SO NPTL (Native POSIX Threads Library): ultima implementazione, più efficiente, più aderente allo standard (sul modello da uno a uno ) Oggi in Linux si utilizza esclusivamente NPTL pthread = thread di POSIX Thread: libreria + funzioni di libreria Processi: SO + system call - 4 -

pthread e processo 1 il thread è attivato nell ambito del processo il processo può attivare uno, due o più thread quando il processo termina, terminano forzatamente anche tutti i suoi thread, qualunque sia il loro punto di esecuzione è necessario garantire la terminazione coerente dei thread - 5 -

pthread e processo 2 ogni thread ha un identificatore di thread, di tipo pthread_t l identificatore di thread identifica il thread univocamente l identificatore di thread è diverso dall identificatore di processo (che è di tipo pid_t) la funzione getpid( ), eseguita all interno dei thread di un medesimo processo, restituisce sempre il PID del processo stesso ogni thread può essere posto in attesa di un evento pertanto l esecuzione del thread può essere sospesa per esempio per un operazione di ingresso/uscita in modo totalmente indipendente rispetto agli altri thread - 6 -

pthread creazione creazione del thread pthread_create ( ) pthread_create ( ) è simile a fork( ) ma il thread viene creato passandogli, con pthread_create, il nome (indirizzo) della funzione che deve eseguire il thread inizia a eseguire il suo codice sempre dallo stesso punto (ossia dall inizio della funzione) qualunque sia il punto di esecuzione dove si trova il thread che lo crea - 7 -

pthread terminazione 1 attesa di terminazione tra thread pthread_join ( ) pthread_join ( ) è simile a waitpid ( ) si deve sempre specificare il thread la cui terminazione si vuole attendere il suo uso è obbligato per garantire la terminazione coerente dei thread quando termina il processo che li ha creati - 8 -

pthread terminazione 2 dato che il thread esegue una funzione, termina quando esegue return ( ) o alla fine del codice eseguibile della funzione il thread che termina può passare, tramite return ( ), un codice di terminazione al thread che lo ha creato il passaggio avviene se e quando il thread (creatore) esegue la funzione join il codice di terminazione è passato tramite il secondo parametro di join più propriamente, il codice di terminazione del thread è il valore restituito, tramite return, dalla funzione eseguita dal thread - 9 -

terminologia 1 esecuzione sequenziale date due attività A e B nel codice di un programma, esse sono sequenziali se esaminando il codice del programma stesso si può prevedere se A verrà svolta sempre prima di B oppure se B verrà svolta sempre prima di A esecuzione concorrente date due attività A e B nel codice di un programma, esse sono concorrenti se esaminando il codice del programma stesso NON si può prevedere se A verrà svolta sempre prima di B oppure se B verrà svolta sempre prima di A - 10 -

terminologia - 2 esecuzione parallela di processi/thread: simulata o reale simulata: sistema di tipo mono-processore, i processi / thread sono in esecuzione a turno sul processore (condivisione di tempo - time-sharing) reale: sistema di tipo multi-processore (multi-core), i processi / thread sono in esecuzione contemporaneamente su processori diversi in entrambi i casi i processi / thread sono concorrenti e per l osservatore (utente) il modello del sistema è sempre lo stesso naturalmente un sistema multi-processore potrà avere prestazioni superiori se il sistema è mono-processore, il termine «concorrente» è sinonimo del termine «parallelo» nota bene: anche su un sistema multi-processore, spesso il numero di processi / thread eccede il numero di processori, pertanto quasi sempre il parallelismo è in parte simulato tutte le considerazioni che verranno fatte nel seguito sono indipendenti dal numero di processori (uno o più) - 11 -

pthread esempio 1 #include <pthread.h> <stdio.h> // thread_function - tf void tf (void tid) { // codice della funzione } / tf / int main (void) { pthread_t tid1, tid2; pthread_create (&tid1, NULL, &tf, (void ) 1); pthread_create (&tid2, NULL, &tf, (void ) 2); pthread_join (tid1, NULL); pthread_join (tid2, NULL); return 0; } / main / void tf (void tid) { // variabile locale int conta = 0; conta++; printf ( sono il thread n: %d; conta = %d\n, (int) tid, conta ); return NULL; } / tf1 / - 12 -

pthread_create e parametri parametri di pthread_create ( ) pthread_create (&tid, NULL, &tf, (void ) n); 1) indirizzo di una variabile di tipo pthread_t per contenere l identificatore del thread che si sta creando 2) puntatore agli attributi del thread se NULL il thread avrà gli attributi di default 3) indirizzo della funzione eseguita dal thread (thread_function) 4) indirizzo dell argomento che si vuole passare alla thread_function si può passare un solo argomento che deve essere di tipo void se si vogliono passare più parametri, è necessario creare una struct e passarne l indirizzo - 13 -

pthread_join e codice di terminazione parametri di pthread_join ( ) pthread_join (tid, (void ) &thread_exit); 1) variabile di tipo pthread_t che contiene l identificatore del thread la cui terminazione si vuole attendere 2) puntatore a una variabile che conterrà il valore del codice terminazione passato dalla thread_function // thread_function - tf void tf (void arg) { int var_da_restituire; // codice della funzione return (void ) var_da_restituire } / tf / - 14 -

thread principale e creato 1 il thread viene creato nell ambito di un processo che ha un suo flusso di controllo: main ( ) si prende main come thread principale o di default quando un codice eseguibile viene lanciato, nel processo viene creato un solo thread, chiamato thread principale il thread principale (ossia il modulo main del codice del processo) può creare altri thread tramite pthread_create a sua volta un thread qualunque può creare altri thread quando un nuovo thread viene creato, si ha esecuzione concorrente dei due flussi di controllo - 15 -

thread principale e creato 2 il thread viene eseguito nello spazio d indirizzamento d del processo che lo ha creato tutti i thread di un processo condividono lo stesso segmento dati ciascun thread in un processo ha una sua pila, indipendente dalle pile degli altri thread e allocata in un (sotto)spazio di indirizzamento diverso pertanto le variabili locali della funzione eseguita dal thread appartengono solo a quel thread, poiché sono allocate in pila pertanto le variabili globali (e anche le variabili statiche), che non sono allocate in pila ma nel segmento dati, sono condivise tra tutti i thread è proprio questa condivisione che rende facile (immediato) lo scambio di informazione tra thread ma che rende più difficile garantire la correttezza del programma con multi-threading - 16 -

ancora esempio 1 variabile locale #include <pthread.h> <stdio.h> // thread_function - tf void tf (void tid) { // codice della funzione } / tf / int main (void) { pthread_t tid1, tid2; pthread_create (&tid1, NULL, &tf, (void ) 1); pthread_create (&tid2, NULL, &tf, (void ) 2); pthread_join (tid1, NULL); pthread_join (tid2, NULL); return 0; } / main / void tf (void tid) { // variabile locale int conta = 0; conta++; printf ( sono il thread n: %d; conta = %d\n, (int) tid, conta ); return NULL; } / tf / - 17 -

esempio 1 possibile sequenza di esecuzione sono il thread n: 1; conta = 1 sono il thread n: 2; conta = 1 oppure sono il thread n: 2; conta = 1 sono il thread n: 1; conta = 1 Il risultato dipende dall ordine di esecuzione della printf nei due thread - 18 -

ancora esempio 1 variabile globale (condivisione tra tutti i thread di uno stesso processo) #include <pthread.h> <stdio.h> // variabile globale int conta = 0; int main (void) { pthread_t tid1, tid2; pthread_create ( &tid1, NULL, &tf, (void ) 1 ); pthread_create ( &tid2, NULL, &tf, (void ) 2 ); pthread_join (tid1, NULL); pthread_join (tid2, NULL); return 0; } / main / // thread_function - tf void tf (void tid) { conta++; printf ( sono il thread n: %d; conta = %d \n, (int) tid, conta ); return NULL; } / tf / conta ++ è conta = conta + 1 in linguaggio macchina load conta in registro incrementa registro store registro in conta - 19 -

variabile globale sequenza di esecuzione sono il thread n: 1; conta = 1 sono il thread n: 2; conta = 2 oppure sono il thread n: 2; conta = 1 sono il thread n: 1; conta = 2 L uscita mostrata dipende da quale thread esegue per primo la sequenza conta ++ printf Ma sono leciti (ottenibili) anche altri risultati thread n: 1; conta = 2 thread n: 2; conta = 2 e viceversa MA ANCHE.!!! thread n: 1; conta = 1 thread n: 2; conta = 1-20 -

ancora esempio 1 variabile statica (condivisione tra thread che invocano la stessa funzione) #include <pthread.h> <stdio.h> // thread_function - tf void tf (void tid) { // codice della funzione } / tf / int main (void) { pthread_t tid1, tid2; pthread_create ( &tid1, NULL, &tf, (void ) 1 ); pthread_create ( &tid2, NULL, &tf, (void ) 2 ); pthread_join (tid1, NULL); pthread_join (tid2, NULL); return 0; } / main / void tf (void tid) { // variabile statica // dichiarata localmente, ma conserva il // valore tra una chiamata della funzione // e la chiamata successiva // funziona come una variabile globale // n.b: però ha visibilità solo locale! static int conta = 0; conta++; printf ( sono il thread n: %d; conta = %d \n, (int) tid, conta ); return NULL; } / tf / - 21 -

thread_function parametri e codice di terminazione #include <pthread.h> <stdio.h> void tf (void arg) { // codice thread_function } / tf / int main (void) { int argomento = 10; int thread_exit; pthread_t tid1; pthread_create ( &tid1, NULL, &tf, &argomento); pthread_join ( tid1, (void ) &thread_exit ); printf ( sono main: codice uscita thread = %d\n, thread_exit ); return 0; } / main / void tf (void arg) { int i; // cast per conversione tipo i = *((int *) arg); printf ( sono thread_function: valore argomento = %d \n, i); i++; // cast per conversione tipo return (void ) i; } / tf / - 22 -

thread_funct parametri e codice di terminazione sono thread_function: valore argomento = 10 sono main: codice uscita thread = 11-23 -

thread e processo considerazioni di uso efficienza: la copia di memoria per un nuovo processo richiede tecniche di gestione e risorse più onerose rispetto a un thread in generale il thread è più efficiente del processo protezione: un thread con errori può danneggiare altri thread nello stesso processo; invece un processo non può danneggiarne un altro (poiché i processi hanno spazi di indirizzamento disgiunti) i processi sono più protetti uno dall altro cambiamento di eseguibile: è possibile solo con il processo; il thread può eseguire solamente il codice della funzione associata, già presente nel codice del processo un processo figlio può, tramite la chiamata di sistema exec, sostituire l intero programma eseguibile (flessibilità) condivisione dei dati: la condivisione di dati tra thread è molto semplice, mentre tra processi è complicata (richiede l impiego di meccanismi di comunicazione tra processi IPC) - 24 -