Architettura Orale Flashcards

1
Q

Quali sono i concetti fondamentali di un processore MIPS?

A

Il processore MIPS utilizza un set di istruzioni RISC (istruzioni semplici ad elevate prestazioni).
Tutte le istruzioni hanno 3 operandi.
La dimensione dei registri è di 32 bit.
Un gruppo di 32 bit è detto word.
L’assembler deve contenere le istruzioni per il trasferimento dei dati dalla memoria ai registri.
“Load” sposta un dato dalla memoria al registro, mentre “Store” trasferisce i dati dal registro alla memoria.
Le parole devono iniziare sempre a indirizzi multipli di 4 e questo requisito è detto vincolo di allineamento.
MIPS utilizza il posizionamento Big Endian, ovvero dal byte più significativo (a sx) a quello meno significativo, per specificare l’indirizzo della parola.

Esistono 3 formati di istruzioni:
R = per le operazioni aritmetico logiche; op(6 bit), rs(5 bit), rt(5 bit), rd(5 bit), shamt(5 bit), funct (6 bit);
I = per le operazioni immediate o di trasferimento; 32 bit: op(6 bit), rs(5 bit), rt(5 bit) e costante (16 bit);
J = per i salti, condizionati o meno; op e indirizzo di salto;

Ogni operazione aritmetica può eseguire una sola operazione e deve contenere esattamente 3 variabili.
Le istruzioni aritmetiche possono leggere nello stesso ciclo di clock due registri su cui eseguire le operazioni e scrivere i risultati.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Cosa differenzia ARM e MIPS?

A

Entrambi fanno parte della famiglia RISC.
MIPS ha 32 registri a 32 bit, mentre ARM ha 16 registri a 32 bit e non riserva un registro per il valore 0. Nella maggior parte delle architetture dei processori, è comune avere un registro specifico che è sempre impostato a zero. Questo registro è spesso utilizzato per operazioni di inizializzazione, calcoli e altre operazioni in cui è necessario avere un valore costante di zero. Tuttavia, nell’architettura ARM, non c’è un registro dedicato a questo scopo. In ARM puoi comunque settare un registro con il valore zero laddove ti serva.

ARM utilizza i condition code (cosa che un RISC non dovrebbe avere), ovvero ogni volta che viene fatto un confronto, vengono impostati dei bit che indicano se il risultato del confronto è uguale, maggiore o minore di zero e il risultato è codificato in una word di stato (registro interno al processore che si occupa delle informazioni delle operazioni interne).
Nei registri del processore MIPS, invece, non vengono salvati i risultati dei confronti.

L’utilizzo dei condition code non è buono in quanto se un processore è in grado di eseguire 2 o 3 operazioni contemporaneamente, quindi dispone di 2 o 3 ALU, è possibile effettuare più somme e ciascuna di essa tenterà di modificare i condition code.
Quindi un unico set di condition code non è sufficiente.
E’ meglio salvare, di volta in volta, il risultato in un registro separato e, quindi, eseguire queste operazioni in parallelo.

Una caratteristica eccellente di ARM è che ogni istruzione può essere condizionale, ovvero l’esecuzione dipende dal risultato di un confronto.
In questo modo si evitano i branch e quindi si impedisce al processore di fare delle previsioni.

MIPS ha 3 modalità di indirizzamento(tecnica utilizzata dai processori per accedere ai dati in memoria o ai registri), mentre ARM ne ha ben 9.
Uno di questi 9 consente di spostare il contenuto di un registro di un numero arbitrario di posizioni, quindi sommarlo al contenuto di un altro registro per formare un indirizzo e infine aggiornare il contenuto di un terzo registro con tale indirizzo.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Differenza tra processore MIPS e 0x86?

A

Nell’x86 le istruzioni dispongono di un solo operando che funge sia da sorgente che da destinazione, mentre MIPS e ARM consentono di averne due separati.
e le architetture dei processori che consentono due registri separati per gli operandi tendono ad essere più flessibili e meno vincolanti nell’utilizzo dei registri rispetto a quelle con un solo operando.

Un’ulteriore differenza è come le diverse architetture dei processori trattano gli operandi che sono memorizzati in memoria anzichè nei registri. Per capire meglio questa differenza, vediamo in MIPS e X86 le differenze:
- Architetture con operandi solo in registri MIPS:
Nelle architetture come MIPS, le istruzioni operano tipicamente su operandi che risiedono nei registri. Ciò significa che le istruzioni accedono direttamente ai dati memorizzati nei registri del processore per eseguire le operazioni.
- Architetture con operandi in memoria (x86 e altre):
In alcune altre architetture, come l’x86, è possibile utilizzare operandi direttamente dalla memoria principale, oltre che dai registri. Ciò significa che un’istruzione può accedere direttamente ai dati presenti in memoria e utilizzarli come operandi.

L’implementazione dell’x86 è più difficile, ma l’ampiezza del mercato delle loro CPU permette di avere più risorse per risolvere la loro complessità.
I componenti architetturali dell’x86 utilizzati più frequentemente sono più facili da implementare.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Quale è l’istruzione più lunga nel MIPS?

A

L’operazione più lunga nel MIPS è la “load” (caricamento di un dato dalla memoria in un registro) in quanto utilizza 5 unità funzionali in sequenza:

  • Memoria istruzioni: il primo passo coinvolge l’accesso alla memoria delle istruzioni, dove viene prelevata l’istruzione di “load” dal programma in esecuzione;
  • Register File: l’istruzione di “load” può contenere l’indirizzo di un registro all’interno del register file, indicando in quale registro il dato caricato dalla memoria dovrebbe essere memorizzato;
  • ALU: In alcuni casi, potrebbe essere necessario calcolare l’indirizzo effettivo nella memoria a cui accedere. L’ALU potrebbe essere coinvolta nel calcolo di questo indirizzo, ad esempio aggiungendo un offset ad un registro base;
  • Memoria dati: una volta calcolato l’indirizzo effettivo, l’operazione di “load” coinvolge l’accesso alla memoria dei dati. Il dato viene prelevato dalla memoria in base all’indirizzo calcolato;
  • Register File: infine, il dato caricato dalla memoria viene scritto nel registro specificato nell’istruzione di “load”;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Perchè i processori utilizzano la rappresentazione dei numeri in complemento a 2?

