• Non ci sono risultati.

Marco Tarini -Università dell'InsubriaA.A. 2017/18Architettura degli elaboratori -Astrazione e Macchine Virtuali1Università degli Studi dell’InsubriaDipartimento di Scienze Teoriche e Applicate

N/A
N/A
Protected

Academic year: 2021

Condividi "Marco Tarini -Università dell'InsubriaA.A. 2017/18Architettura degli elaboratori -Astrazione e Macchine Virtuali1Università degli Studi dell’InsubriaDipartimento di Scienze Teoriche e Applicate"

Copied!
24
0
0

Testo completo

(1)

Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate

Architettura degli elaboratori

Astrazione e Macchine Virtuali parte 1: in generale

Il concetto di astrazione

Astrazione = ignorare (nascondere) dettagli (anche rilevanti) per semplificare il problema

Utile (anzi necessario) per affrontare sistemi complessi per la loro analisie loro sintesi

Approccio riduzionista

tipico di scienza e ingegneria (contrario: «olistico»)

Esempi:

Motore visto come elemento che eroga potenza – astraggo da dettagli costruttivi

Database: sistema in grado di memorizzare dati persistenti, gestendo accessi concorrenti, sicurezza, ecc.

Sistema biologico: organismo – organo – tessuto – cellula – organelli – molecole – atomi – …

(2)

Architettura di Von Neumann

Architettura degli elaboratori

L’astrazione e il calcolatore

Il calcolatore può essere compreso (analisi) e costruito (sintesi) come una gerarchia di macchine astratte (virtuali)

Ogni livello maschera (nasconde) i dettagli dei livelli sottostanti Utile per la descrizione: mi interessa capire il funzionamento del livello in esame, non dei sottostanti (ed essere in grado di progettarlo).

(3)

Architettura degli elaboratori

L’astrazione e il calcolatore

L’astrazione è utile anche in fase di costruzione (sintesi).

Ad es. costruire una ‘macchina powerpoint’ direttamente con transistor sarebbe di complessità proibitiva …

Soluzione:

1. Costruiamo una prima macchina (l’elaboratore) in grado di eseguire istruzioni elementari.

2. Utilizziamo queste istruzioni elementari per scrivere un programma (il Sistema Operativo) in grado di eseguire comandi più complessi

Il programmatore del S.O. non conosce i dettagli relativi alla tecnologia realizzativa del microprocessore

3. Scriviamo programmi che si basano sulle funzioni messe a disposizione dal S.O.

il programmatore di powerpoint non conosce i dettagli costruttivi del S.O.

In questo corso non arriveremo mai al livello del transistor, né tantomeno dei livelli sottostanti.

Istruzioni e operazioni

Un esecutore è definito in base a tre elementi:

l’insieme delle operazioni che è capace di compiere;

l’insieme delle istruzioni che capisce (sintassi)

quali operazioni associa ad ogni istruzione che riconosce (semantica)

Ad es. un elaboratore è in grado di eseguire un insieme di istruzioni Per ogni istruzione esegue diverse operazioni:

1. Preleva da memoria l’istruzione da eseguire 2. Esamina l’istruzione e capisce cosa deve fare

3. Esegue l’istruzione (cioè esegue le operazioni elementari corrispondenti al significato dell’istruzione).

Operazioni fisse (le stesse per ogni istruzione)

Operazioni diverse per ogni istruzione

(4)

Architettura degli elaboratori

Differenza tra istruzione e operazione

Istruzione (comando): “Vammi a prendere un caffé”

Operazioni:

Mi alzo

Mi dirigo verso la porta Apro la porta

Raggiungo la macchina del caffé

Ci deve essere un elemento che interpreta il comando convertendolo nella serie opportuna di operazioni.

Linguaggio: definizione

Il linguaggio è l’insieme delle istruzioni (comandi) che un esecutore è in grado di comprendere ed eseguire.

NB: nel descrivere un linguaggio non è rilevante sapere come viene eseguita l’istruzione (cioè ad es. a quale sequenza di operazioni l’esecutore ricorre)

(5)

Architettura degli elaboratori

Il linguaggio macchina

Il linguaggio macchina è il linguaggio compreso dal processore

