logo
  • userLoginStatus

Welcome

Our website is made possible by displaying online advertisements to our visitors.
Please disable your ad blocker to continue.

Current View

Computer Engineering - Architettura dei Calcolatori e Sistemi Operativi

Full exam

Politecnico di Milano Dipartimento di Elettronica, Informazione e Bioingegneria prof.ssa Anna Antola prof. Luca Breveglieri prof. Roberto Negrini prof. Giuseppe Pelagatti prof.ssa Donatella Sciuto prof.ssa Cristina Silvano AXO – Architettura dei Calcolatori e Sistemi Operativi SECONDA PARTE di martedì 29 agosto 2017 Cognome ________________________ Nome _______________________ Matricola _____________________ Firma ___________________________ Istruzioni - Si scriva solo negli spazi previsti nel testo della prova e non si separino i fogli. - Per la minuta si utilizzino le pagine bianche inserite in fondo al fascicolo distribuito con il testo della prova. I fogli di minuta se staccati vanno consegnati intestandoli con nome e cognome. - È vietato portare con sé libri, eserciziari e appunti, nonché cellulari e altri dispositivi mobili di calcolo o comunicazione. Chiunque fosse trovato in possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande proposte – vedrà annullata la propria prova. - Non è possibile lasciare l’aula conservando il tema della prova in corso. - Tempo a disposizione 1 h : 30 m Valore indicativo di domande ed esercizi, voti parziali e voto finale: esercizio 1 (4 punti) _________________________ esercizio 2 (6 punti) _________________________ esercizio 3 (6 punti) _________________________ voto finale: (16 punti) ______________________ CON SOLUZIONI (in corsivo) AXO – SECONDA PARTE di 29 agosto 2017 – CON SOLUZIONI pagina 2 di 12 esercizio n. 1 – programmazione concorrente Si consideri il programma C seguente (gli “#include” e le inizializzazioni dei mutex sono omessi): pthread_mutex_t stop sem_t min, max int global = 0 void ∗ put (void ∗ arg) { pthread_mutex_lock (&stop) global = 1 /∗ statement A ∗/ sem_wait (&min) pthread_mutex_unlock (&stop) sem_wait (&min) sem_post (&max) /∗ statement B ∗/ return NULL } /∗ end put ∗/ void ∗ get (void ∗ arg) { if (arg == 2) global = 2 /∗ statement C ∗/ pthread_mutex_lock (&stop) sem_post (&min) sem_wait (&max) pthread_mutex_unlock (&stop) return arg } /∗ end get ∗/ void main ( ) { pthread_t th_1, th_2, th_3 sem_init (&min, 0, 0) sem_init (&max, 0, 1) pthread_create (&th_1, NULL, put, NULL) pthread_create (&th_2, NULL, get, 2) pthread_create (&th_3, NULL, get, 3) pthread_join (th_1, NULL) pthread_join (th_2, NULL) /∗ statement D ∗/ pthread_join (th_3, &global) return } /∗ end main ∗/ AXO – SECONDA PARTE di 29 agosto 2017 – CON SOLUZIONI pagina 3 di 12 Si completi la tabella qui sotto indicando lo stato di esistenza del thread nell’istante di tempo specif i- cato da ciascuna condizione, così: se il thread esiste, si scriva ESISTE; se non esiste, si scriva NON ESI- STE; e se può essere esistente o inesistente, si scriva PUÒ ESISTERE. Ogni casella della tabella va riempi- ta in uno dei tre modi (non va lasciata vuota). Si badi bene alla colonna “condizione”: con “subito dopo statement X” si chiede lo stato che il thread assume tra lo statement X e lo statement immediatamente successivo del thread indicato. thread condizione th_1 – put th_2 – get th_3 – get subito dopo stat. A ESISTE PUÒ ESISTERE PUÒ ESISTERE subito dopo stat. C in th_3 ESISTE PUÒ ESISTERE ESISTE subito dopo stat. D NON ESISTE NON ESISTE PUÒ ESISTERE Si completi la tabella qui sotto, indicando i valori delle variabili globali (sempre esistenti) nell’istante di tempo specif icato da ciascuna condizione. Il valore della variabile va indicato così: • intero, carattere, stringa, quando la variabile ha un valore def inito; oppure X quando è indef inita • se la variabile può avere due o più valori, li si riporti tutti quanti • il semaforo può avere valore positivo o nullo (non valore negativo) • una variabile mutex assume valore 0 per mutex libero e valore 1 per mutex occupato Si badi bene alla colonna “condizione”: con “subito dopo statement X” si chiede il valore (o i valori) che la variabile ha tra lo statement X e lo statement immediatamente successivo del thread indicato. variabili globali condizione min max global subito dopo stat. A 0 / 1 0 / 1 1 / 2 / 3 subito dopo stat. B 0 0 / 1 / 2 1 / 2 / 3 subito dopo stat. C in th_3 0 / 1 0 / 1 0 / 1 / 2 Il sistema può andare in stallo ( deadlock ), con uno o più thread che si bloccano, in tre casi diversi (con deadlock si intende anche un blocco dovuto a un solo thread che non potrà mai proseguire). Si indichi- no gli statement dove avvengono i blocchi: caso th_1 – put th_2 – get th_3 – get 1 1a wait min lock lock 2 lock wait max - 3 lock - wait max AXO – SECONDA PARTE di 29 agosto 2017 – CON SOLUZIONI pagina 4 di 12 esercizio n. 2 – gestione dei processi prima parte – stati dei processi // programma PROG_X.c main ( ) { i = 1; while (i