A

La rappresentazione in complemento a 2 è utilizzata per rappresentare numeri interi in informatica e sistemi digitali.
Un bit viene utilizzato per il segno del numero (0 positivo, 1 negativo) i restanti bit, invece, rappresentano la magnitudo del numero.

Questa rappresentazione ha alcuni vantaggi rispetto ad altre:
- Semplicità delle operazioni aritmetiche =
L’addizione e la sottrazione possono essere svolte utilizzando soltanto operazioni di bit a livello hardware il che le rende veloci ed efficienti;

  • Risparmio di spazio =
    Permette di rappresentare sia numeri positivi che negativi con lo stesso numero di bit, senza occupare spazio extra per il segno;
  • Compatibilità con la logica binaria =
    si adatta perfettamente alla logica binaria utilizzata nei circuiti elettronici dei processori.

Per ottenere la rappresentazione in complemento a 2 di un numero negativo si prende innanzitutto il numero in valore assoluto (bit di segno = 0), successivamente si prende il complemento ad 1 di ogni bit e si aggiunge 1 al risultato.

Nel caso di numeri positivi, il complemento a 2 è uguale alla rappresentazione segno-grandezza.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Rappresentazione normalizzata (numeri in virgola mobile)

A

Un numero in notazione scientifica è rappresentato da una cifra significativa (mantissa) e da una potenza di 10.
Se il numero non ha zeri significativi davanti la virgola, allora è normalizzato.

Nel caso di numeri binari, ovvero la cui base è 2, si parlerà di virgola binaria.
Per scrivere un numero binario normalizzato, occorre avere una base da aumentare o decrementare dello stesso numero di bit di cui il numero deve essere scalato, arrivando ad avere una sola cifra non nulla dopo la virgola.

L’aritmetica dei calcolatori che supporta tali numeri è detta aritmetica in virgola mobile poichè rappresenta numeri la cui virgola binaria non è fissa.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Perchè l’esponente della rappresentazione a virgola mobile non è mai rappresentato in complemento a 2?

A

L’esponente della rappresentazione a virgola mobile non è rappresentato in complemento a 2, ma tramite un formato di codifica chiamato “formato di codifica dell’esponente normalizzato”.

La scelta di rappresentare l’esponente dipende dall’esigenza e dalla precisione richiesta per le operazioni in virgola mobile.

L’esponente viene rappresentato come un intero codificato utilizzando un insieme di bit specifico.
La codifica dell’esponente normalizzato ha un valore di bias, cioè un numero che viene sottratto dall’esponente effettivo prima della codifica.
Questo valore di bias è scelto in modo da garantire sia la rappresentazione di numeri positivi che negativi.

La codifica dell’esponente normalizzato consente di effettuare rapidamente le operazioni di confronto e trasferimento di dati tra unità di elaborazione e di memoria utilizzando solo operazioni di bit a livello hardware.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Come capire se un numero in virgola mobile è più grande di un altro??

A

Basta confrontare le loro mantisse ed esponenti.
Il numero con la mantissa più grande è il maggiore.
Se le mantisse sono uguali, si confronterà l’esponente.

5) Come vengono scritti gli esponenti nella notazione in virgola mobile?
Gli esponenti in virgola mobile si rappresentano come potenza di 2 su 8 bit se a singola precisione, ma questo potrebbe causare problemi di overflow o underflow avendo un esponente relativamente limitato.

Nella notazione a virgola mobile a doppia precisione la rappresentazione è una potenza di 2 su 11 bit.
Questo fornisce un intervallo più ampio per l’esponente consentendo di evitare problemi di overflow e underflow.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Perchè l’uso della polarizzazione per l’esponente?

A

Lo Standard IEEE 754 prevede una rappresentazione dell’esponente in eccesso 127 per la singola precisione e 1023 per la doppia precisione.
Questa rappresentazione si applica attravero la “polarizzazione dell’esponente”.

La polarizzazione di 127 per la singola precisione significa che il valore reale dell’esponente viene traslato aggiungendo 127.
Viene usato 127 per la singola precisione perchè avendo 8 bit e volendo rappresentare sia i numeri negativi che positivi, il bit più significativo è utilizzato per indicare il segno.
Quindi l’intervallo di valori sarà compreso tra -126 e 127.
Se non si considera il segno, l’intervallo di valori sarà compreso tra 0 e 256.

Attraverso la polarizzazione dell’esponente si può fare in modo che il numero più grande sia pari a 11111111 e il più piccolo pari a 00000000.
Nel momento in cui si va a confrontare i due esponenti non occorre controllare il bit più significativo, ma semplicemente considerarli come due interi senza segno.

Es.
Polarizzazione a singola precisione (127), rappresentazione di -125:
-125 + 127 = 2 = 00000010

Polarizzazione a singola precisione (127), rappresentazione di 0:
0 + 127 = 127 = 01111111

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Cosa è la rappresentazione per eccessi? Perchè si usa questa e non il complemento a 2?

A

La differenza principale tra il complemento a 2 e la rappresentazione per eccesso è che il bit di segno viene invertito.
I numeri negativi sono ottenuti sommando il valore del numero stesso a un valore costante K.
Mappa i numeri negativi nell’intervallo da 0 a -1, mentre il complemento a 2 li mappa da -2^(l-1) a -1

