Architettura dei calcolatori

struttura interna dei calcolatori

solo ad alto livello

componenti:

strutturati secondo il modello di Von Neumann


Von Neumann vs. Harvard

modello di Von Neumann:

I/O <--> uc <--> mem

l'alternativa era il modello di Harvard:

I/O <--> uc <--> mem dati
          ^
          |
          V
      mem prog

modello attuale

     bus
---------------
  ^    ^    ^
  |    |    |
  V    V    V
 mem  uc    i/o

una linea unica connette i vari dispositivi

ci passano i dati in uc→mem
ma anche in i/o→uc, ecc.


dispositivi i/o

sono la parte più visibile:

ma anche:

la connessione spesso è bidirezionale anche se non sembra
(es, sulla tastiera ci sono i led)


memoria

      +-------+
   0  |   192 |
      +-------+
   1  |     0 |
      +-------+
   2  |  4032 |
      +-------+
   3  | 10921 |
      +-------+
   .. |  ...  |


valore e indirizzo

                  +-------+
               0  |   192 |
                  +-------+
               1  |     0 |
                  +-------+
indirizzo ---> 2  |  4032<--- contenuto, valore 4032
                  +-------+
               3  |   921 |
                  +-------+
              ... |  ...  |

il contenuto della locazione di indirizzo 2 è il valore 4032


canale di comunicazione: cosa ci passa

+----------+                        +----------+
|          |                        |          |
|          |                        |          |
|          |   indirizzo (numero)   |          |
|          |   rw (booleano)        |          |
|          |   valore (numero)      |          |
|    UC    |<---------------------->|   MEM    |
|          |                        |          |
|          |                        |          |
|          |                        |          |
|          |                        |          |
|          |                        |          |
+----------+                        +----------+


canale di comunicazione: come è fatto

+----------+   indirizzo (numero)   +----------+
|          |----------------------->|          |
|          |----------------------->|          |
|          |----------------------->|          |
|          |                        |          |
|          |   rw (booleano)        |          |
|    UC    |----------------------->|   MEM    |
|          |                        |          |
|          |   valore (numero)      |          |
|          |<---------------------->|          |
|          |<---------------------->|          |
|          |<---------------------->|          |     
+----------+                        +----------+

i numeri (indirizzo e valore) sono rappresentati in binario
sono più bit ognuno

indirizzo
collegamento multiplo da UC a MEM
rw
singolo collegamento da UC a MEM
valore
collegamento multiplo bidirezionale fra UC e MEM

canale di comunicazione: lettura da memoria

      +-------+
   0  |   192 |
      +-------+
   1  |     0 |
      +-------+
   2  |  4032 |
      +-------+
   3  | 10921 |
      +-------+
   .. |  ...  |

esempio:
l'unità centrale richiede il contenuto della cella numero 2


fasi della lettura: invio indirizzo

      +-------+
   0  |   192 |
      +-------+
   1  |     0 |
      +-------+
   2  |  4032 |
      +-------+
   3  | 10921 |
      +-------+
   .. |  ...  |

leggere (non scrivere) l'indirizzo 2

leggere = rw vale true
indirizzo = 2

l'unità centrale invia 2 e true

+----------+ 2    indirizzo         +----------+
|          |----------------------->|          |
|          |----------------------->|          |
|          |----------------------->|          |
|          |                        |          |
|          | true     rw            |          |
|    UC    |----------------------->|   MEM    |
|          |                        |          |
|          |        valore          |          |
|          |<---------------------->|          |
|          |<---------------------->|          |
|          |<---------------------->|          |     
+----------+                        +----------+


fasi della lettura: invio valore

      +-------+
   0  |   192 |
      +-------+
   1  |     0 |
      +-------+
   2  |  4032 |
      +-------+
   3  | 10921 |
      +-------+
   .. |  ...  |

il valore della cella è 4032

la memoria invia il valore 4032

+----------+ 2    indirizzo         +----------+
|          |----------------------->|          |
|          |----------------------->|          |
|          |----------------------->|          |
|          |                        |          |
|          | true     rw            |          |
|    UC    |----------------------->|   MEM    |
|          |                        |          |
|          |        valore <-- 4032 |          |
|          |<---------------------->|          |
|          |<---------------------->|          |
|          |<---------------------->|          |     
+----------+                        +----------+


scrittura in memoria

      +-------+                  +-------+
   0  |  *192*|              *0* |   *34*|
      +-------+                  +-------+
   1  |     0 |               1  |     0 |
      +-------+                  +-------+
   2  |  4032 |      --->     2  |  4032 |
      +-------+                  +-------+
   3  |   921 |               3  |   921 |
      +-------+                  +-------+
  ... |  ...  |              ... |  ...  |

esempio:
l'unità centrale richiede che sia scritto 32 nella cella 0


scrittura in memoria: fasi

      +-------+                  +-------+
   0  |   192 |               0  |    32 |
      +-------+                  +-------+
   1  |     0 |               1  |     0 |
      +-------+                  +-------+
   2  |  4032 |      --->     2  |  4032 |
      +-------+                  +-------+
   3  |   921 |               3  |   921 |
      +-------+                  +-------+
  ... |  ...  |              ... |  ...  |

scrivere, non leggere = rw vale false

l'unità centrale invia i valori 0, false e 32

+----------+ 2    indirizzo         +----------+
|          |----------------------->|          |
|          |----------------------->|          |
|          |----------------------->|          |
|          |                        |          |
|          | true     rw            |          |
|    UC    |----------------------->|   MEM    |
|          |                        |          |
|          | 32 -->  valore         |          |
|          |<---------------------->|          |
|          |<---------------------->|          |
|          |<---------------------->|          |     
+----------+                        +----------+