Esistono tanti linguaggi macchina quanti sono i processori: Zilog Z80, DEC Alpha, Intel 8080, 80386, Pentium IV, ecc.

Un’interessante eccezione: la compatibilità Caratteristiche del linguaggio macchina:

Binario: le istruzioni sono delle sequenze di 0 e 1

Di basso livello: ogni istruzione ha un effetto molto elementare. Ad es.:

Copia il contenuto di un registro in un altro registro

Trasferisci il contenuto di una data cella di memoria in un registro Somma i contenuti di due registri e metti il risultato in un terzo registro

Scrivere programmi complessi con istruzioni di questo genere è praticamente impossibile

lungo, tedioso e passibile di errori anche banali.

Il dilemma

La macchina “semplice” costruita con i transistor mi fornisce un linguaggio inadeguato alla programmazione di programmi complessi e sofisticati.

Costruire direttamente con i transistor una macchina in grado di supportare la programmazione di alto livello è un’impresa di costo e complessità enormi.

Che fare?

Teniamo la nostra macchina di basso livello, ma ci “costruiamo sopra” una macchina di più alto livello (cioè più potente e facile da programmare)

(6)

Architettura degli elaboratori

Esecutori e linguaggi

Il calcolatore “capisce” le istruzioni che fanno parte del linguaggio macchina (che indichiamo con L0).

L’obiettivo è definire una macchina che capisca un linguaggio L1 più potente e facile da utilizzare rispetto al linguaggio macchina L0:

definire l’insieme delle istruzioni che fanno parte di L1;

utilizzare le istruzioni di L0 come operazioni di L1;

definire quali operazioni vengono associate a quali istruzioni.

Definizione di una machina di più alto livello

La macchina M0capisce il linguaggio L0, che comprende le istruzioni I0, I1, I2 L0= {I0, I1, I2}

M0è data e non ci interessa come funziona internamente.

Definiamo una macchina M1che capisce un linguaggio L1, che comprende le istruzioni J0, J1, J2, J3

L1= {J0, J1, J2, J3}

M1 è tipicamente una macchina di più alto livello rispetto a M0, cioè le sue istruzioni sono più potenti e facili da usare.

Tutte le istruzioni di L1 saranno definite in termini di istruzioni di L0. Cioè ogni istruzione Jkcorrisponde a una sequenza di istruzioni della macchina M0ad es.

J0= I0; I1; I1; I2. J1= I1; I2. J2= I2 ; I0; I1. J3= I2 ; I2; I0

Sulla carta la definizione è immediata, ma come si

realizza in pratica?

(7)

Architettura degli elaboratori

M

1

Come realizzare M

1

?

Una soluzione consiste nell’incorporare M0in M1.

Ogni volta che si deve eseguire una istruzione di L1, si richiede a M0di eseguire le corrispondenti istruzioni L0.

Esempio: per eseguire J2si richiederà a di eseguire la sequenza di istruzioni corrispondente, cioè I2; I0; I1

M

0

J2 I2

I0 I1

Problema: chi decide che J2 si trasforma nella sequenza I2

I0I1? Deve essere tutto

automatico!

M

1

Come passare da L1 a L0

Traduzione (o compilazione)

Un apposito programma (compilatore) traduce il programma PL1, scritto in linguaggio L1, in un programma PL0, scritto in linguaggio L0;

il nuovo programma PL0viene quindi eseguito.

M

0

Traduttore

--- ---

J2 --- --- ---

I2 I0 I1 ---

Programma scritto in L1 Programma

equivalente scritto in L0

(8)

Architettura degli elaboratori

Come passare da L1 a L0

Interpretazione

Un apposito programma (interprete) esamina il programma PL1, scritto in linguaggio L1, e, istruzione per istruzione, lo traduce nel linguaggio L0 e lo esegue.

M

1

M

0

J2 I2

I0 I1

Interprete

Interpretazione

Il controllo è sempre nelle mani dell’interprete Dati dell’interprete

Programma PL1scritto nel linguaggio L1 Dati del programma PL1

 Versatile e comodo in fase di debugging

