« /home/rc

pcad

17/08/2022

soluzioni del zanno

ESAME_2_Luglio_v2_con_soluzioni. (02/07/2018)

Nei modelli della concorrenza con consistenza sequenziale:

  1. Bisogna considerare sono le computazioni con scheduling dei thread basato su strategie preemptive F
  2. Tutti i thread vengono eseguiti almeno una volta F
  3. Viene garantita l’assenza di deadlock e l’assenza di starvation F
  4. Thread differenti non possono condividere il proprio stack V

Quando si utilizza un semaforo in un programma concorrente

  1. i thread possono ancora accedere simultaneamente alla propria sezione critica V
  2. l’accesso a dati condivisi da parte di più thread è sempre serializzato F
  3. un thread che esegue l’operazione down incrementa il contatore interno al semaforo di uno F
  4. è opportuno inizializzare il semaforo a 0 se si vuole puoi usare il semaforo come mutex F

Quando si utilizza un thread pool

  1. i thread eseguono task prelevandoli da uno stack F
  2. alla fine dell’esecuzione di un task il corrispondente thread rimane attivo V
  3. non bisogna preoccuparsi della gestione della garbage collection della memoria F
  4. non bisogna preoccuparsi della creazione dei thread V

Un Semaforo Generale

  1. è un semaforo il cui contatore interno può assumere un valore maggiore o uguale a zero V
  2. è implementato come un oggetto immutabile in Java F
  3. non può essere usato come campo di una concurrent HashMap F
  4. contiene al suo interno una coda di thread V

La tecnica di programmazione basata su confinamento per thread

  1. viene usata per ridurre l’uso di lock nei programmi concorrenti V
  2. viene usata per rendere efficiente la gestione della memoria nei programmi concorrenti F
  3. viene usata nell’implementazione di server multithreaded V
  4. viene usata nell’implementazione dei monitor alla Hoare F

Una barriera di memoria o memory fence

  1. risolve il problema della sezione critica F
  2. Viene sempre invocata alla fine di blocchi sincronizzati in Java V
  3. può essere usata per garantire mutua-esclusione in architetture debolmente consistenti V
  4. ha come effetto quello di disabilitare per più cicli di esecuzione tutte le interruzioni hardware F

Il problema della sezione critica

  1. si applica a programmi concorrenti qualsiasi F
  2. richiede di soddisfare almeno le proprietà di mutua esclusione e assenza di starvation V
  3. non richiede particolari assunzioni sulla struttura della sezione critica F
  4. è formulato per programmi concorrenti con un numero arbitrario ma finito di thread V

In un programma concorrente con un input fissato

  1. due diverse computazioni possono eseguire infinite volte la stessa istruzione V
  2. se una computazione termina allora tutte le possibili computazioni terminano F
  3. se una computazione non termina allora tutte le possibili computazioni non terminano F
  4. due computazioni diverse possono dare lo stesso risultato V

Nell’esecuzione di un programma concorrente

  1. tutti i thread lanciati da un programma partono sempre simultaneamente F
  2. i thread vengono eseguiti sempre in parallelo F
  3. non è possibile alternare context-switch di due diversi thread F
  4. il numero di context-switch non dipende dallo scheduler F

La libreria SynchronizeCollection di Java

  1. Viene usata per incapsulare strutture dati per renderle threadsafe V
  2. Viene usata come alternativa agli ExecutorService F
  3. Ha un metodo “wait” che viene usato per sincronizzare thread F
  4. Ha un metodo “notify” che viene usato per sbloccare thread in attesa F

ESAME_15_v2 (15/06/2018)

Nei modelli della concorrenza con consistenza forte (strong consistency):

  1. Vale sempre la single-thread rule F
  2. È possibile che istruzioni all’interno dello stesso thread vengano eseguite out-of-order F
  3. Non viene garantita la write-atomicity nelle operazioni di update F
  4. Thread differenti non possono modificare le stesse aree di memoria F

L’assenza di race-condition

  1. si ottiene dichiarando thread che non allocano dati sullo heap F
  2. si ottiene creando thread che allocano memoria solo attraverso variabili locali F
  3. si ottiene garantendo che i dati siano letti o modificati solo all’interno di singoli thread V
  4. si ottiene acquisendo lock su dati condivisi tra diversi thread V

Quando si utilizza un monitor alla Hoare in Java

  1. i thread non condividono memoria ma vengono usati solo per parallelizzare il calcolo F
  2. i context-switch avvengono solo all’uscita dal monitor F
  3. se un thread sospende l’esecuzione con “wait” entrerà nel monitor alla prima chiamata di “notify” F
  4. un thread prima di chiamare “wait” rilascia il lock sul monitor F