Es.
Nel caso l=8, nella rappresentazione in complemento a 2 i numeri sono mappati nell’intervallo di valori -126 e 127, mentre nella rappresentazione per eccesso sono mappati da 0 e 255.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Perchè il processore utilizza la rappresentazione a 2 e non il “modulo e segno”??

A

Nel contesto della rappresentazione binaria è necessario utilizzare una convenzione per rappresentare il segno dei numeri.
In genere si utilizza il bit più significativo per indicare il segno.
Questo approccio è noto come modulo e segno.

Tuttavia presenta un problema quando si effettuano operazioni aritmetiche come l’addizione.
I numeri negativi, infatti, devono essere trattati con opportune operazioni speciali per essere sommati correttamente.
L’anteposizione di un semplice bit 1 per rappresentare un numero negativo non basta per compiere una addizione diretta.

Nel complemento a due, la rappresentazione dei numeri negativi è ben diversa dall’anteporre un semplice bit 1.
Questo permette al processore di sommare direttamente i numeri.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Cos’è la pipeline?

A

La pipeline sfrutta il principio del parallelismo tra le istruzioni.

Consiste nel suddividere l’esecuzione di un’istruzione in fasi, ciascuno dei quali esegue una parte specifica dell’istruzione.
Gli stati sono 5:
1. Fetch dell’istruzione: l’unità di controllo del processore preleva l’istruzione successiva dalla memoria istruzioni;
2. Lettura dei registri: qui vengono letti i registri coinvolti nell’istruzione, ad esempio i registri sorgente necessari per eseguire un’operazione;
3. Esecuzione di un’operazione: l’operazione specificata dall’istruzione viene effettivamente eseguita;
4. Accesso ad un operando della memoria: viene calcolato l’indirizzo effettivo di memoria per recuperare o memorizzare dati dalla/nella memoria principale;
5. Scrittura del risultato in un registro: il risultato dell’operazione viene scritto nel registro appropriato;

Esistono 2 modi per aumentare il parallelismo:
- Aumentare la profondità delle pipeline in modo da sovrapporre più istruzioni nel tempo; Aumentando la profondità della pipeline, si aumenta il numero di fasi in cui l’istruzione viene suddivisa. Questa consente di suddividere il percorso di esecuzione in un’unità più piccole e svolgere più istruzioni contemporaneamente, ognuna in una fase diversa.

  • Replicare i componenti interni del calcolatore per eseguire più istruzioni in ogni stadio della pipeline, detta anche esecuzione parallela (multiple-issue); Questo può essere fatto duplicando o replicando le unità funzionali interne come ALU ecc.

Esistono anche 2 metodi per realizzare processi a esecuzione parallela:
- “Parallelizzazione statica”: le decisioni vengono prese durante la fase di compilazione, ovvero prima che il programma venga effettivamente eseguito. Il compilatore, quindi, ristruttura il codice in modo da suddividerlo in porzioni che possono essere eseguite in parallelo.

  • “Parallelizzazione dinamica” che avviene durante l’esecuzione, cioè le decisioni sono prese in base alle condizioni attuali;

La “speculazione” è un metodo per scoprire e sfruttare al massimo il parallelismo.
Consiste nello scoprire le caratteristiche di una istruzione per avviare l’esecuzione di altre istruzioni che dipendono da quella istruzione.
Poichè la predizione può essere sbagliata occorre un meccanismo per verificarne la correttezza e correggere gli errori.
La speculazione può essere fatta dal compilatore riordinando le istruzioni o dal processore stesso durante l’esecuzione.

La speculazione può essere:
- “Software” e quindi il compilatore controlla la corretta speculazione e fornisce una procedura di riparazione in caso di errore;
- “Hardware” mantiene i risultati di speculazione in un buffer e li scrive nei registri o nella memoria solo se la speculazione è corretta.
In caso contrario, l’Hardware scarta i risultati.

MIPS è stata progettata per sfruttare al meglio le potenzialità della pipeline, anche se la si trova in tutti i calcolatori.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Che effetto ha l’istruzione più lunga sulla pipeline?

A

Il ciclo di clock è la misura che quantifica il tempo all’interno di un processore.
Rappresenta il tempo impiegato per eseguire un’operazione elementare nel processore.
Il ciclo di clock, quindi, deve essere progettato affinchè dia abbastanza tempo all’istruzione più lunga del set di istruzioni del processore di essere eseguita.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Cosa sono gli Hazard?

A

Gli Hazard si riferiscono alle situazioni in cui l’esecuzione corretta delle istruzioni può essere ritardata a causa di dipendenze tra istruzioni o risorse limitate, che possono verificarsi quando più istruzioni vengono eseguite in parallelo attraverso diverse fasi della pipeline. Gli hazard possono causare ritardi nell’esecuzione delle istruzioni e possono impattare le prestazioni complessive del processore. Ci sono tre tipi principali di hazard:

  • Hazard Strutturali =
    Questo tipo di hazard si verifica quando le risorse necessarie per eseguire un’istruzione non sono disponibili nel ciclo di clock successivo. Ad esempio, potrebbe esserci una sola ALU nel processore, e se due istruzioni richiedono l’uso dell’ALU nello stesso ciclo di clock, si verifica un hazard strutturale. Questo tipo di hazard richiede la gestione delle risorse in modo efficace.
  • Hazard sui dati =
    Questo tipo di hazard si verifica quando un’istruzione condizionale cambia il flusso di controllo, ad esempio una branch instruction (istruzione di salto condizionale). Poiché l’istruzione di salto dipende da condizioni che potrebbero non essere note fino a quando l’istruzione non è arrivata alla fine della pipeline, potrebbe essere necessario ritardare l’esecuzione di istruzioni successive fino a quando il risultato del branch non è disponibile. Questo può causare “stalli” nella pipeline.
  • Hazard di controllo o sui salti condizionati =
    Si verifica quando è necessario prendere una decisione in merito al risultato dell’esecuzione di un’istruzione, ma altre istruzioni sono già state avviate all’esecuzione.
    Ad esempio quando potrebbe esserci il bisogno di prendere un salto basato su un confronto, ma le istruzioni successive sono già state eseguite e quindi la decisione potrebbe essere presa in base a dati non aggiornati.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Che cos’è la predizione del salto (branch prediction)?