• Se si identifica un errore si può cambiare il codice e proseguire senza dover ripartire da zero

 Prestazioni ridotte

• Ogni istruzione viene tradotta ogni volta che viene eseguita Di solito è scritto in L0 e fa parte integrante della macchina M1.

(9)

Architettura degli elaboratori

Compilazione

Il compilatore mantiene il controllo solo nella prima fase (traduzione da PL1a PL0).

Una volta fatta la traduzione non serve più (finché non si cambia il programma).

Dati del compilatore:

programma PL1scritto nel linguaggio L1 (input);

programma PL0scritto nel linguaggio L0 (output).

 Buone prestazioni:

• si esegue PL0scritto in linguaggio L0;

• durante la traduzione si può ottimizzare il codice.

 In caso di modifica del codice (e.g. debugging) è necessario ricompilare il programma modificato.

Costruzione di un compilatore

Problema: come scrivere il primo complilatore da L1 a L0 ? Scriverlo direttamente in L0? di solito, difficile

Si può scriverlo in L1, e poi tradurlo a mano in L0.

Alternativa: in un linguaggio Lx, disponendo già di un comp da Lx a L0

Al giorno d’oggi:

Design e implementazione di compilatori (da un linguaggio dato):

disciplina matura

Esistono molti strumenti software per semplificare il task.

è facile definire nuovi linguaggi ad-hoc, ad alto livello, pensati per gestire contesti specifici, e dotarsi di compilatori per tali linguaggi (o interpreti – in questo caso si parla spesso di «linguaggi di scripting») Nota: i buoni compilatori ottimizzano il codice che producono

La scrittura di compilatori esula dagli obiettivi di questo corso

(10)

Architettura degli elaboratori

Macchina virtuale M1

Il calcolatore reale (macchina M0) riconosce programmi scritti nel linguaggio L0

realizzare una macchina reale capace di comprendere il linguaggio L1 sarebbe troppo costoso e/o poco efficiente

La compilazione o l’interpretazione permettono di realizzare una macchina virtuale M1 capace di comprendere il linguaggio L1.

Problema:

per rendere comoda ed efficiente la traduzione, la distanza tra L1 e L0 (e quindi tra M1 e M0) non può essere elevata;

non è detto che M1 sia la soluzione desiderata (potrebbe essere ancora troppo distante dal livello “umano”).

Macchina virtuale M2

È possibile ripetere lo stesso procedimento ipotizzando che M1 sia il punto di partenza (invece di M0) per definire una macchina virtuale M2 capace di eseguire programmi scritti in un linguaggio L2.

Per la traduzione dei programmi scritti nel linguaggio L2 esistono due possibilità:

tradurli in L1 per eseguirli con la macchina virtuale M1;

tradurli direttamente in L0 in modo che possano essere eseguiti dalla macchina reale M0.

Iterando si possono definire ulteriori macchine virtuali M3, M4, ... MN fino a raggiungere il livello di “usabilità” desiderato.

(11)

Architettura degli elaboratori

Macchina a più livelli

M0 (L0)

Programmi eseguiti

direttamente dal calcolatore (macchina reale)

Livello 0

M1 (L1)

Programmi tradotti in L0 in modo che possano essere eseguiti da M0

Livello 1

M2 (L2)

Programmi tradotti in L1 o in L0 in modo che possano essere eseguiti da M1 o da M0 Livello 2

Mn (Ln) ....

Programmi tradotti in uno dei

linguaggio di livello inferiore in modo che possano essere eseguiti da una delle macchine di livello inferiore Livello n

Astrazione per realizzare l’indipendenza dalla macchina

Avendo costruito una macchina Mn che “capisce” il linguaggio Ln, dobbiamo disporre della capacità di tradurre Ln in Ln-1.

Possono esistere più macchine virtuali che mettono a disposizione dei linguaggi in grado di fungere da Ln-1.

Esempio: stesso S.O. su HW diversi, stessa applicazione su S.O. diversi, ecc.

La figura precedente ammette ramificazioni!

(12)

Architettura degli elaboratori

Relazione tra una macchina e il relativo linguaggio macchina

La macchina definisce il linguaggio.