Un ReadWrite lock

  1. è un semaforo binario che viene usato su oggetti con metodi getter e setter F
  2. viene usato per garantire la mutua esclusione tra thread che aggiornano una variabile condivisa V
  3. viene usato per garantire la mutua esclusione tra thread che leggono una variabile condivisa F
  4. garantisce starvation-freedom se usato per controllare una risorsa condivisa V

Un Array CopyOnWrite in Java

  1. viene usato per ottimizzare le operazioni di update di celle di un array F
  2. implementa un’istanza del produttore-consumatore F
  3. fornisce solo operazioni thread-safe per modificare un array concorrente F
  4. implementa la tecnica dello snapshot per strutture dati concorrenti V

La tecnica di programmazione chiamata lock-splitting

  1. viene usata per includere in un singolo record diversi semafori binari F
  2. viene usata per massimizzare la concorrenza mantenendo consistenza dei dati V
  3. viene usata per minimizzare il numero di lock in un programma concorrente F
  4. viene usata nell’implementazione di liste concorrenti V

Le soluzioni al problema della sezione critica viste a lezione

  1. possono essere composte da thread che non usano mai la risorsa condivisa da proteggere F
  2. si possono implementare senza usare lock o altre istruzioni atomiche specifiche dell’hw V
  3. sono sempre corrette indipendentemente dall’architettura hw sottostante F
  4. dipendono dalla velocità nell’esecuzione dei diversi thread F

In un programma concorrente

  1. un errore su un certo input si può riprodurre ripetendo l’esecuzione una sola volta F
  2. la funzione calcolata dal programma associa ad un certo input un insieme di output V
  3. con lo stesso input posso avere un’esecuzione che termina e una che non termina V
  4. con lo stesso input posso avere un’esecuzione che termina e una che si blocca V

Nell’esecuzione di un programma concorrente

  1. i thread vengono sempre eseguiti su core diversi F
  2. i thread vengono sempre eseguiti in parallelo F
  3. non avvengono mai context-switch sullo stesso core F
  4. il numero di context-switch dipende dal numero di lock usati nel programma F

Consideriamo un programma concorrente con due thread T1 e T2

  1. servono almeno due lock per generare un deadlock nell’esecuzione di T1 e T2 F
  2. con un solo lock è possibile fare in modo che T1 venga eseguito tutto insieme prima o dopo T2 V
  3. servono almeno due lock per fare in modo che T1 venga sempre eseguito prima di T2 F
  4. il numero di possibili esecuzioni dipende solo dal numero di istruzioni che operano su dati condivisi F

Nella libreria RMI

  1. L’accesso ad un oggetto remoto è sempre thread-safe F
  2. Il registry viene gestito dallo stesso server che gestisce un oggetto remoto F
  3. Il registry serializza le chiamate dei metodi verso un oggetto remoto F
  4. L’implementazione di un’interfaccia remota deve essere la stessa su server e client F

ESAME_15_v3 (15/06/18)

Le domande di questo esame sono identiche a ESAME_15_v2, skip

Scritto 3 febbraio 2020

Un processo nei sistemi operativi:

  1. può condividere codice con altri processi V
  2. è un’unità di allocazione sia di risorse che di esecuzione V
  3. ha sempre accesso allo spazio di indirizzamento kernel F
  4. gestisce al più un program counter F

Si verifica sempre un context switch quando

  1. un processo ritorna da una chiamata di procedura F
  2. un processo ritorna da una chiamata di funzione F
  3. un processo esegue un metodo di un’oggetto condiviso F
  4. un processo esegue una routine di gestione di un’interrupt V

Un variabile condition

  1. si può usare solo dopo aver acquisto un lock V
  2. definisce una condizione che viene controllata in maniera atomica F
  3. mette in attesa il thread che invoca la corrispondente operazione signal F
  4. mette in attesa il thread che invoca la corrispondente operazione signal se ci sono altri thread in attesa F

Il Thread Pool

  1. è una struttura dati sincronizzata F
  2. è una struttura dati fornita a livello kernel F
  3. è stato introdotto per creare thread già forniti di lock di sincronizzazione F
  4. è stato introdotto per distinguere task e thread V

Nelle librerie per UI come Swing

  1. i singoli thread possono modificare campi delle strutture dati della UI V
  2. un gestore di UI (EDT) è un server multithreaded F
  3. ogni widget di una GUI è gestito da un diverso EDT F
  4. per default viene garantita la mutua esclusione nella modifica della UI F