A

La predizione del salto condizionato serve ad anticipare se un’istruzione di salto sarà eseguita oppure no. Quando una istruzione di salto condizionale è raggiunta durante l’esecuzione del programma, il processore non sa immediatamente quale sarà la direzione del flusso di esecuzione successivo. Pertanto, la pipeline potrebbe subire uno “stallo” mentre si attende il risultato del branch. La predizione del salto cerca di prevedere se il branch sarà “predetto come vero” (taken) o “predetto come falso” (not taken) e agisce di conseguenza.

Ovviamente con pipeline più lunghe il costo della predizione aumenta.

Una strategia comune per la “predizione dinamica dei salti” è quella di basarsi sulla storia, ovvero controllare se l’ultima volta che un’istruzione di salto è stata eseguita se il salto è avvenuto effettivamente.
Se è stato eseguito, vengono caricate le istruzioni a partire dall’indirizzo di destinazione del salto.
Tutte queste informazioni vengono salvate in un buffer di predizione dei salti che altro non è che una piccola memoria indicizzata contenente bit che indicano se il salto è stato eseguito o meno nell’ultima esecuzione.

Ovviamente la predizione non è sicura al 100%.
Se infatti la predizione è errata, occorre eliminare le istruzioni caricate erroneamente, inveritire il bit di predizione e riprendere l’esecuzione dall’ultima istruzione corretta.
Questo processo di correzione è detto “flushing” della pipeline.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Predizione a 1 bit e a 2 bit?

A

La “predizione a 1 bit” è una tecnica di predizione del salto che coinvolge l’uso di un solo bit per tenere traccia dello stato di predizione di un’istruzione di salto. È uno dei metodi più semplici ma anche meno precisi per la predizione dei salti. Questo approccio è un esempio di predizione statica basata sulla storia, in cui il bit tiene traccia se l’ultimo salto è stato predetto come preso (1) o non preso (0).

Il bit di predizione è associato a un particolare salto o istruzione di salto condizionale. Quando l’istruzione di salto viene eseguita, il processore utilizza il valore del bit di predizione per decidere se continuare l’esecuzione lungo il flusso previsto (se il bit è 1) o cambiare direzione e prendere il salto (se il bit è 0).

Tuttavia, poiché questa tecnica è molto semplice, è soggetta a errori di predizione, soprattutto in situazioni complesse in cui le condizioni dei salti possono variare notevolmente. Ad esempio, se ci sono cambiamenti frequenti nel comportamento dei salti, questa tecnica potrebbe non essere sufficientemente accurata per garantire una predizione affidabile.

La predizione a 2 bit, a differenza di quello a 1, ha un comportamento più “prudente” in quanto prima di cambiare stato non vede solo quello che è successo nel branch precedente, ma anche in quello prima ancora.

Nella predizione a 2 bit, ci sono quattro possibili stati di predizione, ciascuno corrispondente a due bit:

  • 00: Prevede che l’istruzione di salto non sarà presa (not taken).
  • 01: Prevede che l’istruzione di salto non sarà presa (not taken).
  • 10: Prevede che l’istruzione di salto sarà presa (taken).
  • 11: Prevede che l’istruzione di salto sarà presa (taken).

Questa tecnica migliora l’accuratezza delle predizioni rispetto alla predizione a 1 bit perché tiene conto delle tendenze nei comportamenti dei salti. Ad esempio, se un salto è stato predetto come preso due volte di seguito, la predizione a 2 bit passerà a uno stato di predizione “preso”. Tuttavia, se il salto viene preso solo una volta e non preso la successiva, la predizione tornerà allo stato “non preso”.

17
Q

Processore Superscalare

A

I processori superscalari, sono processori che utilizzano la parallelizzazione dinamica delle istruzioni, sono progettati per eseguire più istruzioni in modo indipendente e parallelo.

Le istruzioni sono eseguite in ordine, ma è il processore a decidere se avverrà nessuno, una o più istruzioni contemporaneamente nello stesso ciclo di clock.

Per ottenere buone prestazioni è bene che il compilatore riordini le istruzioni in modo che vengano rimosse le dipendenze tra di esse.
Nel processore superscalare è l’Hardware che garantisce l’esecuzione corretta del codice, indipendentemente dall’ordinamento, ragion per cui il processore superscalare può gestire anche istruzioni non riordinate.

Molti processori superscalari possono estendere una unità di gestione della parallelizzazione dell’esecuzione per includere un meccanismo di riordinamento dinamico delle istruzioni.
Questo schema consente al processore di prendere decisioni in tempo reale su quali istruzioni eseguire in un dato ciclo di clock, al fine di evitare hazard e stalli causati da dipendenze e conflitti tra istruzioni.

18
Q

Cos’è il renaming dei registri?

A

Durante l’esecuzione parallela delle istruzioni nel pipeline, può accadere che alcune istruzioni siano in attesa poichè i registri sono occupati.
Questo potrebbe causare stalli e ritardi.