Una macchina (reale o virtuale) permette di definire il linguaggio macchinaad essa associato come l’insieme di tutte le istruzioni che la macchina stessa è in grado di eseguire.

Il linguaggio definisce la macchina.

Un linguaggio permette di definire la macchina (reale o virtuale) ad esso associata come l’esecutore capace di comprendere tutti i programmi scritti in quel linguaggio.

Calcolatore a n livelli

Per scrivere i programmi per il livello n non è necessario conoscere come viene effettuata la traduzione e quindi l’esecuzione.

I programmi possono essere

eseguiti direttamente dalla macchina reale;

tradotti direttamente nel linguaggio L0;

interpretati da un interprete che viene a sua volta interpretato da un altro interprete ...;

...

La conoscenza dei livelli intermedi è importante per chi voglia capire come funziona un calcolatore (analisi);

come si progetta una macchina virtuale (sintesi).

(13)

Riassunto dei concetti visti (so far)

Analisi VSSintesi

(Riduzionismo VS Olismo) Livelli di Astrazione (gerarchia di) Architettura di Von Neumann

(dati+ programmiin memoria) Linguaggio

Sintassi VS Semantica

Istruzioni (o comandi) VSOperazioni

Macchina (astratta) ↔ Linguaggio (di quella Macchina Astratta) Macchina (fisica) ↔ Linguaggio Macchina

Linguaggio ↔ Insieme delle Istruzioni («Instruction Set») Gerarchia di linguaggi

Alto livello VS Basso livello Compilazione VS Interpretazione

Architettura degli elaboratori

Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate

Architettura degli elaboratori

Astrazione e Macchine Virtuali

parte 2: in un tipico calcolatore

(14)

Architettura degli elaboratori

I livelli nei moderni calcolatori

6. … Livello delle applicazioni specifiche 5. Livello dei linguaggi applicativi

4. Livello del linguaggio assemblatore 3. Livello del sistema operativo

2. Livello dell’Instruction Set (ISA) 1. Livello della microarchitettura 0. Livello logico

-1. ... Livello dei dispositivi ...

-2. ... (fisica dello stato solido) ...

Livello dei dispositivi

Transistor che formano i circuiti elettronici di cui è composto un calcolatore.

Raggiunge un livello di dettaglio che viene in genere trascurato nella progettazione dei calcolatori.

A un livello ancor più basso ci si occupa della fisica dello stato solido (es silicio drogato, come semiconduttore)

(15)

Architettura degli elaboratori

Livello 0: la logica digitale

La macchina è formata da porte logiche.

Ogni porta riceve in ingresso dei segnali binari (cioè segnali che possono essere 0 o 1) e calcola una semplice funzione (AND, OR, ...).

Alcune porte, collegate opportunamente, possono formare una memoria di un bit (bistabile).

Combinando N memorie di un bit si può formare un registro capace di memorizzare un numero binario (non più grande di 2N-1).

Combinando le porte si realizzano i circuiti che eseguono task come fare operazioni aritmetiche fra numeri

leggere dalla memoria etc

Livello 1: la microarchitettura

Livello 1 Microarchitettura

Livello 0 Logica digitale

Esecuzione

diretta

(Hardware)

(16)

Architettura degli elaboratori

Livello 1: la microarchitettura

Elaborazione – Data Path

registri general purpose come memoria locale;

Arithmetic Logic Unit (ALU) capace di eseguire semplici operazioni aritmetico-logiche;

Elementi di connessione tra registri e ALU.

Controllo

registri dedicati al controllo (PC, IR, ...);

Unità di controllo – Control Unit

che può microprogrammata o cablata.

Control Unit:

cablata o microprogrammata?

Control Unit Microprogrammata

il funzionamento del Data Path viene controllato da un programma chiamato microprogramma;

si tratta di un interprete delle istruzioni di livello 2;

era la soluzione più diffusa in passato, tanto che il termine µ- programmazione era a volte sinonimo di µ-architettura.

Control Unit Cablata

il funzionamento del Data Path viene controllato direttamente tramite dispositivi hardware;

la sequenza di operazioni associate alle istruzioni di livello 2 non viene generata da un interprete ma viene gestita direttamente via hardware.

(17)

Architettura degli elaboratori

