Questions Flashcards
Cosa sono le API?
Sono interfacce offerte dal SO ai programmi di alto livello per utilizzare le system call.
Le system call cambiano da SO a SO, quindi cambiano le implementazioni delle funzioni API per adattarle al SO, ma i nomi delle funzioni rimangono gli stessi.
A cosa serve in comando ‘strace’ da linea di comando?
Serve a vedere quali system call sono usate da un programma in esecuzione.
Descrivere gli step del modello di compilazione per il C.
Preprocessor: processa le direttiva al preprocessore ed elimina i commenti.
Compiler: prende in input l’output del preprocessore e lo trasforma un modulo oggetto
Assembler: trasforma il codice assembly in codice oggetto.
Linker: prende in input i file oggetto e li collega per generare file eseguibile
Definire i vari tipi di variabile.
Locali: la durata di vita è pari alla durata di vita del blocco di istruzioni in cui è dichiarata.
Formali: variabili passate agli argomenti delle funzioni.
Globali: dichiarate fuori dalle funzioni, possono essere accedute da tutte le funzioni di quel file e da tutte quelle in altri file in cui esiste una dichiarazione extern per la stessa variabile.
Per proteggere la variabile da accessi esterni necessita di dichiarazione static
Cos’è una struttura dati pacchettizzata.
È una struttura che evita lo spreco in memoria di spazio, occupando solo lo spazio necessario per contenere i singoli membri della struttura e non a multipli di WORD
Una stessa struttura dati ha la stessa dimensione in tutti i processori?
Perché?
No, dipende, quanto sono grandi i tipi di dato di quel processore e da se è pacchettizzata o meno
In un programma C scrivo una funzione in cui dichiaro un vettore di elementi i cui elementi sono un tipo di struttura dati ‘struct A’.
Guardando come viene allocato in memoria quel vettore, può accadere che tra un elemento ed il successivo, dello stesso vettore, ci siano byte non occupati dalla struttura dati di tipo ‘struct A’? Perché?
Sì, se la sua dimensione è un multiplo di WORD, ovvero se la struttura dati non è pacchettizzata
In linguaggio C, se un programma è costituito da più moduli, è possibile che una stessa funzione sia implementata in due diversi moduli senza che provochi un errore nella generazione del programma eseguibile? Perché?
No, in fase di Linking viene segnalata una ridefinizione.
Lascia però compilare perché il modulo singolarmente è valido.
Però se in uno dei due moduli tale funzione è dichiarata static, non è una ridefinizione, poiché static rende la funzione invisibile agli altri moduli
A cosa serve l’opzione -I del preprocessore e -L e -l del compilatore?
-I specifica il percorso dei file.h.
-L specifica il percorso delle librerie fornite dall’utente.
-l ‘nomedellalibreria’ specifica di utilizzare la libreria indicata dal nome ristretto ‘nomedellalibreria’’
Differenza tra librerie statiche e librerie dinamiche.
Librerie statiche: collegate al programma prima della sua effettiva esecuzione, nella fase di preprocessing dove prendere il file.h e lo copia dove c’è l’include.
Librerie dinamiche: collegate in due fasi.
La prima controlla che si possano collegare le librerie richieste al programma (compiler time).
La seconda a run time, un programma dedicato le carica in memoria e le collega al programma in esecuzione.
Cos’è un target fittizio?
Un target fittizio, detto ‘.phony’, è un target che non è un file e ha come scopo solo l’esecuzione di una sequenza di azioni.
Bisogna indicarli in fondo al Makefile ed elencarli come:
.PHONY: nomi-target.
Organizzazione della memoria usata dalla parte utenti dei processi.
Stack: contiene i record ti attivazione delle chiamate a funzione
Heap: contiene la parte di memoria allocata dinamicamente.
Data: contiene le variabili globali.
Text: contiene il collegamento alle istruzioni macchina
Che cos’è un task?
È il contesto in cui vengono eseguiti i processi.
Ogni processo ha un proprio task .
Un task mantiene in memoria lo stato di esecuzione di un processo, le informazioni sui segmenti di memoria utilizzati, e sul valore corrente dei registri principali.
Un task può avere più stack a sua disposizione?
Perché sì o perché no?
Sì, ogni livello di privilegio del SO gode di uno stack di esecuzione, in questo modo, ogni livello viene mantenuto come componente atomico che non influenza gli altri.
Perché ogni task viene differenziato nei vari livelli a cui opera. (così operazioni indipendenti non interferiscono tra loro)
Che differenza c’è un programma è un processo?
Un processo è l’istanzazione in memoria di un programma.
Un programma può essere:
-un file binario eseguibile
-un processo
-una applicazione
Inoltre un processo è un’entità attiva mentre un programma un’entità passiva
Quanti stack ha a disposizione un processo?
Ha a disposizione uno stack per ogni livello di privilegio del kernel(4) più uno per ogni thread del processo.
Cos’è una system call?
È una chiamata a sistema, quando un processo deve effettuare una operazione per cui non ha i permessi effettuato una chiama al SO il quale prende il controllo, cambia i livelli di sicurezza del processore, effettua l’operazione, dopodiché ristabilisce il ring di sicurezza precedente e restituisce il controllo al processo che aveva effettuato la system call
Descrivi il meccanismo delle system call.
Una system call è implementata nella routine di gestione di un certo interrupt n.
Viene invocata eseguendo una istruzione INT n.
Interrupt ed eccezioni
Le eccezioni sono sincrone rispetto alla CPU:
-TRAP: l’istruzione viene sospesa e portata a buon fine solo dopo la gestione del trap
-FAULT: l’istruzione viene interrotta, gestita l’eccezione e poi rieseguita l’istruzione dall’inizio.
-ABORT: viene causata da un errore irrimediabile, quindi l’istruzione viene abortita ed il processo killato.
Gli interrupt posso essere sincroni o asincroni (dovuti dall’hw), mascherabili e non mascherabili
Differenza tra interrupt sincroni e asincroni.
Sincroni (sw) sono chiamati dalla CPU, gli asincroni (hw) sono scatenati da periferiche che mediante il BUS avvisa la CPU che è avvenuto qualcosa da gestire
Disegnate il diagramma di stato dei processi.
Lo scheduler processa le richieste di accesso ad una risorsa condivisa, ossia stabilisce un ordine per l’esecuzione di tali richieste.
Lo scheduler a longo termine seleziona i processi che possono entrare nella ready queue.
Lo scheduler a breve termine seleziona quali processi posso passare dallo stato di ready allo stato di running.
New->(loader lo carica)->Ready->Esecuzione –>exit–>termina
Nella bash, qual è la differenza tra variabili locali e variabili d’ambiente?
Le variabili locali sono visibili solo dalla Shell che le ha create, le variabili d’ambiente vengono ereditate dalle subshell, se la subshell le modifica non vengono modificata quelle del padre, ma solo la copie ereditate
Nella bash qual è la differenza tra una variabile vuota ed una variabile che non esiste?
È possibile eliminare una variabile?
Variabile vuota, ovvero che non è inizializzata, se non esiste vuol dire che non è stata creata
Per eliminare una variabile con il comando ‘unset nomevariabile’
Cos’è la funzione di autocompletamento della bash?
Funzionalità per facilitare l’inserimento dei comandi.
Basta scrivere le prime lettere del comando e poi premere TAB.
Che cos’è un thread?
È un flusso di esecuzione all’interno di un processo che lo scheduler può fare eseguire separatamente e concorrentemente con il resto del processo.
Ogni thread di uno stesso processo condivide le risorse del processo.
(Es. Variabili globali)
Che cos’è l’errore errno?
È una variabile numerica(di un thread)
che contiene il tipo di errore che è stato provocato per ultimo/dall’ultima istruzione.
Spiegare che cosa si intende quando si dice che una sequenza di istruzioni viene eseguita in maniera atomica.
Vuol dire che una sequenza di istruzioni viene eseguita per intero oppure non viene proprio eseguita.
Se avviene un errore durante l’esecuzione si riparte da capo.
Il GCC fornisce alcune estensioni di C che permettono di eseguire in forma atomica alcune operazioni.
Cosa vuol dire che una funzione è thread safe?
Se non causa problemi nella scrittura/lettura di strutture dati interne al so e condivise dai thread di uno stesso processo.
Cosa si intende con Pthread?
È un thread conforme allo standard posix che si avvalgono di funzione mutex e condition variables
A cosa serve la funzione Pthread_join?
A liberare la memoria di un thread una volta che esso è terminato facendo sapere il proprio risultato.
Cos’è un pthread detached?
Un thread cmin gradi di liberare autonomamente la memoria una volta terminato, ma in questo modo non può fare sapere a nessuno il proprio risultato
Definire il busy waiting.
Si intende al continuo controllo da parte di un thread che un evento si verifichi per permettergli di proseguire restando in fase di waiting e non in wait.
Comporta lo spreco di tempo e prestazioni.
Definire deadlock.
Avviene quando due processi si bloccano a vicenda.
Definire starvation.
È l’impossibilità perpetua da parte di un processo di accedere ad una risorsa di cui necessità per essere eseguito.
Definire liveness.
La capacità di un programma concorrente di fare vivere e progredire i propri thread fink al compimento delle operazioni relative, evitando condizioni che possano determinare un blocco.
Spiegare cosa si intende con Race Condition
Si verifica in un sistema con processi e/o thread quando questo non gestisce in modo adeguato la mutua esclusione.
Il risultato finale dipende quindi dall’ordine in cui sono state eseguite le istruzioni.
Definire cosa fa la funzione cmpxchg con e senza il prefisso lock.
È l’equivalente della funzione ‘sync_bool_compare_and_swap’ in linguaggio assembly.
Se la variabile è diversa dal valore che gli si vuole assegnare le si assegna il nuovo valore, altrimenti nulla.
Il prefisso lock garantisce che per tutta la durata dell’esecuzione dell’istruzione nessuno acceda al bus, in modo che nessuno vada a modificare i registri che servono per la comparazione.
Cos’è la Futex?
Fast user Mutex, è una forma base della mutua esclusione e non è conforme a nessuno standard posix.