Una Barriera di Memoria (Memory Fence)

  1. forza il completamento di operazioni di scrittura in attesa V
  2. forza la terminazione del thread che la esegue F
  3. è equivalente ad un lock F
  4. assicura l’assenza di starvation F

Soluzioni non ufficiali

01/07/19

Quando si utilizza una struttura dati concorrente

  1. per ogni accesso alla struttura viene garantita l’assenza di race condition V
  2. per ogni sequenza di accessi alla struttura dati viene garantita l’assenza di race condition V
  3. per ogni programma viene garantita l’assenza di race condition F
  4. per ogni operazione su un suo elemento (es un oggetto in una lista) viene garantita l’assenza di race condition F

Nei modelli della concorrenza con interleaving:

  1. vengono ammesse solo computazioni che rispettano program order V
  2. vengono ammesse solo computazioni ottenute eseguendo in blocco tutte le istruzioni di ogni singolo programma in un ordine casuale (es programma 2, programma 1, programma 3) F
  3. viene sempre garantita la mutua esclusione F
  4. il numero di context switch è limitato superiormente da una costante F

Una Synchronized Collection in Java

  1. è equivalente ad una barriera di memoria F
  2. rende sincronizzata una struttura dati non concorrente V
  3. implementa il pattern singleton in versione thread-safe F
  4. è un’implementazione della tecnica di confinamento per oggetto V

Un mutex

  1. è un semaforo con due possibili valori ed uno stack di thread in attesa F
  2. è un semaforo con tre possibili valori ed una coda di thread in attesa F
  3. viene usato per evitare riordinamenti di istruzioni in un thread F
  4. garantisce starvation-freedom se usato per controllare una risorsa condivisa V

Un’operazione atomica

  1. è sempre implementata tramite lock F
  2. non è compatibile con il modello di concorrenza basato su consistenza sequenziale F
  3. elimina possibili interferenze tra diversi thread fino alla fine della sua esecuzione V
  4. può utilizzare istruzioni hardware per garantire assenza di race condition V

Una barriera di sincronizzazione

  1. risolve il problema della sezione critica F
  2. può essere invocata alla fine di blocchi sincronizzati V
  3. definisce un punto di sincronizzazione all’interno di codice di singoli thread V
  4. ha come effetto quello di disabilitare le interruzioni hardware F

Il problema della sezione critica

  1. si applica a programmi che non condividono memoria F
  2. si risolve scegliendo in maniera casuale un thread (tra quelli in attesa) F
  3. si risolve applicando Peterson a due thread scelti casualmente (tra quelli in attesa) F
  4. è formulato per programmi concorrenti con due o più thread di esecuzione V

Quando usiamo oggetti callable in Java

  1. Le chiamate dei metodi corrispondenti possono restituire valori V
  2. Le chiamate dei metodi corrispondenti sono effettuate in mutua esclusione F
  3. Le chiamate dei metodi corrispondenti sono tutte effettuate in maniera sincrona F
  4. Non possiamo propagare le eccezioni al di fuori dei metodi corrispondenti F

14/06/19

Nei modelli della concorrenza con consistenza sequenziale:

  1. vengono ammesse solo computazioni terminanti F
  2. vengono ammesse esecuzioni concorrenti che non rispettano program order F
  3. viene sempre garantita l’assenza di deadlock F
  4. vengono ammesse esecuzioni concorrenti con interleaving di eventi di diversi thread V

La proprietà di write atomicity

  1. garantisce l’assenza di race condition F
  2. garantisce che le operazioni di scrittura su una struttura dati siano eseguite in maniera atomica V
  3. assicura che tutte le operazioni di scritture siano viste nello stesso ordine da tutti i thread V
  4. è sempre garantita in architetture debolmente consistenti V

Quando si utilizza una struttura dati concorrente

  1. per ogni accesso alla struttura viene garantita la mutua esclusione V
  2. per ogni sequenza di accessi alla struttura dati viene garantita la mutua esclusione V
  3. non bisogna preoccuparsi della de-allocazione della struttura dati F
  4. l’implementazione delle operazioni utilizza sempre un lock globale F

Una ConcurrentHashMap in Java

  1. non può essere usata in blocchi sincronizzati F
  2. fornisce metodi thread-safe per inserimento e ricerca V
  3. se usata in un programma concorrente garantisce l’assenza di race condition sui propri dati F
  4. è un’implementazione della tecnica di confinamento per thread F

Un reentrant lock

  1. è un semaforo usato per oggetti con metodi che restituiscono valori F
  2. viene usato per garantire la mutua esclusione tra thread con variabili condivise V
  3. viene usato per evitare deadlock in una chiamata ricorsiva V
  4. garantisce starvation-freedom se usato per controllare una risorsa condivisa V