In sostanza, il renaming dei registri consente di risolvere il problema delle dipendenze dei dati attraverso l’uso di registri rinominati, anziché i registri fisici originali, per tenere traccia dei dati. Questi registri rinominati funzionano come alias dei registri fisici, consentendo alle istruzioni di essere eseguite in parallelo senza aspettare il completamento delle istruzioni precedenti che dipendono dagli stessi registri.

In questo modo il livello di perallelismo aumenta e le istruzioni possono essere eseguite contemporaneamente anche se richiedono gli stessi registri.

19
Q

Come funzionano le eccezioni? Com’è la gestione delle eccezioni in MIPS?

A

L’unità di controllo di un processore deve saper gestire le eccezioni e gli interrupt, ovvero eventi imprevisti che interrompono il normale flusso di controllo di un programma in esecuzione.
In architetture come l’x86 non si ha una distinzione tra interrupt ed eccezioni, si usa “interrupt” per indicare entrambi i tipi di eventi.

In MIPS, invece il termine “eccezioni” indica un cambiamento imprevisto del flusso di controllo indipendentemente dalla causa
Mentre il termine “interrupt” è utilizzato per indicare eventi generati da cause esterne al processore.

Quando si verifica una eccezione o un’interrupt, il processore salva l’indirizzo dell’istruzione che ha generato l’evento in un Exception Program Counter (EPC) e passa il controllo al S.O. il quale gestirà l’eccezione.
Il S.O. individuerà il tipo di evento generato e deciderà se terminare il programma o riprendere l’esecuzione utilizzando l’EPC.

In MIPS viene utilizzato un registro “Cause” che contiene un campo che indica la causa dell’eccezione.

Un metodo alternativo è l’utilizzo di “interrupt vettorizzati”, in cui l’indirizzo a cui viene trasferito il controllo viene determinato dalla causa dell’eccezione stessa.
In questo modo, quando il S.O. deve gestire l’eccezione, conoscendo soltanto l’indirizzo al quale è trasferito il controllo conoscerà già la causa dell’eccezione.

20
Q

Processore Very Long Instruction Word (VLIW)

A

Sono processori che utilizzano la parallelizzazione statica delle istruzioni.
Un ruolo fondamentale in questo tipo di processore lo svolge il compilatore al quale è demandato il compito di riordinare le istruzioni, gestire gli hazard e predire i salti.

In questo processore tutte le istruzioni che possono essere svolte nello stesso ciclo di clock sono raggruppate in un unico pacchetto.

Poichè in un processore con parallelizzazione statica la combinazione di istruzioni che possono essere eseguite contemporaneamente è limitata, è utile considerare il pacchetto di istruzioni come un’unica istruzione in cui diverse operazioni sono codificate in campi predefiniti.

Questa visione ha portato alla denominazione di questo approccio come Very Long Instruction Word.

21
Q

Le istruzioni MIPS quanti passi richiedono e quali?

A

Le istruzioni MIPS richiedono 5 fasi, ovvero:
- Fetch dell’istruzione;
- Lettura dei registri e decodifica dell’istruzione;
- Esecuzione di una operazione;
- Accesso ad un operando nella memoria dati;
- Scrittura del risultato in un registro;

22
Q

Che cosa è il caching e come funziona?

A

Il caching è una tecnica utilizzata per migliorare le prestazioni, accedendo più rapidamente ai dati frequentemente utilizzati.

Si basa sul principio di Località che si divide in:
- Località Spaziale =
Se un programma accede ad una determinata locazione di memoria, è probabile che acceda anche alle locazioni vicine ad essa dopo poco tempo. Ad esempio, un programma potrebbe accedere a un elemento in un array e quindi accedere agli elementi successivi nell’array.

  • Località Temporale =
    Se un programma accede ad una determinata locazione di memoria, è probabile che vi acceda nuovamente in breve tempo. Ad esempio, un programma potrebbe leggere lo stesso dato più volte in sequenza.

Questo principio sfrutta la memoria del calcolatore in modo gerarchico, con diversi livelli di memoria caratterizzati da dimensione e velocità.

Le memorie più veloci sono le cache e sono posizionate vicino al processore, mentre le più grandi e lente sono i dischi magnetici.

La cache è, quindi, una memoria più veloce e piccola della memoria principale (DRAM)
La cache memorizza temporaneamente le copie dei dati più frequenti prelevati dalla memoria principale.

Quando il processore richiede un dato, controlla prima se questa è presente nella cache.
Se lo è allora ottiene un “hit”, se non lo è ottiene un “miss”.
Nel caso un dato non è presente nella cache, occorre prelevarlo dalla memoria principale e questo richiede più tempo.

La gerarchia di memoria è organizzata in blocchi o linee di cache in modo da sfruttare il principio di località e quindi memorizzare anche i dati vicini a quello caricato nella cache. Ad esempio, se un dato viene caricato in cache, la cache potrebbe memorizzare anche i dati vicini a quel dato, poiché c’è una buona probabilità che saranno richiesti in futuro in base al principio di località spaziale. Inoltre, se un dato viene letto più volte nel breve periodo (località temporale), la cache manterrà copie di quel dato per evitare di dover ricaricarlo dalla memoria principale ogni volta.

L’efficacia del caching, quindi, dipende dall’ “hit rate” e dal “miss rate”, rispettivamente la frequenza con cui il dato che viene richiesto è presente nella cache e la frequenza con cui il dato richiesto non viene trovato nella cache.
Ovviamente il tempo di hit è molto minore di quello di miss.

23
Q

Cosa è la cache pollution?

A

La cache pollution è un problema che si viene a creare nel momento in cui si rispetta il principio di località.
Infatti, quando si caricano i dati che si trovano vicino al dato che va caricato nella cache, si rischia di occupare dello spazio con cose inutili, finendo per sporcare la cache.