Livello 2: Instruction Set Architecture

Livello 2 Instruction Set

Livello 1 Microarchitettura

Livello 0 Logica digitale

Interpretazione

(microprogramma)

esecuzione diretta o (hardware)

Livello 2: Instruction Set Architecture

Insieme delle istruzioni che possono essere comprese dalla µ-architettura (la µ-architettura agisce da interprete dell’Instruction Set).

È il livello cui si fa riferimento quando si descrive il “linguaggio macchina” di un calcolatore.

la sintassidi ciascuna di queste istruzioni è costituita da sequenze di 0 e 1 (codifica binaria)

(18)

Architettura degli elaboratori

Livello 3: il sistema operativo

Livello 3 Sistema operativo

Livello 1 Microarchitettura Livello 0 Logica digitale

Livello 2 Instruction Set

Interpretazione parziale

Livello 3: il sistema operativo

Il linguaggio di questo livello:

comprende molte istruzioni che si trovano già al livello 2;

comprende anche un insieme di istruzioni aggiuntive;

ha una diversa organizzazione della memoria;

esegue più programmi contemporaneamente.

La traduzione è ibrida

Le nuove funzionalità sono eseguite da un interprete che viene definito “Sistema operativo”.

Le istruzioni identiche a quelle del livello 2 vengono eseguite direttamente dalla microarchitettura.

(19)

Architettura degli elaboratori

Livelli bassi (1, 2, 3) vs livelli alti (4, 5)

I livelli bassi supportano il funzionamento dei compilatori e degli interpreti utilizzati ai livelli alti:

Livelli bassi  programmazione di sistema Livelli alti  programmazione di applicazioni Per migliorare le prestazioni:

i livelli 2 e 3 vengono sempre interpretati;

i livelli 4 e 5 vengono spesso compilati.

Per questioni di efficienza e di “usabilità”:

i linguaggi dei livelli 2 e 3 sono in codifica binaria;

i linguaggi dei livelli 4 e 5 sono testuali (simbolici) cioè composti da parole hanno un senso per l’uomo.

Livello 4: il linguaggio assemblatore

Livello 4 Linguaggio assemblatore

Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo

Traduzione (assemblatore)

(20)

Architettura degli elaboratori

Livello 4: il linguaggio assemblatore

Rappresentazione simbolica di uno dei livelli sottostanti.

I linguaggi binari dei livelli “bassi” sono difficili da usare per un programmatore (... errori di “trascrizione” ...).

A ogni istruzione del linguaggio assemblatore corrisponde una istruzione del linguaggio macchina.

I programmi in linguaggio assemblatore vengono tradotti in un linguaggio di livello inferiore e poi eseguiti. Il programma che esegue la traduzione si chiama assemblatore.

Livello 5: i linguaggi applicativi

Livello 5 Linguaggi applicativi

Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo

Livello 4 Linguaggio assemblatore Traduzione

(compilatore)

(21)

Architettura degli elaboratori

Livello 5: i linguaggi applicativi

Linguaggi di alto livello come C, C++, Java, Ada, LISP, Prolog, ...

Sono utilizzati per la realizzazione di programmi applicativi.

Il più delle volte la traduzione è affidata a un compilatore, mentre in alcuni casi si usa un interprete (e.g. Java)

I linguaggi ad alto livello non fanno parte degli scopi di questo corso.

Livello 6: le applicazioni

Livello 6 Applicazioni specifiche

Livello 1 Microarchitettura Livello 0 Logica digitale Livello 2 Instruction Set Livello 3 Sistema operativo Livello 4 Linguaggio assemblatore

Design e

sviluppo

Livello 5 Linguaggi applicativi

(22)

Architettura degli elaboratori

Livello 6 e oltre: applicazioni specifiche

Es:

adobe photoshop, microsoft word, microsoft powerpoint, libreoffice calc, google chorme, final cut pro,

blender, unity, etc, etc, etc

Spesso attraverso molti livelli intermedi:

librerie, SDK, drivers…

(niente di questo fa parte degli scopi di questo corso)

I livelli: uno schema riassuntivo

Livello 0 Logica digitale

Livello 2 Instruction Set

