Sei sulla pagina 1di 19

Sistemi concorrenti

Corso
Laurea Specialistica
I Anno I Semestre
Aula 19
Mercoledì 13:00-15:00
Venerdì 11:00-13:00 (da concordare)
6 crediti
Docente
Gianni Campanile
campanil@mat.uniroma2.it
Gianni Campanile 1

Eventuali domande su tematiche del corso devono preferibilmente essere


poste sul forum
http://forum.spettinato.com/index.php?showforum=51
Per altre comunicazioni posso essere contattato via email.
Argomenti del corso
Problema della concorrenza
Processi e thread
Deadlock e Deadlock avoidance
Sincronizzazione di processi
Programmazione multithread,
concorrente, parallela e distribuita
Socket, RPC, RMI

Gianni Campanile 2

Programma dettagliato:
Concorrenza
definizioni e origini
Processi
Creazione di processi
Multitasking
Processi leggeri o Thread
Deadlock
Deadlock avoidance
Cicli e Policicli
Programmazione concorrente
Stati, Azioni, Storie
Sincronizzazione e atomicità
Produttore/Consumatore
Proprietà di sicurezza e esistenza
Politiche di scheduling
Locks e Barriere
Il problema della sezione critica
Spin locks
Barriere di sincronizzazione
Semafori
Operazioni P() e V()
Problemi classici di lock e tecniche
Filosofi a cena
Funzioni Pthread
Monitors
Semantica dei monitor
Sincronizzazione in Java: Thread e synchronized
Readers e writers
Programmazione distribuita
Client e servers
Protocollo TCP e UDP e Socket
Message Passing Interface
Socket in Java
Remote Procedure Calls
Semantica delle RPC
RPC e rendez-vous
RPC in Java: RMI
Interazione tra processi
Algoritmi heartbeat e pipeline
bag-of-tasks distribuito
semafori distribuiti
Requisiti ed Obiettivi
Requisiti:
Conoscenza del C e di Java
Conoscenza di concetti di Sistemi Operativi:
processi, thread, e funzioni relative: fork(), clone()
Conoscenza delle tecniche di IPC in Linux
Obiettivi
Imparare a conoscere le problematiche e i
paradigmi della programmazione concorrente
Saper implementare applicazioni con accesso
concorrente, sia locali che distribuite
Imparare gli strumenti più diffusi per la
programmazione concorrente

Gianni Campanile 3

Altri requisiti riguardano la disponibilità di un sistema Linux (qualunque)


sul quale siano installate le funzioni in C Pthread e, per ogni evenienza,
anche le funzioni lam-mpi (www.lam-mpi.org)

Per un sistema Linux è possibile utilizzare un secondo disco, una parte


del proprio disco o una macchina virtuale.

E’ sconsigliato l’uso di cygwin.

Modalità di esame:
L’esame dovrebbe consistere in un progetto di concorrenza, concordato precedentemente con il docente, ma
è ancora da definire.
In ogni caso, sia che ci sia il progetto o meno, verrà effettuato un esame orale sugli argomenti del corso.
Riferimenti
Libro di Testo:

! "
Approfondimenti su sistemi operativi
A.S. Tanenbaum, “Operating Systems - Design and Implementation' ' , Prentice-Hall
A. Silberschatz, P.B. Gavin, “Operating System Concepts’’, Addison-Wesley
H.M. Deitel, “Operating Systems' '
, Addison-Wesley
G. Nutt, “Operating Systems: a Modern Perspective' '
, Addison-Wesley
Approfondimenti su Unix/Linux
M.J. Bach, “The design of the Unix Operating System' ', Prentice-Hall
B. Goodheart, J. Cox, “The Magic Garden Explained: The Internals of the Unix System V Release 4' '
,
Prentice-Hall
D.P. Bovet, M. Cesati, “Understanding the Linux Kernel (2nd edition)' ', O'Reilly & Co.
Linguaggio C
B.W. Kernigham, D.M. Ritchie, “Linguaggio C' ', Jackson Libri
H.M. Deitel, P.J. Deitel, “C Corso completo di programmazione (seconda edizione)' '
, Apogeo
W.R. Stevens, “Advanced programming in the Unix environment' '
, Addison-Wesley
Client/Server computing
Douglas Comer, “Internetworking with TCP/IP”
RPC
John Bloomer, “Power programming with RPC”, O' Reilly
Java e distributed computing
Bruce Eckel, “Thinking in Java 2” (online) http://www.BruceEckel.com

