Anteprima
Vedrai una selezione di 7 pagine su 29
Architettura dei calcolatori - Esercitazioni Pag. 1 Architettura dei calcolatori - Esercitazioni Pag. 2
Anteprima di 7 pagg. su 29.
Scarica il documento per vederlo tutto.
Architettura dei calcolatori - Esercitazioni Pag. 6
Anteprima di 7 pagg. su 29.
Scarica il documento per vederlo tutto.
Architettura dei calcolatori - Esercitazioni Pag. 11
Anteprima di 7 pagg. su 29.
Scarica il documento per vederlo tutto.
Architettura dei calcolatori - Esercitazioni Pag. 16
Anteprima di 7 pagg. su 29.
Scarica il documento per vederlo tutto.
Architettura dei calcolatori - Esercitazioni Pag. 21
Anteprima di 7 pagg. su 29.
Scarica il documento per vederlo tutto.
Architettura dei calcolatori - Esercitazioni Pag. 26
1 su 29
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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
subito dopo statement B in ths [2]
  • total: 24, 30, 39, 65
  • percent: 0, 33, 66
  • sem: 0, 1, 2
subito dopo statement C in ths [0]
  • 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
subito dopo statement C in ths [0]
  • 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:

  1. P viene creato ("fork" di P ed "exec" di X)
  2. P esegue una "sbrk" di indirizzo massimo 4020 hex (virtuale assoluto)
  3. P esegue una "fork" e crea Q
  4. Q accede in lettura all'indirizzo 3432 hex (virtuale assoluto)
  5. 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 1

non 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 6

file des. rif. riga posizione corrente

Architettura dei calcolatori - E

26 / 29

13/11/12

Dettagli
Publisher
A.A. 2011-2012
29 pagine
4 download
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Dolceck di informazioni apprese con la frequenza delle lezioni di Architettura dei calcolatori e sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Milano o del prof Pelegatti Giuseppe.