Per evitare la cache pollution è bene far si che il codice del programma riduca al minimo il caricamento di dati non utilizzati nella cache.

24
Q

Come si misura l’affidabilità?

A

L’affidabilità di un dispositivo o di un sistema rappresenta la probabilità che funzioni correttamente senza guasti durante un determinato periodo di tempo. L’obiettivo è massimizzare l’affidabilità in modo che il dispositivo o il sistema possa operare senza interruzioni o malfunzionamenti.

Il MTTF è una metrica che indica l’intervallo di tempo medio che si prevede trascorrerà prima che un dispositivo o un sistema subisca il primo malfunzionamento. In altre parole, è una stima del tempo medio tra l’installazione o l’attivazione di un dispositivo e il momento in cui si verificherà il primo guasto. Un valore elevato di MTTF indica una maggiore affidabilità.

L’AFR è una metrica che misura la percentuale di dispositivi di una popolazione che ci si aspetta si guasteranno in un anno, sulla base del MTTF. L’AFR è spesso espresso come un valore percentuale e rappresenta il tasso di guasto annuale previsto. Ad esempio, se l’AFR è dell’1%, significa che si prevede che l’1% dei dispositivi in una popolazione avrà un guasto entro un anno.

Quando il valore di MTTF diventa troppo grande è fuorviante per la misurazione dell’affidabilità, ragion per cui si utilizza come metrica l’AFR in quanto tiene conto della frequenza dei malfunzionamenti in un anno.

25
Q

Quale è la parte più alta nella gerarchia di memoria? E la parte di mezzo per cosa viene usata?

A

La parte più alta nella gerarchia di memoria è rappresentata dal Processore, mentre tra il Processore e la Memoria principale (DRAM) ci sono diversi livelli di cache.

26
Q

L’unità massima di una cache? Dimensione di un blocco della cache?

A

L’unità massima di informazione che può essere presente o assente in una cache è il blocco che può essere di 8-16 word oppure 32-64 byte.

27
Q

Cos’è una cache direct mapped e com’è fatta? Qual è la regola per trovare un blocco in una cache direct mapped?

A

La mappatura diretta consiste nell’associare, in modo univoco, ad ogni locazione della memoria principale una locazione della cache. Questo significa che ogni blocco di memoria principale ha una posizione fissa nella cache in cui può essere memorizzato.

Oltre ai dati, la cache deve permettere di memorizzare anche delle info aggiuntive (tags) Il tag è una parte dell’indirizzo di memoria che viene memorizzata insieme ai dati nella cache. Il tag è utilizzato per verificare se una word (o un blocco) nella cache corrisponde o meno all’indirizzo di memoria cercato.

Per associare univocamente una posizione in una cache direct mapped è sufficiente memorizzare, assieme al dato, la parte più significativa dell’indirizzo, ovvero quella che non corrisponde ai bit utilizzati come indice nella cache.

Per gestire situazioni in cui un blocco di cache potrebbe non contenere dati validi, viene introdotto un bit di validità per ciascun blocco di cache. Questo bit indica se il contenuto del blocco di cache è valido o no.

Per trovare un blocco all’interno di una cache direct mapped si utilizza la formula:
(numero del blocco) modulo (numero di blocchi nella cache)

28
Q

Cosa è una cache full-associative?

A

Un blocco di memoria può essere caricato in qualsiasi porzione della cache, detta cache full associative.

Poichè in questo caso per ricercare un blocco, la ricerca sequenziale risulta molto lenta, si utilizza un comparatore per ogni blocco in modo da poter svolgere la ricerca in parallelo e sopratutto da renderla più efficace.

29
Q

Perchè le cache full-associative non si usano mai?

A

Le cache full associative non si usano mai poichè la ricerca di un blocco deve essere effettuata su tutti gli elementi della cache.

30
Q

Cosa è una cache set-associative?

A

Ogni blocco della memoria principale è mappato su una linea della cache, identificata dal campo indice.

Poichè un blocco può essere scritto in una qualsiasi posizione nella linea di cache, la ricerca dovrà analizzare tutti i campi di tag dei vari blocchi.
Una ricerca sequenziale sarebbe inefficace, ragion per cui sono usati i multiplexer per selezionare il dato corretto tra i contenuti del tag.

Quando si verifica un “miss” di cache e occorre sostituire un blocco si utilizza lo schema chiamato LRU (Last Recently Used) che consiste nel rimuovere dalla cache il blocco rimasto inutilizzato da più tempo.
Quindi, questo schema tiene traccia dell’ordine temporale in cui i blocchi sono stati acceduti e mira a massimizzare l’utilizzo della cache.

31
Q

Differenza tra Write through e write-back?

A

Il Write-through tiene conto del concetto di coerenza, ovvero un dato presente nella cache deve esserlo anche nella memoria principale.
Quando un processore effettua un’operazione di scrittura (ad esempio, una scrittura in memoria), i dati vengono scritti sia nella cache che nella memoria principale contemporaneamente. Questo assicura che i dati nella cache siano sempre aggiornati rispetto ai dati nella memoria principale.
Poiché ogni scrittura richiede una doppia operazione di scrittura (una nella cache e una nella memoria principale), il write-through può essere più lento in termini di latenza rispetto al write-back.

Un problema si potrebbe verificare anche in presenza di un miss durante la scrittura.
Il blocco viene caricato nella cache e il dato è sovrascritto.
Questo processo però richiede un accesso aggiuntivo alla memoria principale per leggere il blocco precedente prima di sovrascriverlo.
Per evitare tutto ciò si utilizza un buffer di scrittura in cui vengono memorizzati i dati prima di essere scritti nella memoria principale.
Dopo aver scrutto il dato nella memoria principale, si libera il buffer.
Se il buffer è saturo, il processore è messo in stallo.