Gianni Campanile 4

Per il libro di testo esiste una pagina di errata corrige all’indirizzo:


! "

# $ %
% & '

( ) * !
Concorrenza
Necessità di svolgere più compiti
utilizzando delle risorse condivise
Esempio: acquistare un biglietto dello
stadio
Utilizzo seriale
Fila ad un solo sportello dello stadio
Utilizzo parallelo locale
Fila a più sportelli dello stadio
Utilizzo parallelo distribuito
Acquisto in altri luoghi, prevendite etc.

Gianni Campanile 5
Origini
La programmazione concorrente è nata negli
anni ’60 con la nascita dei dispositivi DMA

Gianni Campanile 6
Molti Multi…
Multitasking
Esecuzione di programmi indipendenti sulla CPU e
sul processore di I/O
Multiprogrammazione
Aggiunta di tecniche di protezione della memoria che
assicurano che un programma in esecuzione non
possa accedere alle aree di memoria assegnate agli
altri programmi eseguiti insieme ad esso
Multiprocessing
Multiprogrammazione estesa ad elaboratori dotati di
più CPU e processori di I/O
Multithreading
Tecnica di programmazione concorrente che utilizza
più flussi (thread) per lo stesso processo

Gianni Campanile 7
Processi 1/9

Un processo (process o task) è un programma


eseguibile su un processore

Un processo può essere in tre stati:


In esecuzione
Pronto
Bloccato sull’evento E

E’ lo scheduler che decide quale processo


mettere in esecuzione o in pronto

Gianni Campanile 8
Processi
Schema degli stati

! " #

