Risposte esempi di domande per esame orale

Domanda 1
...

In riferimento alle caratteristiche del livello ISA. Descrivere:

  • Cosa si intende per “modalità di indirizzamento”?
  • La differenza tra ordinamento little endian e big endian dei byte all’interno di una parola;
  • Nell’architettura RISC-V, quali sono i tipi di registri? Perché ci sono diversi tipi?
Modalità di indirizzamento
...

Per modalità di indirizzamento si intende il modo in cui è possibile specificare l'indirizzamento di un registro, una costante, un valore immediato, o un area di memoria.
in RISC-V ci sono essenzialmente quattro modalità di indirizzamento:

  • modalità di indirizzamento relativa al PC, in questo caso il campo immediato rappresenta un offset (una costante contenuto nell'istruzione stessa) a cui, al verificarsi di una certa condizione, il PC deve saltare, in questo contesto la costante viene prima estesa e poi shiftata a sinistra di 1;
  • modalità di indirizzamento con base e offset, anche in questo caso il campo immediato rappresenta un offset (una costante contenuta nell'istruzione stessa), ma questa volta viene sommato al contenuto di un registro (operando) che contiene l'indirizzo base;
  • modalità di indirizzamento immediato, in questo caso il campo immediato rappresenta una costante che fa parte dell'istruzione stessa;
  • modalità di indirizzamento tramite registro, l'operando è un registro.
Differenza little endian e big endian
...

Little endian e big endian sono due convenzioni diverse di rappresentare i byte in memoria.
Nel caso di little endian il byte meno significativo del dato è rappresentato nell'indirizzo di memoria più basso, mentre nel caso di big endian il byte meno significativo è rappresentato nell'indirizzo di memoria più alto.

Tipi di registri e funzionamento
...

In RISC-V vi sono diversi tipi di registri:

  • registri temporanei (t)
  • registri di tipo s
  • registri di tipo a
  • registro zero che è sempre 0
    I registri hanno ognuno uno scopo diverso.
    Il motivo per cui ce sono diversi è a scopi di convenzione.
    I registri di tipo a per esempio vengono utilizzati per passare dei parametri ad una procedura chiamata o per il valore di ritorno (registro a0). Mentre i registri t e di tipo s, vengono utilizzati come registri di appoggio nello sviluppo di procedure. I registri, nel caso di chiamate a procedura, seguono altre convenzioni, dette convenzioni di chiamata. Se una funzione è stata chiamata può utilizzare i registri di tipo t senza preoccuparsi di salvarli, tuttavia, se eventualmente chiama un'altra procedura, deve salvare eventuali informazioni interessanti contenute sui registri t. Mentre i registri di tipo a e s devono essere salvati (e in tal caso ripristinati) dalla funzione chiamata.

Domanda 2
...

Si consideri l’architettura RISC-V.

  • Si descriva il ciclo di aggiornamento del Program Counter.
  • Si spieghi come deve essere configurato il datapath (percorso dei dati) per l’esecuzione dell’operazione “beq x11, x12, LABEL”.
Aggiornamento PC
...

Abbiamo considerato che le istruzioni di RISC-V sono di 32 bit, ovvero di 4 byte.
Il PC per saltare all'istruzione successiva deve aggiorna l'indirizzo del PC aggiungendo di volta in volta 4 byte.
Il PC è un registro che punta all'indirizzo della memoria delle istruzioni.
Quando viene prelevata una istruzione ad un certo indirizzo e il PC deve passare alla prossima istruzione somma all'indirizzo attuale cui il PC sta puntando 4 byte.
Il PC normalmente si aggiorna in questo modo, a meno che non si verifica una operazione come un salto condizionato, o un'eccezione, o una chiamata a procedura, eccetera.
Il PC salta sempre a indirizzi di memoria pari proprio per questo motivo.

Datapath per esecuzione di operazione di salto condizionato
...

Il datapath, per effettuare una operazione di salto condizionato, deve avere un PC, una ALU, un modulo di estensione del segno e un modulo per effettuare una operazione di shift a sinistra.
Dovendo saltare sempre ad indirizzi pari, è certo che l'ultimo bit è sempre 0, poiché si tratta di un numero pari, allora ciò ci consente, grazie allo shift a sinistra, di effettuare salti relativi al PC più ampi, avendo di fatto a disposizione 13 bit e non solo i 12 del campo immediato. Il campo immediato "conta" il numero di istruzioni tra quella corrente e quella in cui è posta l'etichetta a cui saltare. In realtà chi ha progettato RISC-V ha previsto che l'architettura possa fare uso anche di istruzioni a 2 byte, per cui vengono contate le half-word tra l'istruzione corrente e quella a cui saltare, tale numero è posto nel campo immediato e viene, nel caso in cui la condizione per il salto si verifica, shiftata di 1 a sinistra. Per rendere possibile il salto la ALU deve rendere disponibile l'operazione di slt, in cui viene effettuata la differenza tra due registri operandi passati, viene controllato se il risultato di tale sottrazione è 0, in tal caso viene posta a 1, una certa uscita (chiamata zero) dell'ALU che indica che gli operandi passati sono uguali.


Domanda 3
...

In riferimento alla traduzione di programmi:

  • Perché non basta una sola lettura del codice sorgente (passata) da parte di un assemblatore?
  • A cosa serve la tabella degli opcode ad un assemblatore?
  • Cosa sono forward e backward references?
Assemblatore a due passi
...

Non basta una sola lettura del codice sorgente da parte di un assemblatore poiché è vero che il linguaggio assemblativo è strettamente connesso all'ISA di una architettura, tuttavia, il linguaggio assemblativo presenta delle semplificazioni, esse sono per esempio il fatto che è possibile piazzare delle etichette in diverse parti del codice, o l'utilizzo di pseudo-istruzioni.

Nella prima passata, infatti l'assemblatore, crea una tabella dei simboli che riempie man mano con i simboli che trova nel corso della lettura del codice in linguaggio assemblativo, a questi simboli associa quelli che vengono chiamati ILC ovvero instruction location counter.
Nella tabella alla fine avremo tra le altre cose, le ILC associati ai loro indirizzi.

Nella seconda fase effettua la vera e propria traduzione, guardando la tabella dei simboli creata al passo 1, e guardano la tabella degli opcode per sostituire il nome delle istruzioni con il loro codice operativo.

Tabella degli opcode
...

Risposta inclusa nella domanda precedente.

Forward e backward reference
...

Sono i punti del programma in cui ci si riferisce a punti successivi del programma (forward reference) o a punti precedenti del programma (backward reference).


Domanda 4
...

In riferimento ai bus:

  • Come interagiscono un dispositivo attivo e uno passivo in una comunicazione tramite bus asincrono?
  • Perché l’arbitraggio di un bus è necessario?
  • Si spieghi cos’è l’arbitraggio di un bus con meccanismo daisy chain.
Interazione dispositivo attivo-passivo in un bus asincrono
...

Un dispositivo attivo è un dispositivo che effettua delle richieste.
Un dispositivo passivo le prende in carico e le esaudisce.
In un bus asincrono, non vi è il clock.
Quando un dispositivo attivo richiede dei dati sul bus, effettua la richiesta, il dispositivo passivo la prende in carica, nel frattempo il dispositivo attivo esegue altre operazioni, quando il dispositivo passivo ha reso disponibili i dati, segnala al dispositivo attivo che essi sono pronti sul bus, il dispositivo attivo li preleva e il dispositivo attivo comunica di aver completato la consultazione di tali dati sul bus, inviando un altro segnale al dispositivo passivo che li elimina dal bus.
Questo tipo di comunicazione è detta full-handshake.

Arbitraggio del bus
...

L'arbitraggio di un bus si rende necessario poiché ci possono essere dei moduli che condividono lo stesso bus. Dunque serve un meccanismo di arbitraggio che "concede" il bus ai moduli che lo richiedono.

L'arbitraggio del bus più semplice (centralizzato), si basa su un dispositivo, appunto l'arbitro, connesso a due linee: linea di request e linea di grant. I moduli sono connessi ad entrambe le linee e le condividono entrambe.
Quando un dispositivo richiede il bus, l'arbitro lo concede, con la linea di grant.
Come abbiamo detto i moduli condividono le linee, in particolare quella di grant.
Immaginando di avere 3 dispositivi in catena, se il dispositivo 2 richiede il bus, il bus viene reso disponibile, prima di raggiungere il dispositivo 2 c'è l'1, che non avendo richiesto lo rifiuta, così può utilizzarlo il dispositivo 2.
Se 1 e 2 richiedono il bus insieme, la linea di grant tocca prima al dispositivo 1, il 2 deve attende che esso completi il suo lavoro sul bus.
Questo tipo di bus è chiamato daisy chain.

La daisy chain può avere più linee di grant e di request, stabilendo così dei livelli di priorità.

Daisy chain
...

Risposta inclusa nella domanda precedente.


Domanda 5
...

In riferimento alle operazioni di Input/Output:

  • Cos’è un driver?
  • Descrivere l’I/O basato su DMA.
  • Descrivere l’I/O basato su busy waiting.
  • Descrivere l’I/O basato su interrupt.
Driver
...

Un driver è un componente software del sistema operativo che consente l'interfacciamento tra il sistema operativo e il dispositivo di I/O collegato al computer.

I/O basato su DMA
...

DMA è l'acronimo di Direct Memory Access, come lascia intuire il nome stesso, DMA è la modalità con cui un dispositivo comunica direttamente con la memoria, senza passare dalla CPU. Tale comunicazione è resa possibile grazie ad un controller, la DMA engine, che è un componente solitamente posizionato all'interno del dispositivo che sfrutta questo modalità di comunicazione con la memoria. Si è reso necessaria questa modalità, per esempio nel contesto delle schede di rete, dato che vi sono moltissime informazioni in entrata e in uscita da una scheda di rete, si rischia che il processore si sovraccarichi e che si dedichi principalmente a quel dispositivo, allora in un contesto del genere entra il gioco il DMA.

I/O basato su busy waiting
...

La busy waiting si verifica nel momento in cui la CPU richiede un dato, che per esempio la memoria deve rendere disponibile. La memoria essendo più lenta del processore impiega diverso tempo a rendere disponibile il dato, la CPU, mediante delle richieste continue, attende fino a che il dato non è disponibile. L'attesa è attiva poiché di continuo controlla la disponibilità del dato, e non fa nient'altro, sprecando cicli di clock in cui potrebbe fare altro. Una soluzione è l'I/O basato su interrupt.

I/O basato su interrupt
...

Quando la CPU richiede un dato alla memoria, non attende, ma continua ad eseguire altre operazione, la memoria quando ha prelevato il dato e lo ha reso disponibile invia un segnale di interrupt alla CPU, comunicando che il dato adesso è disponibile. In questo modo si evita l'attesa attiva.


Domanda 6
...

Si considerino i seguenti due frammenti di pseudo-codice:

// CODICE 1
const int N = ...;  
int X[n], Y[N]; // (sizeof(int) = 1 parola)  
for (int i=0; i<N; i++)  
    Y[i] = X[i] + i;  
  
// CODICE 2:  
const int N = ...;  
int X[N], Y[N]; // (sizeof(int) = 1 parola)  
for (int i=0; i<N; i++)  
    Y[i] = X[0] + i;
  • Si illustrino, in generale, i concetti di località spaziale e temporale nell’esecuzione dei programmi.
  • Quale dei due frammenti di codice esibisce maggiore località di ciascun genere?
  • Cosa succede nel caso in cui il processore voglia accedere ad una parola di memoria già presente nella cache? E cosa succede nel caso in cui non sia presente?
  • Quali parametri si devono considerare per valutare le prestazioni delle memorie cache?
Località spaziale e temporale
...

La località spaziale è il principio secondo cui se si effettua l'accesso ad un indirizzo di memoria, allora nel corso di breve tempo, con molta probabilità potrebbe essere necessario accedere ad indirizzi vicini.

Invece la località temporale è il principio secondo cui se si effettua l'accesso ad un indirizzo di memoria, allora nel corso di breve tempo, con molta probabilità potrebbe essere necessario accedervi nuovamente.

Tra i due frammenti di codice, quale esibisce più località di ciascun genere?
...

II primo pezzo di codice è un for in cui si accede a posizioni contigue delle memoria. Quindi si tratta di un esempio di località spaziale.

Mentre il secondo accede sempre alla stessa posizione (0) della memoria. Quindi si tratta di un esempio di località temporale.

Hit e miss della memoria cache
...

Se una word si trova in memoria cache, allora essa viene fornita al processore a seguito di una sua richiesta. Questa è una hit.

Se una word non si trova in memoria cache, allora esse viene richiesta alla memoria principale, portata in memoria principale e poi fornita alla CPU, tale operazione è più costosa, ma per i principi di località temporale e spaziale, è probabile che si avrà risparmio in termini di tempo, nelle richieste successive del processore. Questa è invece una miss.

Parametri di valutazione efficienza memoria cache
...

In maniera molto generale bisogna controllare le informazioni relativi al miss rate e hit rate.
Il miss rate è la frequenza con cui una word non viene trovata nella cache.
Lo hit rate è la frequenza con cui una word viene trovata nella cache.

Altri parametri possono essere la mappatura dei blocchi: mappatura diretta, associativa e cache set-associative.

La politica di sostituzione dei blocchi.
La politica di scrittura: write through e write back. Il primo, quando deve essere scritto un dato in cache, il dato viene modificato in cache e in memoria principale (più lento). Mentre con write back, il dato viene modificato solo in memoria cache e non viene modificato il dato nella memoria principale fino a che non deve verificarsi una sostituzione di blocco (più veloce, ma più complesso da implementare).