L’alternativa al write-through è il write-back.E’ un’alternativa al write-through nella gestione della cache. In un sistema con politica di write-back, quando si verifica un’operazione di scrittura nella cache, il dato viene modificato solo nella cache stessa, ma non viene immediatamente propagato alla memoria principale (RAM).
Il blocco modificato viene salvato nel livello inferiore soltanto quando deve essere rimpiazzato dalla cache.
Questo riduce il numero di scritture sulla memoria principale, ma richiede una gestione più complessa per garantire la coerenza dei dati tra memoria e cache.

32
Q

Quali sono i tipi di cache miss?

A

Esistono 3 tipi di cache miss:
- Miss obbligate
Si verifica quando un dato richiesto non è presente nella cache e deve essere caricato dalla memoria principale (RAM) nella cache. Questi miss sono inevitabili al momento dell’avvio del sistema o quando si accede a un’area di memoria che non è mai stata caricata in cache.

  • Miss di capacità
    Una “miss di capacità” si verifica quando la cache è piena e non c’è spazio sufficiente per memorizzare un nuovo blocco di dati che deve essere caricato dalla memoria principale. Di conseguenza, un blocco già presente in cache deve essere rimosso o sostituito per fare spazio al nuovo blocco richiesto.
  • Miss di conflitto
    si verificano nelle cache a mappatura diretta o set associative, quando più blocchi competono per la stessa linea di cache.
    Nella cache a mappatura diretta ogni blocco viene mappato in una posizione specifica della cache, quindi se due blocchi cercano di mapparsi nella stessa posizione si ha una miss di conflitto.

Nella cache set-associative si verificano quanto tutti i blocchi di una determinata linea sono occupati e si tenta di caricare un nuovo blocco nella stessa linea.

Queste miss possono essere ridotte utilizza una cache full-associative.

Le miss di conflitto sono anche dette miss di collisione.

33
Q

Differenza tra SRAM e DRAM

A

Le SRAM sono un tipo di memoria ad accesso casuale che utilizza flip-flop per memorizzare i dati. Queste memorie sono conosciute per le loro alte prestazioni, la loro capacità di accesso rapido e la loro capacità di mantenere i dati fintanto che l’alimentazione è attiva.
- Le SRAM hanno una singola porta di accesso che consente sia la lettura che la scrittura dei dati. Questo significa che i dati possono essere letti e scritti in qualsiasi momento senza la necessità di fasi di lettura/scrittura separate.
- Non richiedono refresh.
- Per evitare interferenze e disturbi, per ogni bit si usanno da 6 a 8 Transistor.

Quindi, quando si dice che “il mercato delle SRAM è diventato quasi inesistente” nel contesto dei processori, si intende che la domanda principale e prioritaria per la SRAM è l’integrazione nelle cache dei processori. Questa integrazione ha portato a una crescente domanda di SRAM per l’uso nei processori, ma ha anche ridotto la necessità di SRAM in altri settori.

Le DRAM sono un tipo di memoria ad accesso casuale che utilizzano un condensatore per memorizzare un bit di dati e un transistor per accedere a quel bit.
- Sono più dense e meno costose delle SRAM.
- In una DRAM, ogni bit di dati è memorizzato come una carica elettrica in un condensatore. La presenza o l’assenza di carica nel condensatore rappresenta il valore binario 0 o 1.
- Per accedere a un bit specifico nella DRAM, viene utilizzato un transistor di accesso. Il transistor permette di leggere o scrivere il valore del condensatore associato al bit di memoria.
- Uno dei principali svantaggi delle DRAM è che i condensatori tendono a scaricarsi nel tempo. Per evitare la perdita di dati, le DRAM richiedono un processo di “refresh” periodico. Durante il refresh, il contenuto di ogni cella di memoria viene letto e riscritto per mantenere la carica nei condensatori. Questo processo deve essere eseguito in modo ciclico per tutte le celle di memoria, il che richiede tempo e risorse.

Le DRAM utilizzano un’architettura a due livelli che consente il refresh di una intera riga di memoria.
Viene utilizzato un buffer per memorizzare una riga di dati e consentire accessi ripetuti a quella riga.

Per migliorare l’interfacciamento con i processori, alle DRAM è stato aggiunto un clock.
Queste memorie sono chiamate DRAM sincrone, ovvero SDRAM.
- Le SDRAM sono dotate di un segnale di clock che determina il ritmo delle operazioni di lettura e scrittura. Questo clock è fornito dal sistema o dal processore e viene utilizzato per sincronizzare le operazioni di accesso alla memoria. L’aggiunta del clock rende le operazioni di memoria più predicibili e precise.
Le SDRAM possono trasferire gruppi di bit in modo sequenziale senza dover specificare gli indirizzi per ciascun singolo bit o byte. Questo è noto come “burst mode” o “accesso a raffica”. In questo modo, è possibile trasferire rapidamente blocchi di dati consecutivi dalla memoria senza la necessità di specificare un indirizzo per ogni singolo elemento di dati.

La versione più veloce è chiamata DDR (Double Data Rate) SDRAM, ovvero il trasferimento dei dati avviene sia sul fronte di salita che su quello di discesa del clock, ottenendo il doppio della larghezza di banda.

34
Q

Cos’è il Direct Memory Access?

A

La comunicazione tra CPU e periferiche può avvenire attraverso polling o interrupt.

Il polling è una tecnica in cui la CPU esegue una scansione continua delle periferiche per verificare se sono pronte per comunicare o se hanno dati da trasferire.
Se una periferica è pronta, la CPU avvia la comunicazione.
Il problema è dover richiedere alla CPU una continua scansione delle periferiche.