Gianni Campanile 9
Processi: multitasking
& & ' ! &
( " '
'
! ! #) !
! *"
### "
,-

! + ! + ! +

! + ! + ! +
### "

! +
! +
*

Gianni Campanile 10

%
Processi: creazione
La creazione di un processo viene effettuata
attraverso apposite chiamate di sistema definite
dagli standard POSIX.
Tali chiamate differiscono per:
Spazio degli indirizzi condiviso (Copy On Write)
Condivisione delle risorse
Diritti di accesso del nuovo processo alle risorse
A seconda del tipo di condivisione si chiamano
processi o thread
In alcuni casi i thread sono detti LWP (light-
weight process, processi leggeri) ma ci possono
essere delle differenze

Gianni Campanile 11

Si può anche dire che un singolo processo ha un singolo thread di


esecuzione; quando da questo processo nascono altri thread, allora si
parla di programmazione multithread.
Processi: Thread
Hanno ognuno: ( "
& ' !
Program counter !
Set dei registri
Spazio di stack .* ,/
$ ("
Condividono:

0
0
0
Sezione codice
Sezione dati

&
'
!
Risorse OS
& ' !
, ("

Gianni Campanile 12
Processi: funzioni
fork() (Unix/Linux)
crea un nuovo processo a partire dal punto di
esecuzione;

clone() (Linux)
crea un nuovo processo che esegue una
specifica funzione

libreria Pthread() (Linux)


Libreria posix basata sulla clone()

Gianni Campanile 13
Processi: funzioni
fork: viene generato un figlio che esegue il codice
del padre

Crea un processo restituendone il pid


pid_t fork(void)

Valore restituito:
>0:
Al processo padre in caso di operazione conclusa con
successo, rappresenta il pid del processo creato;
0:
Al processo figlio appena creato;
-1 :
Al processo padre in caso di errore durante la creazione, e
errno è settato

Gianni Campanile 14
Processi: funzioni
clone: viene generato un figlio che eseguirà una specifica funzione

int clone(int (*fn)(void *), void *cstack, int flags, void *arg)
<fn> :
Funzione che deve essere eseguita dal processo creato
<cstack> :
Indirizzo dello stack del processo figlio (top-down);
<flags> :
Indica come devono interagire padre e figlio (vedi dopo)
<arg> :
Parametri di <fn>

Ritorno:
>0:
pid del figlio creato;
-1:
errore e errno è settata
Gianni Campanile 15

L’indirizzo dello stack viene utilizzato in modalità top-down, quindi viene in


genere passato l’ultimo byte del buffer allocato.
Processi: funzioni
clone: ha diversi flags che possono essere messi in OR
CLONE_PARENT (>= Linux 2.4)
Il padre del processo creato è lo stesso del processo chiamante
CLONE_FS
Condivisione delle informazioni sul filesystem (root, umask, cwd)
CLONE_FILES
Condivisione della tabella dei descrittori di file
CLONE_SIGHAND
Condivisione della tabella dei signal handlers
CLONE_PTRACE
Se il chiamante viene tracciato, anche il figlio verrà tracciato(ptrace());
CLONE_VFORK
L'esecuzione del processo padre è sospesa fino al termine del processo
figlio
CLONE_VM
Condivisione dello spazio degli indirizzi
CLONE_PID
il figlio è creato con lo stesso PID del chiamante (solo boot)
CLONE_THREAD (>= Linux 2.4)
Il figlio è inserito nello stesso gruppo di thread

Gianni Campanile 16
Processi: funzioni
Altre funzioni utili
getpid/getppid
ritorna il PID del processo o del padre;
exec
sostituisce il processo corrente con un altro
exit
termina l’esecuzione
kill
manda un segnale ad un processo
sched_yield
rilascia il controllo
signal
cattura un segnale
sleep/usleep
attende un certo numero di secondi (o millisecondi)
wait
attende il segnale della terminazione di un figlio

Gianni Campanile 17

getpid/getppid
Restituisce il pid del processo attuale (getpid) o del processo padre (getppid)
exec
Esegue un altro processo sostituendo il processo in memoria
exit
Termina l'
esecuzione di un processo restituendo lo stato di uscita al processo padre che
può leggere tale valore (cfr. wait())
kill
La funzione consente di inviare un segnale ad un processo identificato per mezzo del suo
pid
sched_yield
Il processo viene sospeso volontariamente fino al prossimo turno di scheduling quando
concorrerà con gli altri processi per l'
assegnazione della CPU.
signal
Gestisce un segnale di interrupt attraverso una funzione utente.
sleep/usleep
Sospende un processo per un determinato intervallo di tempo. Non è garantito che il
processo dorma per l'intervallo esatto a causa delle precisione del timer interrupt. Un
processo potrebbe ritornare in esecuzione per motivi differenti dalla scadenza del timer.
wait
Attende la terminazione di un processo figlio precedentemente creato. Il processo figlio è
identificato dal pid restituito dalla funzione. Quando un processo figlio muore, viene
inviato al padre il segnale SIGCLD che per default viene ignorato, ma che può essere
intercettato con la funzione signal().
Processi: comunicazione
Processi “pesanti” non possono scambiare dati
tramite variabili globali ma possono utilizzare:
File system
Meccanismi di IPC
Memoria condivisa
Messaggi
Semafori
Segnali
Socket
I Thread che condividono lo spazio degli indirizzi
possono anche utilizzare variabili “shared”
Problemi:
Concorrenza
Alcune funzioni non sono “Thread-safe”.

Gianni Campanile 18

Lo scambio tramite file system, basato sul fatto che in Unix lo stesso file
può essere aperto da più processi allo stesso tempo, dovrebbe essere
usato soltanto nel caso in cui i processi si scambiano pochi dati.
Il secondo metodo disponibile sulla maggior parte dei sistemi di tipo Unix
è molto più efficiente in quanto viene creata una apposita regione di
memoria di tipo IPC shared alla quale può accedere tramite la chiamata di
sistema shmat() un qualunque processo che possieda l' identificatore
shmid della regione condivisa.
I segnali vengono utilizzati per sincronizzare i processi.
I socket permettono un’interazione tra processi anche su macchine
diverse.
L’ultima modalità è usato soltanto da Linux e fa uso della chiamata di
sistema clone() con flag CLONE_VM per creare processi figli che
condividono lo spazio degli indirizzi del padre. La libreria Pthread di Linux
fa uso di tale tecnica per creare processi leggeri o thread.
Processi o Thread ?
Perché i Thread e non solo processi con
shared memory ?
debugging più difficile
I processi sono più lenti
Circa 30 volte più lenti da creare
Più lenti da distruggere
Più lenti a passare da kernel a user mode
I processi consumano memoria
Migliaia di processi bloccano la macchina
Migliaia di thread sono gestibili

Gianni Campanile 19

Potrebbero piacerti anche