Sei sulla pagina 1di 6

Il calcolatore digitale moderno nasce all’inizio degli anni ’40 per merito di John von Neumann, J.

Presper Eckert e John William Mauchly. Questi concettualizzarono l’idea di macchina ad accesso
casuale (RAM Random Access Machine).
Tale nomenclatura sta a indicare che il calcolatore ha una memoria organizzata come sequenza di
celle di informazione, in cui il tempo per accedere a una cella non dipende dalla cella stessa: non si
devono scorrere le celle fino a trovare quella cercata, la si accede immediatamente.
Tale macchina `e anche detta macchina di von Neumann, spesso dimenticando i contributi degli
altri sviluppatori dell’idea. La caratteristica fondamentale della macchina di von Neumann `e che la
memoria contiene sia i programmi che i dati. Il programma `e la sequenza di istruzioni che devono
essere eseguite e i dati le informazioni che il programma elabora per produrre il risultato (queste
informazioni includono i dati di ingresso, parte dei dati intermedi (che possono anche essere
memorizzati nei registri interni della CPU per poi essere cancellati (v. oltre) e i risultati della 1
computazione). Questa rappresenta la fondamentale differenza tra le macchine costruite o pensate
fino a quel momento e i moderni calcolatori digitali: il programma memorizzato nella stessa
memoria dei dati e la possibilit`a che un programma modifiche un altro programma e che un
programma ”scriva” nella memoria un altro programma. Pi`u in dettaglio, la macchina di von
Neumann `e strutturata come in figura 1, di cui esaminiamo i dettagli nel seguito. 0 1 2 3 4 996 997
998 999 1000 1 0 1 0 BUS MEMORIA CPU Central Processing Unit Una cella di memoria
Indirizzi Collegamento tra CPU e Memoria PC IR ALU Figure 1: Struttura di base di un
calcolatore. La CPU elabora i dati contenuti nella memoria in parole di lunghezza fissa di cifre
binarie (bit). Ogni parola ha un indirizzo. CPU e memoria sono collegati da un bus su cui transitano
sia indirizzi che dati. 1.1 Memoria La memoria del calcolatore (detta anche memoria centrale) `e
organizzata come sequenza di parole. Ogni parola `e formata da una sequenza di lunghezza finita e
fissata (in fase di progettazione del calcolatore) di simboli che possono essere ’0’ o ’1’. Questi
simboli vengono detti cifre binarie o bit. Ogni parola ha un indirizzo, che identifica univocamente la
parola. L’indirizzo `e l’indice della cella e va da 0 a n − 1 dove n `e il numero di celle di memoria.
La lunghezza tipica di parola `e 8 e viene indicata con il termine byte1 . Il numero di celle
tipicamente utilizzato va da qualche centinaio di milioni di parole a qualche miliardo di parole. La
memoria centrale `e una memoria volatile, ovvero quando il calcolatore viene spento il suo
contenuto viene perduto. L’ipotesi fondamentale sulla memoria `e che il tempo di accesso a una
cella di memoria sia costante, quindi non dipende dal valore dell’indirizzo. Per accedere alla
memoria, cio`e, non si esegue una scansione della memoria per trovare l’indirizzo cercato, ma si
accede direttamente a tale indirizzo. Questa ipotesi serve ad analizzare i programmi in termini di
numero di operazioni eseguite senza tenere conto della sequenza di accessi alla memoria. ***
Questa ipotesi 1Le unit`a di misura per esprimere la quantit`a di memoria sono i kilobyte (KB, 210
= 1024byte ' 103byte byte), i megabyte (MB, 220 = 104485byte ' 106byte byte) e i gigabyte (GB,
230 = 1073741824 ' 109byte byte). 2 pu`o essere accettata solo in prima approssimazione. Esistono
due fondamentali ragioni per cui i tempi di accesso non sono costanti e sono: 1. tra la cpu e la
memoria sono poste delle memorie, dette cache che sono pi`u piccole (perch´e costano) ma pi`u
veloci (perch´e usano una tecnologia specifica) della memoria centrale e servono ad accelerare
l’accesso a dati frequentemente usati; 2. per avere pi`u flessibilit`a la memoria `e gestita dal sistema
operativo utilizzando anche spazi all’interno dei dischi (memoria di massa). *** 1.2 Il bus Quando
un dato viene richiesto dalla memoria (letto) si mansa lungo il bus di comunicazione la codifica
binaria dell’indirizzo (una sequenza di bit che identificano una precisa cella). La memoria rilascia il
dato richiesto sullo stesso bus una volta acceduta la cella. Quando un dato viene scritto, si manda
l’indirizzo come nel caso precedente lungo il bus e successivamente si manda anche il dato da
scrivere. Il bus `e quindi organizzato come linee elettriche parallele che veicolano i segnali
corrispondenti a “0” o “1”. Il bus sar`a formato da una linea per specificare se l’operazione da
compiere `e una lettura o una scrittura e da n linee che trasmetteranno l’informazione relativa a
indirizzi e dati. Date n linee, ci sono 2 n possibili combinazioni di “0” e “1”. Associando a ogni
combinazione uno specifico indirizzo, con n linee possiamo indirizzare 2 n celle di memoria.
Questo `e il motivo per cui le dimensioni delle memoria centrali degli elaboratori sono tipicamente
delle potenze di due: per non sprecare linee di bus (nel caso le celle di memoria fossero meno di 2n)
che indirizzerebbero celle non esistenti o per non sprecare celle di memoria (nel caso le celle di
memoria fossero pi`u di 2n) che non sarebbero indirizzabili. 1.3 Central Processing Unit: Il
processore L’unit`a centrale (CPU), o processore `e la componente pi`u importante del calcolatore.
Essa ha lo scopo di eseguire gli algoritmi, ovvero compiere i passi delle sequenze finite che sono gli
algoritmi. Per fare ci`o esegue un semplice algoritmo chiamato ciclo fetch-decode-execute, che nel
seguito sar`a brevemente illustrato. Nella CPU (cio`e nelle circuiterie che la compongono) sono
contenuti dei registri. Un registro `e una cella di memoria direttamente accessibile alla CPU stessa.
Uno di questi `e il program counter (PC) e contiene l’indirizzo della prossima istruzione da eseguire
(o pi`u probabilmente della prima cella che contiene l’istruzione se questa `e distribuita tra pi`u
celle di memoria contigue). Ricordiamo che le istruzioni sono in memoria centrale, in celle
identificate con indirizzi. La CPU, quindi, accede alla memoria per ottenere questa istruzione 3
(magari con una sequenza di accessi, ma concettualmente non `e necessario ipotizzarlo) e la mette
in un altro registro che `e detto instruction register (IR). Questa si chiama fase di fetch, quindi di
reperimento dell’istruzione. Nella fase successiva l’istruzione contenuta nell’IR viene decodificata
(decode), ovvero viene identificato il tipo di istruzione (somma?, prodotto?, accesso a memoria?
salto?, etc.) e l’istruzione stessa viene eseguita (execute) attraverso la ALU (Arithmetic and Logic
Unit), una circuiteria progettata allo scopo di calcolare semplici funzioni come, ad esempio, quelli
per sommare due numeri, confrontarli, farne il prodotto, accedere alla memoria in un determinato
indirizzo per recuperare un dato, etc. Ogni istruzione ha degli operandi che dipendono dalla
istruzione stessa: una somma potr`a avere l’indirizzo (di memoria o di un registro interno2 ) dei due
termini e l’indirizzo (di memoria o di un registro interno) dove riporre il risultato; un caricamento
dalla memoria avr come operando l’indirizzo del dato da caricare, etc.). Gli operandi sono
(tipicamente) dati, non istruzioni. Alla fine di questo processo il program counter viene
incrementato per contenere l’indirizzo della prossima istruzione (ad esempio sommando
all’indirizzo attualmente contenuto la lunghezza, in parole di memoria, dell’istruzione appena
eseguita). Questi quattro punti costituiscono i passi che l’unit`a centrale esegue per eseguire
l’algoritmo che `e stato memorizzato in memoria. Le istruzioni dell’algoritmo da eseguire sono
contenute in memoria centrale e sono quindi rappresentate tramite una sequenza di bit. Una tipica
istruzione `e strutturata come segue opcode operandi... Per opcode si intende una sequenza di bit
che identifica in modo univoco il tipo di istruzione e i tipi degli operandi che essa usa. Nella parte
relativa agli operandi sono contenute le specifiche degli operandi dell’istruzione. L’insieme degli
opcode e i possibili operandi formano quello che viene chiamato linguaggio macchina. I primi
calcolatori costruiti venivano effettivamente programmati inserendo nella memoria le sequenze di
bit corrispondenti alle istruzioni da eseguire. Successivamente `e stato introdotto il linguaggio
assembly (o, pi`u impropriamente, assembler). Tale linguaggio associa a ogni opcode un codice
mnemonico (ad esempio “ADD” per l’addizione, “SUB” per la sottrazione, “LOAD” per il
caricamento dalla memoria e “STORE” per la memorizzazione, etc.). Gli operandi vengono
specificati anch’essi con dei simboli mnemonici, ad esempio “R1”, “R2”, etc. possono indicare i
registri interni, mentre con “(R1)” e “(R2)”, etc. si potrebbe indicare che i registri R1, R2, etc.
contengono l’indirizzo di un dato nella memoria centrale, e cos`ı via. A parte il fatto contingente,
ovvero quali simboli vengono usati per indicare le varie parti di una istruzione, cosa che non ci
interessa direttamente e comunque `e diverso da un tipo di calcolatore a un altro, l’importante `e
notare 2La CPU contiene, tipicamente, un numero limitato di registri immediatamente disponibili
che contengono dati che possono essere immediatamente utilizzati senza accedere alla memoria. Il
numero varia da calcolatore a calcolatore e varia generalmente tra 16 e 64, rimanendo tipicamente
delle potenze di 2. 4 che il linguaggio assembly ha cambiato il modo di programmare. Si ha infatti
che, disponendo di un programma per digitare dei testi, `e possibile scrivere un testo con le
istruzioni mnemoniche da eseguire. Questo testo viene successivamente dato in pasto a un
programma, che si chiama assemblatore che lo elabora producendo il programma in linguaggio
macchina (sequenza di bit!). Il tutto senza dover mai ricorrere ad apparecchiature esterne al
calcolatore stesso: con il calcolatore si possono scrivere i programmi che verranno dal calcolatore
stesso eseguiti! Questa pu`o essere vista come una conseguenza del fatto che i programmi sono
memorizzati in memoria come se fossero dati. Tra le istruzioni ne esiste una categoria
particolarmente importante rappresentata dalle istruzioni di controllo, o istruzioni di salto. Queste
istruzioni hanno lo scopo di modificare il program counter. L’ultimo passo (il quarto) del ciclo
fetch-decode-execute (ovvero l’aggiornamento di PC), non viene eseguito e, al suo posto, il
program counter viene modificato a seconda dell’esito di queste istruzioni. Esistono istruzioni di
salto incondizionato (JMP) che semplicemente reimpostano PC, e istruzioni di salto condizionato,
in cui l’aggiornamento di PC avviene solo se una certa condizione `e verificata (ad esempio se il
risultato di una operazione precedente ha prodotto un risultato di un certo tipo (positivo, negativo,
nullo, etc.)). Se la condizione non `e verificata, PC viene aggiornato nel modo usuale. Queste
istruzioni sono quelle che consentono di realizzare a) i cicli, ovvero ripetizioni di istruzioni fino al
verificarsi di una condizione, e b) istruzioni condizionali del tipo “se `e verificata una condizione
esegui A altrimenti esegui B”. Si pu`o vedere che sono proprio queste istruzioni che rendono il
calcolatore appena descritto in grado di eseguire qualsiasi algoritmo (calcolare qualsiasi funzione)!
2 Dispositivi Il calcolatore visto nella precedente sezione non pu`o comunicare con l’esterno. Per
fare ci`o ha bisogno di dispositivi di ingresso-uscita, detti anche di inputoutput o I/O (leggi `ai-´o).
In figura 2 `e presentato uno schema concettuale di un calcolatore dotato di questi dispositivi. I
dispositivi si differenziano in categorie: a) di solo ingresso (tastiera, mouse, etc.), b) di solo uscita
(monitor, stampante, etc.) o ingresso e uscita(modem, scheda di rete, etc.) *** Come mostrato in
figura, ma non `e sempre cos`ı, i dispositivi sono collegati allo stesso bus cui `e collegata la
memoria centrale. Quello che accade `e che certi indirizzi, prefissati, siano associati non alla
memoria ma ai dispositivi. Per scrivere un carattere sul monitor si deve scrivere negli indirizzi di
memoria assegnati al monitor, ottenere un dato dalla tastiera corrisponde a leggere un dato da un
indirizzo associato alla tastiera, scambiare dati tramite la rete significa leggere e scrivere dati sugli
indirizzi della scheda di rete, etc. Alternativamente pu`o essere realizzato un bus (diverso da quello
che collega la memoria) che collega solo i dispositivi (questo `e l’approccio utilizzato tipicamente
dai personal computer. *** Vediamo ora, rapidamente, alcuni dispositivi a cui accenneremo pi`u in
l`a nel 5 CPU MEM Disco fisso Tastiera Monitor BUS Figure 2: Struttura di base di un calcolatore
con dispositivi di ingresso/uscita. I dispositivi possono essere di ingresso (tastiera, mouse, etc.), di
uscita (monitor, stampante, etc.) o entrambi (modem, scheda di rete, etc.) corso. 2.1 Le unit`a a
disco Le unit`a a disco sono tra i pi`u comuni dispositivi di memorizzazione per grandi quantit`a di
dati (1G-300GB). I dati memorizzati non vengono persi quando il dispositivo viene spento, si tratta
quindi di memoria non volatile o permanente. Il disco fisso (hard-disc), presente in tutti i personal
computer, nelle workstation e nei supercomputer, viene per questo spesso definito dispositivo di
memoria di massa. I dischi (vedi figura 3) sono organizzati in cilindri (le superfici dei piatti
accessibili alle testine), in tracce (corone circolari di spessore prefissato) e in settori (settori circolati
in cui vengono divise le superfici dei cerchi). Una terna (cilindro, traccia, settore) identifica una
parola sul disco (come in un sistema di coordinate). Il controllore del disco (il circuito che si occupa
di accedere fisicamente ai dati memorizzati sulle superfici) riceve in ingresso le coordinate e
restituisce i dati nel caso di lettura e scrive dei dati in caso di scrittura. La terna di coordinate si
comporta, di fatto, come l’indirizzamento nella memoria centrale, ma si noti che il tempo di accesso
a un dato dipende da dove `e il dato al momento della richiesta. La testina deve muoversi sulla
traccia giusta e poi attendere che il settore richiesto le passi sotto. Il tempo di accesso, quindi, non
`e costante e indipendente dall’indirizzo. I dischi possono essere, sostanzialmente, di due tipi:
magnetici e ottici. I dischi magnetici (hard-disc, floppy-disc, . . . ) differenziano i valori “0” e “1” in
base all’orientazione di un campo magnetico, mentre i dischi ottici (CD, DVD, . . . ) in base alle
caratteristiche di riflessione della luce sulla superficie. 2.2 Tastiera e mouse La tastiera e il mouse
sono gli strumenti pi`u comuni di interazione tra uomo e macchina. Premere un tasto sulla tastiera
significa spedire il codice relativo al tasto premuto, che deve quindi poi essere tradotto nel carattere
corrispondente al tipo si tastiera utilizzato. Il mouse, invece, manda al calcolatore l’informazione
sulla distanza relativa percorsa dall’ultima rilevazione (in termini sempre di sequenza di bit e quindi
la misura `e discreta (quantizzata)). 6 Settore Traccia Testina Figure 3: Un disco `e organizzato in
cilindri (le superfici dei cerchi accessibili alle testine), tracce (le corone circolari) e in settori (i
settori circolari). 2.3 Monitor Il monitor risponde a segnali del tipo ”accendi un pixel in x,y” (il
”pixel” `e l’elemento minimo visualizzabile) in una certa posizione. Per scrivere un carattere
alfanumerico, quindi, `e necessario accendere tutti i pixel che lo compongono. Non `e detto che
questa sia l’esatto modo in cui il monitor “dialoga” con il computer, ma ad un certo livello `e
sicuramente questo che viene comunicato al dispositivo. Quello che viene detto pennello elettronico
scorre per riche lo schermo e quando il pixel richiesto `e raggiunto viene emesso un fascio di
elettroni che lo accendono (questo ovviamente nel caso di monitor a tubo catodico). 2.4 Conclusioni
I dispositivi dialogano con il calcolatore in modi spesso molto complessi e, di sicuro, il
programmatore non pu`o e non vuole prendersi cura di tutti questi dettagli. Vedremo che questa
grande complessit`a viene mascherata da dei livelli di astrazione che consentono all’utente di
scrivere delle frasi sullo schermo, di accedere a dei file sul disco, alle coordinate del puntatore del
mouse sullo schermo,etc. Questa astrazione viene fornita dal sistema operativo, un programma
speciale che ha il ruolo far percepire il calcolatore digitale come una macchina in grado di
comunicare col mondo esterno, e anche con gli esseri umani, con interfaccie di pi`u facile utilizzo.