programmazione concorrente linux. la concorrenza è una caratteristica dei sistemi di elaborazione...

9
Programmazione Programmazione concorrente concorrente Linux Linux

Upload: raffaella-riccardi

Post on 01-May-2015

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

Programmazione Programmazione concorrenteconcorrente

LinuxLinux

Page 2: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

Programmazione Programmazione concorrenteconcorrente

La concorrenza è una caratteristica dei sistemi di La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme elaborazione nei quali può verificarsi che un insieme di processi o sottoprocessi (thread) sia in esecuzione di processi o sottoprocessi (thread) sia in esecuzione nello stesso istante.nello stesso istante.

Un'importante classe di sistemi informatici nei quali Un'importante classe di sistemi informatici nei quali gli aspetti di concorrenza sono fondamentali è quella gli aspetti di concorrenza sono fondamentali è quella dei sistemi operativi.dei sistemi operativi.

Si può parlare di concorrenza nel caso di:Si può parlare di concorrenza nel caso di:parallelismo reale di esecuzione (nel caso di sistemi parallelismo reale di esecuzione (nel caso di sistemi multiprocessore dove si possono eseguire multiprocessore dove si possono eseguire parallelamente un numero di processi pari al numero parallelamente un numero di processi pari al numero di processori)di processori)parallelismo virtuale di esecuzione (come nel caso del parallelismo virtuale di esecuzione (come nel caso del pipelining).pipelining).

WikipediaWikipedia

Page 3: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

Clonazione dei Clonazione dei processiprocessi

Linux ha ereditato da Unix la funzione Linux ha ereditato da Unix la funzione API fork che permette di clonare il API fork che permette di clonare il processo che la invoca.processo che la invoca.

Viene creato un nuovo processo con un Viene creato un nuovo processo con un PID (Process Identifier) differente.PID (Process Identifier) differente.

Le pagine di memoria del codice sono Le pagine di memoria del codice sono condivisecondivise

Le pagine di memoria dei dati sono Le pagine di memoria dei dati sono duplicateduplicate

Page 4: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

forkforkPer permettere di distinguere nel codice Per permettere di distinguere nel codice il Processo Padre dal Processo Figlio la il Processo Padre dal Processo Figlio la funzione fork restituisce un valore intero:funzione fork restituisce un valore intero:

<0 condizione di errore<0 condizione di errore

0 restituito al processo figlio0 restituito al processo figlio

>0 restituito al processo padre /è il PID del >0 restituito al processo padre /è il PID del figlio)figlio)

#include <unistd.h>#include <unistd.h>

Page 5: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

int pFiglio,pPadre,mioPID,s;int pFiglio,pPadre,mioPID,s;

pPadre = getpid();pPadre = getpid(); //PID del processo padre//PID del processo padre

printf(“PID padre %i”,pPadre);printf(“PID padre %i”,pPadre);

pFiglio = fork();pFiglio = fork();

if (pFiglio<0) //erroreif (pFiglio<0) //errore

return;return;

if (pFiglio>0) { //processo padreif (pFiglio>0) { //processo padre

… …

wait(&s);wait(&s); // attesa termine processo figlio// attesa termine processo figlio

return; }return; }

else {else { // processo figlio// processo figlio

mioPID = getpid();mioPID = getpid();

return; }return; }

Page 6: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

waitwaitLa funzione API wait attende la La funzione API wait attende la conclusione del processo figlioconclusione del processo figlio

L’argomento passato ritorna lo stato del L’argomento passato ritorna lo stato del figlio al momento della terminazione.figlio al momento della terminazione.

#include <sys/wait.h>#include <sys/wait.h>

Page 7: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

Evoluzione dei Evoluzione dei processiprocessi

Page 8: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

EsercitazioneEsercitazioneCaricare un array molto grande con valori Caricare un array molto grande con valori casuali poi visualizzare gli indici degli casuali poi visualizzare gli indici degli elementi con valore uguale a quello ricevuto elementi con valore uguale a quello ricevuto in inputin input

Il processo padre clona un processo figlio che Il processo padre clona un processo figlio che ricerca nella prima parte dell’array mentre il ricerca nella prima parte dell’array mentre il processo padre ricerca nella seconda parteprocesso padre ricerca nella seconda parte

L’output deve precedere il PID del processo e L’output deve precedere il PID del processo e l’indice dell’elementol’indice dell’elemento

Seconda versione ogni processo a sua volta Seconda versione ogni processo a sua volta esegue una fork per suddividere la ricerca esegue una fork per suddividere la ricerca con un ulteriore processo figliocon un ulteriore processo figlio

Page 9: Programmazione concorrente Linux. La concorrenza è una caratteristica dei sistemi di elaborazione nei quali può verificarsi che un insieme di processi

Copy on writeCopy on writePer ottimizzare la gestione della memoria Per ottimizzare la gestione della memoria e la velocità nell’esecuzione di una fork e la velocità nell’esecuzione di una fork (clonazione di un processo) le pagine (clonazione di un processo) le pagine della memoria non vengono inizialmente della memoria non vengono inizialmente duplicate.duplicate.

La copia di ogni dato avviene solo quando La copia di ogni dato avviene solo quando uno dei due processi (padre o figlio) lo uno dei due processi (padre o figlio) lo modifica e si rende quindi necessario modifica e si rende quindi necessario differenziare la copia relativa al processo differenziare la copia relativa al processo padre da quella relativa al figlio.padre da quella relativa al figlio.