Interpretazione (microprogramma) o esecuzione diretta

(hardware)

Livello 5 Linguaggi Applicativi

Traduzione (compilatore)

Livello 3 Sistema operativo

Interpretazione parziale (sistema operativo)

Livello 4 Linguaggio Assemblatore

Traduzione (assemblatore)

Livello 1 Microarchitettura

Esecuzione diretta (Hardware)

(23)

Architettura degli elaboratori

I livelli: sommario

I calcolatori sono progettati come una serie di livelli ognuno dei quali si basa sul livello precedente.

Ogni livello rappresenta una diversa astrazione con strutture dati e funzionalità diverse.

L’insieme di tipi di dati, operazioni e caratteristiche di ogni livello prende il nome di ARCHITETTURA.

La descrizione dell’architettura di un livello presenta l’insieme delle

caratteristiche visibili all’utente di quel livello (e.g. ad un programmatore di applicazioni interessa sapere quanta è la memoria disponibile)

I livelli: alcuni Principi generali

Livelli alti:

linguaggi potenti ed espressivi linguaggi più «vicini all’uomo»

sintassi delle istruzioni: intuitiva macchine virtuali

più cross platform (cross.browser, cross OS, …) Livelli bassi:

linguaggi dai comandi semplici linguaggi più «a misura di macchina»

pochi tipi di istruzione base

sintassi delle istruzioni: spesso non intuitiva (non è fatta per noi umani) semantica delle istruzioni: molto semplice

(quindi serviranno più istruzioni per fare le stesse cose) Livello più basso: esecutore hardware (macchina fisica)

(24)

Architettura degli elaboratori

Nota: Hardware vs. Software

Hardware: oggetti tangibili che compongono un calcolatore (circuiti elettronici, memoria, dispositivi di I/O, ...).

Software: programmi, indipendentemente dal supporto su cui sono memorizzati (HD, RAM, CD, ...).

Hardware e software sono logicamente equivalenti

qualsiasi operazione effettuata dal software può essere inglobata nell’hardware (“hardware = software pietrificato”);

qualsiasi istruzione eseguita dall’hardware può essere simulata dal software;

la decisione di realizzare una funzione in hardware o in software dipende da parametri quali il costo, la velocità, l’affidabilità, la frequenza di variazione, ...

perche’ ho voluto vedere un gatto che salta in una scatola e si ribalta Un processore x64 sta sfrecciando a miloni di cicli al secondo per eseguire il kerneL XNU, che gira freneticamente su tutti I livelli di astrazione specificati da Posix per creare il Darwin system su cui poggia os X, che a sua volta si spinge al limite per eseguire firefox e il suo renderer gecko, che crea un oggetto flAsh che visualizza dozzine di fotogrammi video al secondo

Nelle parole di un famoso web-comic…

https://xkcd.com/676/

sono dio

Riferimenti

Documenti correlati

– Nell'istruzione compare l'indirizzo effettivo (fisico) di memoria dove si trova l'operando – MOV AX, [3923:2314].. Modi

All'inizio del ciclo di elaborazione il registro PC (program counter) vale 1, e viene ogni volta incrementato SUBITO DOPO la fase di Fetch: in questo modo, l'esecuzione di

Il programma deve calcolare il valore del massimo numero nella sequenza, e della somma di tutti i numeri della sequenza, e memorizzare questi due valori delle

(b) Un progettista ha stimato che, incrementando il costo, si può ottenere uno a scelta dei seguenti due effetti: incrementare la dimensione della cache di

Il programma deve riempire un secondo array, memorizzato alla locazione “dest” (destinazione), che contenga tutti gli elementi strettamente positivi del primo array,

Premere il tasto Start ha l’effetto di riazzerare il timer e farlo partire (il timer continua a scorrere, anche se il tasto Start viene rilasciato, fino alla pressione del

(c) Se una porta AND (a due ingressi) costa quanto 2 porte NOT, e una porta OR (a due ingressi) costa quanto 3 porte NOT (e non è disponibile nessun altro tipo di porta), quale

Quindi possiamo considerarlo come un solo array, con il doppio degli elementi.. Scandiamo il doppio degli elementi a partire dal