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
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.
-
Architettura web/Architettura internet
-
Esame Svolti Laboratorio Architettura dei Calcolatori
-
Appunti Architettura dei calcolatori
-
Tesina Architettura dei calcolatori