L’interrupt è un messaggio inviato per richiedere l’attenzione della CPU.
La CPU riceve il messaggio, interrompe l’esecuzione del programma e gestisce la periferica.
Questa tecnica consente alle periferiche di comunicare in modo sincrono con la CPU, anche mentre questa è occupata.
L’uso eccessivo degli interrupt può causare un sovraccarico dei processori, in quanto la CPU deve frequentemente interrompere il suo flusso di esecuzione per gestire gli interrupt.

Per risolvere questi problemi si è adottata la tecnica del DMA (Direct Memory Access).
Il DMA è una tecnica utilizzata per migliorare l’efficienza del trasferimento di dati tra periferiche esterne e la memoria principale senza coinvolgere direttamente la CPU. Invece di fare affidamento sulla CPU per gestire ogni trasferimento di dati, un controller DMA dedicato si occupa del trasferimento dei dati, liberando la CPU per altre attività.
Il trasferimento avviene in 3 fasi:
- Inizializzazione =
Il processore fornisce informazioni necessarie per il trasferimeto al DMA;

  • Avvio del trasferimento =
    Il DMA avvia l’operazione di trasferimento tra periferica e memoria principale, governando la connessione tra di essi.
  • Interruzione e verifica =
    Terminato il trasferimento, il controller DMA interrompe il processo e notifica l’esito del trasferimento alla CPU, tramite interrupt;

Il DMA bypassa il problema della traduzione degli indirizzi e la gerarchia delle cache, in quanto non si passa per il processore.
Nasce però un problema.
Poiché la CPU potrebbe utilizzare una cache per migliorare le prestazioni, i dati nella cache potrebbero essere diversi da quelli nella memoria principale dopo un trasferimento DMA.
Questo è detto problema dei dati stantii o della coerenza.

Per risolvere il problema, quindi, occorre gestire la coerenza dei dati e sincronizzare il processore con il DMA.

35
Q

Come si misura l’affidabilità?

A

Oltre alle misure di MTTF (Mean Time To Failure) e AFR (Annual Failure Rate), si utilizzano anche le misure di MTTR e MTBF.

L’interruzione di un servizio è misurata dall’MTTR (Mean Time To Repair) il tempo medio richiesto per riparare il dispositivo o sistema e riportarlo in funzione dopo un guasto.

Il tempo medio tra due guasti, ovvero MTBF (Mean Time Between Failure) si calcola come la somma tra MTTF e MTTR.
Indica la durata media tra il guasto di un dispositivo e il successivo guasto.

3) Che cos’è un disco RAID?
Il RAID è una tecnologia che combina più dischi rigidi (spesso dischi economici o poco costosi) in un’unica unità di storage. L’obiettivo principale del RAID è migliorare le prestazioni, l’affidabilità o entrambi, a seconda del livello di RAID utilizzato.

I dati sono suddivisi e replicati su più dischi nell’insieme RAID, in modo che se uno si guasta, le informazioni possono essere recuperati dagli altri dischi aumentando così l’affidabilità del sistema di storage.

MIgliora significativamente le prestazioni perchè i dati vengono letti e scritti simultaneamente su piuù dischi. Questo è particolarmente utile in applicazioni che richiedono un elevato throughput dei dati, come i server di database o i server di archiviazione.

36
Q

Perchè scelgo RAID?

A

Scelgo i RAID poichè in caso di guasto di uno dei dischi, è possibile cambiarlo con un altro mentre tutto il sistema è in funzione.
Questo concetto viene detto “hot swapping”.

Un altro vantaggio dei RAID è la possibilità di costruire un sistema fault tollerance in grado di continuare a funzionare nonostante i guasti.

37
Q

Chi utilizza i dischi RAID?

A

Sono ampiamente utilizzati dai Server in quanto offrono numerosi vantaggi tra cui il miglioramento delle prestazioni complessive del sistema.
Quando si verifica un guasto su un disco in un RAID, è possibile sostituirlo senza dover spegnere la macchina.
Successivamente avviene anche un programma di ricostruzione che ripristina i dati sul nuovo disco.

38
Q

Diverse strutture dei dischi RAID

A

RAID 0, noto come “striping”, offre nessuna ridondanza dei dati i quali sono semplicemente suddivisi e distribuiti su più dischi.

RAID 1, chiamato “mirroring” o “shadowing”, prevede della copia esatta dei dati su un disco ridondante.
Ogni volta che un dato è scritto su un disco, viene scritto anche sul disco mirror.
In caso di guasto del disco primario, il sistema può accedere al disco mirror per recuperare i dati.

RAID 2 utilizza un codice per il riconoscimento degli errori (ECC) per il rilevamento e la correzione degli errori. Non è più comunemente utilizzato.

RAID 3 utilizza una parità dedicata (questo disco di parità è utilizzato per calcolare i dati mancanti o danneggiati durante un guasto) su un disco per recuperare i dati persi a causa di un guasto.
I dati originali non sono duplicati completamente, ma vengono aggiunte informazioni ridondanti per la correzione degli errori.
L’accesso avviene contemporaneamente su tutti i dischi.
Il disco di parità deve essere aggiornato ad ogni scrittura, creando così un “collo di bottiglia”.

RAID 4 simile al RAID 3 con la differenza che l’accesso viene fatto al livello di blocco ( le operazioni di scrittura coinvolgono solo il blocco specifico interessato e il disco di parità corrispondente), senza impiegare tutti i dischi contemporaneamente, in modo da ridurre il problema del “collo di bottiglia”.

RAID 5 simile al RAID 4, ma distribuisce l’informazione di parità in modo uniforme su tutti i dischi, eliminando il “collo di bottiglia” delle scritture.
Ogni disco contiene sia dati che informazioni di parità.

I livelli di RAID più alti offrono più ridondanza e protezione dei dati a discapito di un costo maggiore e complessità.