Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
thread e parallelismo
Si consideri il programma C seguente (gli "#include" sono omessi):
/* constants */
#define DATA_SIZE 2
/* global variables */
char p = 0; P⇨O
int data_in [DATA_SIZE] = { 3, 7 }; dIn: 3,7
int data_out [DATA_SIZE]; doU: x,x
/* global mutex and semaphore variables */
sem_t sems [DATA_SIZE];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; m = 0
/* thread function */
void * th_fun (void * arg) {
/* local variable */
int r = *(int) arg;
/* data_out is updated to the rotated contents of data_in */
if (r == 0) data_out [0] = data_in [DATA_SIZE - 1]; /* stat. A */
else data_out [r] = data_in [r - 1]; /* stat. B */
pthread_mutex_lock (&mutex);
p++; /* stat. C */
pthread_mutex_unlock (&mutex);
sem_wait (&sems [r]); /* stat. D */
return 0;
} /* th_fun */
/* main thread */
int main (int argc, char ** argv) {
/* local variable */
int i; i =x
/* local thread id variable */
pthread_t th [DATA_SIZE];
for (i = 0; i < DATA_SIZE; i++) {
sem_init (&sems [i], 0, 0);
pthread_create (&th [i], NULL, th_fun, (void *) i);
} /* end for */
/* wait cycle */
while (p < DATA_SIZE);
for (i = 0; i < DATA_SIZE; i++) sem_post (&sems [i]); /* stat. E*/
for (i = 0; i < DATA_SIZE; i++) pthread_join (th [i], NULL);
} /* main */
Architettura dei calcolatori - E
1 / 29
09/10/12
s0 = x
s1 = x
th0 t h . f n (0) r = 0 dot: 7, lock (m) p++ unlock (m) wait (s0)
th1 h h . f n (1) r = 1 dout = ... , 3 lock (m) p++ unlock wait (s1)
Architettura dei calcolatori - E
2 / 29
09/10/12
Si completi
la tabella sotto riportata, indicando gli stati delle variabili GLOBALI (ovviamente tutte esistenti) negli istanti di tempo specificati. Lo stato di una variabile può essere indicato come:
- intero, carattere, stringa, quando la variabile ha valore definito
- X, quando la variabile non è stata ancora inizializzata
Se la variabile si può trovare in due o più stati, li si riporti tutti quanti. Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente successivo del thread indicato nella condizione stessa.
condizione variabili globali subito dopo statement A in ths [1] si consideri la prima iterazione del ciclo for ossia quando si ha i = 0- total: 0, 6, 24, 30
- percent: 0, 33, 66
- sem: 0, 1, 2
- total: 24, 30, 39, 65
- percent: 0, 33, 66
- sem: 0, 1, 2
- total: 6, 24, 30, 45
- percent: 0, 33, 66, 100
- sem: 0, 1, 2, 3
Si completi
la tabella sotto riportata, indicando se la variabile PUÒ non esistere negli istanti di tempo specificati (oltre magari a potere anche esistere e avere valori definiti). Si scriva così:
- NE, se la variabile può non esistere
- X, niente, se la variabile esiste con certezza
ATTENZIONE: non interessano i valori effettivi delle variabili, ma solo il loro status di possibile inesistenza. Si presti attenzione alla colonna “condizione”. In particolare, con “subito dopo statement X” si intende richiedere i valori che le variabili possono assumere tra lo statement X e lo statement immediatamente successivo del thread indicato nella condizione stessa.
condizione variabili locali dei thread subito dopo statement A in ths [1] si consideri la prima iterazione del ciclo for ossia quando si ha i = 0- sum in ths [0]: NE
- sum in ths [1]: 9
- sum in ths [0]: 6
- sum in ths [1]: NE
Architettura dei calcolatori - E
6 / 29
16/10/12
th1
lock B wait E wait C post C unlock B
th2
lock A "post" E lock B printf = e unlock B unlock A
th3
"post" E lock A unlock A lock B unlock B post c
Architettura dei calcolatori - E 11 / 29 09/10/12
(b)
A un certo istante to sono terminati, nell'ordine, gli eventi seguenti:
- P viene creato ("fork" di P ed "exec" di X)
- P esegue una "sbrk" di indirizzo massimo 4020 hex (virtuale assoluto)
- P esegue una "fork" e crea Q
- Q accede in lettura all'indirizzo 3432 hex (virtuale assoluto)
- Q accede a COND
situazione al tempo to
indirizzo fisico memoria fisica pagine allocate 0 CPO (DQ 1 2 PPQ MMU proc. NPV NPF valid bit 0 0 1 (1/2) DP2 1, 1 3 1, 1 4 G 1non pagine logiche/# di pagine virtuale
Q COND/6 5 1
Architettura dei calcolatori - E
16 / 29
30/10/12
Evento
(è preceduto dal processo nel cui contesto l'evento si verifica)
Informazioni aggiuntive
R ha esaurito il suo quanto di tempo
R < P < Q
Modulo del S.O. eseguiti per gestire l'evento
Processo / i nel cui contesto è eseguito ogni modulo
Stato dei processi dopo la gestione dell'evento
- P
- Q
- R
R: interrupt da orologio
- R < P
Q: exit
- R < P
v. AVVERTENZE
Attesa(E3) Non esiste Esec U
R: exit
la execl è già stata eseguita
TABELLA DI COMMUTAZIONE DEI PROCESSI
(fine)
Architettura dei calcolatori - E
21 / 29
06/11/12
b)
Durante l’esecuzione è stata osservata la seguente sequenza di chiamate di sistema: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Si indichi il contenuto delle tabelle seguenti, indicando la sequenza dei valori assunti fino alla conclusione di 12 (si scriva L oppure NE per indicare che una cella si è liberata oppure non esiste più):
tabella file aperti processo P tabella file aperti processo Q tabella file aperti processo R tabella globale dei file aperti file des. rif. riga file des. rif. riga file des. rif. riga riga posizione corrente n. di proc. I-number 0 X 0 X 0 X 0 X X X 1 X 1 1 X NE 1 X X X 2 X 2 2 X NE 2 X X X 3 3 3 3 3 NE 3 0,5 ★★★ ★★★ 4 L 4 4 X NE 4 0,9,12 ★★★ 18 5 5 5 5 5 NE 5 0,5,10 ★ 30✆ 6 6 6 6 6 6file des. rif. riga posizione corrente
Architettura dei calcolatori - E
26 / 29
13/11/12