Una barriera di memoria o memory fence

  1. risolve il problema della sezione critica F
  2. può essere invocata alla fine di blocchi sincronizzati V
  3. può essere usata per garantire mutua-esclusione in architetture debolmente consistenti V
  4. ha come effetto quello di disabilitare le interruzioni hardware F

Il problema della sezione critica

  1. si può applicare a programmi dove la sezione critica può contenere un programma qualsiasi F
  2. richiede di soddisfare solo le proprietà di mutua esclusione e assenza di starvation F
  3. è formulato per thread eseguiti tutti con la stessa velocità F
  4. è formulato per programmi concorrenti con al più due thread di esecuzione F

Quando usiamo oggetti runnable in Java

  1. Le chiamate dei metodi corrispondenti possono restituire valori F
  2. Le chiamate dei metodi corrispondenti sono effettuate in mutua esclusione F
  3. Le chiamate dei metodi corrispondenti sono tutte effettuate in maniera asincrona F
  4. Non possiamo propagare le eccezioni al di fuori dei metodi corrispondenti V

11/09/19

Un thread

  1. è una unità di allocazione e di esecuzione F
  2. non può condividere la memoria con altri thread F
  3. non può essere usato per eseguire una parte di un calcolo parallelo F
  4. permette l’esecuzione asincrona di funzioni e procedure V

Un context switch si può verificare

  1. quando un processo ritorna da una chiamata di procedura V
  2. quando un processo crea un nuovo thread V
  3. quando un processo termina un’altro processo V
  4. quando un processo esegue codice user V

Una Condition Variable

  1. va usata solo all’interno di operazioni del monitor in cui è definita F
  2. è una condizione che viene valutata in maniera asincrona rispetto al programma chiamante F
  3. gestisce code interne ad un monitor V
  4. garantisce write atomicity F

Una Barriera di Memoria (Memory Fence)

  1. forza la terminazione di tutti i thread in esecuzione tranne il main F
  2. forza la terminazione del main ma non di altri thread in esecuzione F
  3. controlla eventuali ottimizzazioni nella gestione della memoria V
  4. assicura l’assenza di starvation F

Il Thread Pool

  1. è una struttura dati sincronizzata F
  2. è stato introdotto nella programmazione concorrente per rendere più efficiente un programma V
  3. è stato introdotto nella programmazione concorrente per evitare possibili deadlock F
  4. è stato introdotto nella programmazione concorrente per eseguire blocchi di codice sincrono F

Un Reentrant Lock

  1. è stato introdotto nella programmazione concorrente come semaforo per oggetti di classe F
  2. viene usato per garantire la mutua esclusione tra thread con variabili condivise V
  3. viene usato per evitare deadlock in una chiamata ricorsiva di un metodo thread-safe V
  4. garantisce sempre starvation-freedom se usato per controllare una risorsa condivisa F

18/07/19

Un processo nei sistemi operativi:

  1. è un’unità di allocazione sia di risorse che di esecuzione V
  2. può condividere lo stack con altri processi F
  3. può essere usato per eseguire una parte di un calcolo parallelo V
  4. può essere eseguito in modalità user e modalità kernel V

Un context switch si può verificare

  1. quando un processo ritorna da una chiamata di sistema V
  2. quando un processo ritorna da una chiamata di funzione V
  3. quando un processo si sospende su un’operazione di I/O V
  4. Quando un processo esegue una routine di gestione di interrupt V

Un variabile condition

  1. si può usare in qualsiasi parte del codice F
  2. ha un’operazione di signal che è equivalente alla up dei semafori F
  3. è un flag di tipo Bool dichiarato volatile F
  4. garantisce write atomicity nei programmi dove viene usata F

Un Executor

  1. è un’implementazione di un monitor fornita da Java F
  2. viene usato per garantire la mutua esclusione tra thread con variabili condivise F
  3. viene usato per evitare deadlock F
  4. viene usato come costruttore di thread pool V

Una BlockingQueue in Java

  1. ha metodi thread safe V
  2. è una struttura dati sincronizzata V
  3. può essere usata per implementare un thread pool V
  4. non può essere usata come campo di una struttura dati sincronizzata F

Lo schema di codice in C

if (fork() != 0) {  } else { execve(command, parameters, NULL); }
  1. viene usato per creare un thread Unix/Linux F
  2. si può usare per assegnare un task ad un thread in Unix/Linux F
  3. si può usare per eseguire in parallelo due parti di codice V
  4. si può usare come blocco base per usare in maniera efficiente un’architetture multicore V