struttura interna dell'unità centrale

           UC
+------------------------+
| +---+       +---+      |
| |ALU| ----> |REG| ---->|-----> indirizzo
| |   | <---- |   | <--->|<----> dato
| +---+       +---+      |
|    ^         ^         |
|    |         |         |
|   +-----------+        |
|   | controllo | ------>|-----> RW
|   +-----------+        |
+------------------------+

registri


il programma

nell'architettura di Von Neumann, si trova in memoria

è rappresentato da una sequenza di numeri

vengono letti uno per volta


esecuzione del programma

   ...  |   ... |
        +-------+
   132  |  1921 |
        +-------+
   133  |   992 | 
        +-------+
   134  | 10063 |
        +-------+
   135  |    56 |
        +-------+
   ...  |   ... |

la sequenza 1921 - 992 - 10063 - 56 sono quattro istruzioni

l'unità centrale legge 1921 e la esegue

poi legge 992 e la esegue

poi legge 10063 e la esegue

poi legge 56 e la esegue

PC=
l'indirizzo (132, 133, 134,...)
IR=
l'istruzione (1921, 992, 134, ...)

ciclo di esecuzione di un programma

   ...  |   ... |
        +-------+
   132  |  1921 |
        +-------+
   133  |   992 | 
        +-------+
   134  | 10063 |
        +-------+
   135  |    56 |
        +-------+
   ...  |   ... |
sequenza di passi:
PC=132 IR=...
lettura da memoria della locazione 132
incremento PC
PC=133 IR=1921
controllo esegue l'istruzione 1921
lettura da memoria della locazione 133
incremento PC
PC=134 IR=992
controllo esegue l'istruzione 992
...

fasi dell'esecuzione di un'istruzione


fetch

dal punto di vista della memoria è una normale lettura:

PC → MEM
1 → MEM
MEM → IR

dal punto di vista del processore, l'unica differenza è che il valore letto va in IR invece che in uno dei registri generali


decode

sulla base di quello che c'è in IR, il controllo decide cosa fare


execute

il controllo sa quali passi effettuare

es: i valori di due registri vanno ad ALU, che li somma, e il risultato va in un terzo registro

se l'istruzione è una lettura da memoria, allora verrà fatta una seconda lettura


tipi di istruzioni

aritmetiche e logiche
es. somma di due registri, risultato in un terzo
lettura e scrittura da memoria:
mem → reg oppure
reg → mem
input/output:
dispositivo → reg
reg → dispositivo
controllo di esecuzione
permette di implementare condizionali, cicli, ecc.

quelle di controllo non sono semplici come in Python


istruzioni di controllo

di norma, dopo una istruzione si esegue la successiva

es. dopo l'istruzione alla locazione 134 si esegue quella alla locazione 135

esistono solo due tipi di istruzioni per alterare quest'ordine:

entrambi scrivono un valore in PC


salti incondizionati

esempio: salta a indirizzo 291

si esegue mettendo 291 in PC

al prossimo fetch, l'istruzione che verrà eseguita non è quella che si trova all'indirizzo 134 ma quella che si trova all'indirizzo 153

poi prosegue come al solito con l'istruzione all'indirizzo 292, 293 ecc.


salti condizionati

simili, ma il salto si esegue solo in certi casi:


linguaggio macchina

l'unità centrale è in grado di eseguire solo istruzioni molto semplici

un'istruzione Python richiede in genere più istruzioni macchina per venire eseguita


ECAR

esempio di processore semplice, non esiste nella realtà

quattro registri R1, R2, R3, R4

istruzioni molto semplici:

HALT
LOAD X IND
LOADC X VALORE
STORE X IND
ADD X,Y,Z
SUB X,Y,Z
MULT X,Y,Z
DIVIDE X,Y,Z
SQRT X,Y
READ IND
WRITE IND
JUMP IND
JUMPIFZERO X, IND
JUMPIFNEG X, IND

X, Y e Z sono registri


LOAD e LOADC

LOAD R1 121
mette in R1 il contenuto della locazione 121
LOADC R1 121
mette 121 in R1

cambia il metodo di indirizzamento


esempio di programma

READ 1000
READ 1001
READ 1002
LOAD R1 1000
LOAD R2 1001
LOAD R3 1002
ADD R1,R2,R4
ADD R4,R3,R4
STORE R4 1003
WRITE 1003
HALT

somma i contenuti delle locazioni 1000, 1001 e 1002 e scrive il risultato nella locazione 1003

equivalente in Python: d=a+b+c


traduzione in linguaggio macchina

scrivere direttamente in linguaggio macchina è:

di norma si usano linguaggi ad alto livello come Python, Java, C, PHP, ecc.

vengono poi tradotti in modo automatico in linguaggio macchina


soluzioni equazione di secondo grado

se i coefficienti sono alle locazioni 100, 101 e 102:

LOAD R1 100
LOAD R2 101
LOAD R3 102
LOADC R4 4
MULT R2 R2 R2		
MULT R4 R1 R4		
MULT R4 R3 R4		
SUB R2 R4 R4		
JUMPIFNEG R4 1023
SQRT R4 R4		
LOADC R2 0
LOAD R3 101
SUB R2 R3 R2		
LOADC R3 2
MULT R3 R1 R1		
ADD R2 R4 R3		
DIV R3 R1 R3		
STORE R4 103
SUB R2 R4 R3		
DIV R3 R1 R3		
STORE R4 104
WRITE 103
WRITE 104
HALT

richiede che il programma sia memorizzato a partire dalla locazione 1000
(se non è così, la JUMPIFNEG porta alla locazione sbagliata)

conclusione: a parte casi molto particolari, si evita di scrivere programmai direttamente in linguaggio macchina