Dispense per il corso di terza area
Com’è fatto l’hardware
La macchina di Von Neumann
Sostanzialmente tutti i computer sono realizzati sulla base allo schema proposto nel 1946 dallo
scienziato John Von Neumann.
La macchina di Von Neumann è composta come illustrato nella figura seguente.
La macchina di Von Neumann è costituita da cinque elementi funzionali che svolgono un ruolo
specifico.
Memoria interna
Contiene tutto il necessario all’esecuzione di un programma: i dati e le istruzioni. Spesso indicata
con l’acronimo RAM, dall’inglese Random Access Memory, che potrebbe essere tradotto come
memoria ad accesso diretto; viene anche detta memoriacentrale. Un programma in esecuzione deve
essere contenuto nella memoria centrale. È di tipo volatile, ossia perde il suo contenuto quando il
computer viene spento.
Bus di sistema
Ha la funzione di connettere tra loro gli altri elementi funzionali permettendo un scambio di dati fra
questi.
Unità centrale di elaborazione o processore
Svolge le elaborazioni e controlla il trasferimento dei dati e programmi tra le altre componenti. È
l’elemento funzionale che esegue i programmi. Spesso è chiamata CPU, acronimo inglese di
Central Processing Unit.
Memoria esterna
Contiene dati e programmi in forma persistente, ossia indipendentemente dallo stato di acceso o di
spento del computer. Solitamente indicata come memoria di massa perché la sua capacità è
tipicamente molto più grande di quella della RAM. Ha tempi di accesso molto più lenti di quelli
della RAM.
Interfaccia alle periferiche
È la parte che gestisce tutte le periferiche di comunicazione con l’ambiente esterno. Si noti che le
periferiche, ad esempio tastiera video o mouse, sono considerate dispositivi distinti dal computer.
La memoria centrale
La memoria centrale è costituita da una sequenza ordinata di celle che sono in grado di
memorizzare una parola (word) e che sono identificate univocamente da un indirizzo. Il numero di
bit che compone una parola dipende dall’architettura del computer, solitamente è di alcuni byte (8
bit). Le lunghezze di parola più comuni sono uno, due, quattro oppure otto byte. Ogni cella di
memoria ha un indirizzo predefinito, e rappresenta l’unità minima di memoria che la CPU riesce a
accedere.
La CPU è responsabile della gestione dei dati contenuti nella RAM. Il numero di volte che ogni
singola cella può essere letta o scritta è sostanzialmente illimitato. Ogni singola cella può essere
acceduta direttamente per mezzo del suo indirizzo univoco, per questo la RAM prende anche il
nome di memoria ad accesso diretto. La traduzione letterale dall’inglese può essere fuorviante,
perché un accesso casuale alla memoria sarebbe completamente inutile.
Le celle di memoria sono realizzate tramite dispositivi a semiconduttori, ossia con tecnologia basata
su transistor, e hanno bisogno di essere continuamente alimentate da energia elettrica per preservare
il loro contenuto. Una mancanza di alimentazione comporta la perdita del contenuto della RAM,
che quindi è detta anche memoria volatile. Il contenuto della memoria al momento dell’accensione
del computer non è significativo.
Il bus di sistema
Il bus connette tra loro, in modo sincrono, le altre unità funzionali. Ad ogni quanto di tempo il bus
connette tra loro due unità funzionali, una invia e l’altra riceve. Il bus è controllato dalla CPU. Le
varie unità funzionali connesse al bus entrano in funzione solo quando sono selezionate dalla CPU.
Il bus di sistema è costituito da tre tipologie di connessioni elementari specializzate:
bus dati: fa transitare sia il contenuto del registro dati dalla CPU a una delle altre unità funzionali,
sia da una di queste al registro dati della CPU;
bus indirizzi: fa transitare dalla CPU verso la memoria l’indirizzo della parola che viene acceduta;
bus controllo: fa transitare dalla CPU a una delle altre unità funzionali il codice della operazione da
eseguire, e dalla unità funzionale il codice risultato dell’operazione.
La presenza di più linee di connessione elementari per ogni tipo di bus permette la trasmissione
contemporanea dei bit, ossia uno per ogni linea in uno stesso quanto di tempo. Se il bus non ha
sufficienti linee di connessione, è costretto a effettuare più trasmissioni, una per ogni quanto di
tempo.
Nella figura seguente le linee di indirizzo connettono solamente il processore e la memoria interna,
e sono rappresentate con una linea continua, le linee di dati e controllo connettono tutte le
componenti della macchina e sono rappresentate, rispettivamente, con una linea tratteggiata e una
linea punteggiata.
La CPU
La figura seguente mostra i principali elementi costitutivi di una CPU.
Unità di controllo
Regola l’esecuzione del ciclo della CPU, e invia i segnali di controllo per i trasferimenti sul bus.
Decodifica le istruzioni e gestisce sia i trasferimenti all’interno della CPU sia quelli con il mondo
esterno.
Orologio o clock
Stabilisce l’ampiezza del quanto di tempo, ossia la frequenza di sincronia del sistema.
Unità logico aritmetica, ALU (Arithmetic Logic Unit)
Realizza le operazioni aritmetiche e quelle logiche. In figura è mostrata una ALU con due operandi
capace di eseguire una delle quattro operazioni aritmetiche in un quanto di tempo. Il risultato
dell’operazione viene memorizzato nel registro A.
Registri
Sono memorie locali che possono essere accedute alla velocità del clock della CPU, mentre quelle
della RAM sono accessibili alla velocità del clock del bus, solitamente molto più lento, attraverso le
operazioni di lettura e scrittura descritte in precedenza. I registri principali sono:



registro dati (RD): già descritto in precedenza, ha un numero di bit prefissato che coincide
con una parola della memoria centrale;
registro indirizzi (RI): già descritto in precedenza, ha un numero di bit prefissato che
coincide con l’indirizzo massimo accessibile in memoria. Si noti che non sempre il
computer è dotato di tutta la RAM indirizzabile;
registro istruzione corrente (RIC): contiene l’istruzione in esecuzione nel quanto di tempo
corrente, ha la stessa lunghezza di una parola della memoria centrale;




contatore di programma (PC): contiene l’indirizzo in memoria centrale relativo alla
prossima istruzione da eseguire, ossia quella che verrà letta all’inizio del prossimo ciclo
della CPU. Ha la stessa lunghezza del registro indirizzi;
registro interruzioni (RINT): contiene alcune dati relativi allo stato di alcune periferiche,
come si vedrà successivamente;
registri operandi: contengono gli eventuali operandi e risultato dell’istruzione in esecuzione.
Nell’esempio sono indicate con A e B;
registro di stato (RS): contiene indicazioni sulle operazioni svolte dalla ALU, quali, ad
esempio:
o il risultato è troppo grande per essere rappresentato, overflow dell’operazione;
o segno del risultato se l’operazione è andata a buon fine;
o in A c’è un valore nullo;
o l’operazione ha generato un riporto.
La memoria di massa
Non è strettamente necessaria al funzionamento della macchina di Von Neumann, quindi potrebbe
anche essere considerata una periferica. Questa trattazione presenta la memoria esterna come
elemento funzionale nel modello della macchina perché altrimenti questa sarebbe risultata priva di
una componente indispensabile dal punto di vista della sua utilizzabilità.
La caratteristica della memoria di massa è di essere permanente, ossia di conservare il proprio
contenuto anche quando il computer viene spento. Solitamente la memoria di massa ha una capacità
molto più grande di quella della memoria centrale. I tempi di accesso al contenuto della memoria di
massa sono molto più lenti rispetto a quelli della memoria centrale.
La memoria magnetica
Storicamente la prima forma di memoria di massa nei personal computer è stato il floppy disk. Dal
punto di vista tecnologico il floppy disk conserva i bit tramite magnetizzazione, assegnando un
valore binario ad ognuno dei due poli. Strutturalmente un floppy disk è un disco forato al centro con
la superficie magnetizzabile. Il disco ruota sul suo asse e una testina di lettura/scrittura può
muoversi radialmente su di esso per mezzo di un braccio meccanico che la sostiene. La testina si
muove a scatti, posizionandosi solamente sulle tracce.
Affinché un floppy disk possa essere utilizzato per la memorizzazione deve contenere dei
riferimenti, che vengono registrati tramite l’operazione di inizializzazione, in inglese format.
L’inizializzazione registra sulla superficie magnetica dei settori radiali, tutti della stessa ampiezza
angolare. Le tracce, invece, sono concentriche e intersecano i settori a formare i blocchi, ogni
blocco ha un indirizzo e può contenere alcune centinaia di byte.
La scrittura di dati su disco può occupare diversi blocchi, per questo ogni disco ha un indice, in
inglese FAT (File Allocation Table), che indica il primo blocco che contiene i dati. Ogni blocco
indica il suo successore, sino all’ultimo blocco, che non ha successori. L’insieme dei blocchi che
immagazzina un insieme di dati prende il nome di file. Sia i dati che i programmi sono quindi
memorizzati su floppy sotto forma di file.
Hard disk
Il disco rigido, o hard disk, è una estensione del floppy disk. Dal punto di vista strutturale un disco
rigido è una pila di dischi leggermente distanziati tra loro, ognuno dei quali è organizzato in tracce e
settori. I dischi ruotano su un asse comune (coassialmente) e sono letti e scritti da un gruppo di
testine solidali tra loro. La meccanica di un disco rigido è molto più precisa e delicata rispetto a
quella di un floppy disk, quindi il gruppo dischi e testine è sigillato in un contenitore che li protegge
dagli agenti esterni.
Il vantaggio di memorizzare i file secondo lo schema dei blocchi concatenati tra loro, come
descritto in precedenza per i floppy disk, permette la flessibilità della memorizzazione sia nel
numero di file che nella loro dimensione. Tipicamente un file di dati può variare di dimensioni tra i
diversi salvataggi in memoria di massa. Nel caso di un aumento di dimensioni del file alla catena
originaria di blocchi ne vengono accodati quanti sono necessari a contenere il nuovo file. Nel caso
un file subisca una riduzione i blocchi superflui verrebbero messi nuovamente a disposizione per un
uso successivo. Anche il numero di file che una unità di memoria di massa può contenere è
variabile, ed è limitato solo dal massimo numero di indici contenibili nella sua FAT.
Controller
Sia i floppy disk che i dischi rigidi sono unità indipendenti dalla CPU, nel senso che la CPU effettua
operazioni di lettura e scrittura di file senza minimamente avere nozione di quali e quanti blocchi
questi occupino su disco. Una interfaccia apposita, il controller, provvede a gestire il flusso di dati
da e verso la CPU.
CD, DVD e altre memorie di massa
Supporti ottici
Il principio fisico di immagazzinamento dei bit nei supporti ottici, quali ad esempio CD e DVD , si
basa sulla luce laser. Il disco presenta delle zone opache ed altre riflettenti, un raggio laser può
essere assorbito o riflesso da queste superfici, codificando in questo modo le due cifre binarie. La
rotazione del disco espone al raggio laser, nel tempo, una porzione piuttosto ampia della sua
superficie.
I CD per la memorizzazione di dati sono prodotti con la stessa tecnologia di quelli musicali, e
possono contenere sino a 0.8 GByte. I CD si dividono in due categorie principali: riscrivibili e
registrabili. I CD-ROM sono registrabili e possono essere scritti una sola volta; vengono spesso
utilizzati per le copie di archiviazione di dati e programmi, i cosiddetti backup. I CD riscrivibili,
detti CD-RW, possono essere cancellati e registrati numerose volte. I tempi di accesso ai dati non
sono comunque paragonabili a quelli di un disco rigido, ma sono molto più alti.
I DVD sono dischi ottici di grande capacità, normalmente possono contenere sino a 4.7 GByte di
dati. Sfruttano una tecnologia più evoluta di quella dei CD, ma il principio di funzionamento è
analogo.
Nastri o cassette
Sono nastri magnetici il cui principio di funzionamento è simile a quello dei nastri audio e video.
Un nastro ricoperto di materiale magnetizzabile viene fatto scorrere a contatto di una testina di
lettura-scrittura. I file vengono memorizzati in sequenza su porzioni di nastro.
La differenza principale dai supporti rotanti è il tipo di accesso ai dati, che è sequenziale. Per
leggere un certo file occorre leggere anche tutti i file sul nastro che lo precedono nella registrazione.
Un’altra differenza è nella flessibilità sulla dimensione dei file, aumentare la dimensione di un file
potrebbe significare riscriverlo in fondo al nastro, portando alla inutilizzazione di parte del nastro.
Nel caso di riduzione della lunghezza del file si potrebbe sprecare la parte del nastro non più
occupata.
Le porte di comunicazione
Sono collegamenti a cui vengono collegate periferiche, solitamente per mezzo di cavi.
Seriale e parallelo
I bit di una parola possono essere trasmessi verso le periferiche, o da queste verso la CPU,
contemporaneamente in un intervallo (un "quanto") di tempo, oppure uno per volta, in tanti
intervalli di tempo quanti sono i bit della parola. Nel primo caso si parla di connessione parallela,
nel secondo di connessione seriale. Entrambe queste connessioni solitamente permettono un
collegamento uno-a-uno tra il computer e la periferica.
Le porte seriali sono spesso identificate con la sigla RS-232-C, e sono utilizzate per il collegamento
ad alcuni tipi di stampanti, a modem e, in generale, a dispositivi esterni. Un collegamento seriale
utilizza due linee per la trasmissione e la ricezione, e invia un bit per volta.
Le porte parallele, spesso chiamate centronics, sono utilizzate per il collegamento a stampanti e ad
alcuni dispositivi di memorizzazione esterni. Un collegamento parallelo trasmette un numero
maggiore di uno di bit (ad esempio otto) per volta, risultando solitamente più veloce di quelli seriali.
Alcuni dispositivi esterni sono connessi al computer tramite collegamento SCSI (Small Computer
System Interface) che offre la possibilità di collegare in cascata diverse periferiche alla stessa porta
del computer, tipicamente fino ad un massimo di otto periferiche.
Questo tipo di connessioni inizia ad essere in disuso.
USB e firewire
Queste tipologie di connessione condividono diverse caratteristiche:
permettono la connessione in cascata di dispositivi, anche di alcune centinaia;
sono molto più veloci delle porte seriali e parallele;
permettono di aggiungere e rimuovere periferiche con il meccanismo detto di hot plugin, ossia con
il computer acceso;
possono alimentare di energia elettrica le periferiche connesse.
Le porte USB permettono di collegare in cascata fino a 127 periferiche, sono utilizzate per
dispositivi che non necessitano il trasferimento di grosse quantità di dati. Il collegamento firewire,
noto anche come IEEE 1394, permette di collegare in cascata sino a 63 dispositivi, e offre una
capacità di trasmissione adatta a supportare il traffico di grosse quantità di dati, quali, ad esempio,
quelli generati da dischi rigidi, telecamere e fotocamere.
Wireless (senza fili)
Alcune nuove tecnologie permettono di collegare il computer ad alcune periferiche senza ausilio di
cavi. Tra queste tecnologie ricordiamo Bluetooth, che viene utilizzata per il collegamento di
periferiche vicine, quali telefoni cellulari o stampanti, e quella cosiddetta Wi-Fi, che utilizza onde
radio per connessioni di media distanza.
Principali periferiche di input/output
Periferiche di Input
Sono periferiche che permettono di inviare dati e comandi al computer. Tipicamente queste
periferiche sono di carattere asincrono rispetto all’orologio di sistema. Quando una periferica di
input ha necessità di inviare dati al computer, segnala con un interrupt alla CPU il suo stato. La
CPU che riceve un interrupt di input può sospendere temporaneamente l’attività in corso per
soddisfare la richiesta della periferica e successivamente riprendere l’elaborazione sospesa.
Le più comuni periferiche di input sono:
Tastiera e mouse sono i dispositivi di input più utilizzati. Vale la pena sottolineare che un esperto
dattilografo è in grado di scrivere alla velocità di poco più di cento battute al minuto, mentre la CPU
ha un orologio interno con una frequenza dell’ordine di grandezza del miliardo di oscillazioni al
secondo;
joystick: concettualmente sono simili ad un mouse e permettono di spostare il cursore sullo
schermo;
tavolette grafiche e touch screen: riconoscono la pressione di una penna speciale o delle dita su di
una superficie. Spesso sono collegati a programmi per riconoscere la calligrafia dell’utente;
scanner: permettono l’acquisizione di immagini con un meccanismo molto simile a quello delle
fotocopiatrici. Se l’immagine scandita è una pagina di testo, questo può essere riconosciuta come
tale per mezzo di appositi programmi, i cosiddetti OCR (Optical Character Recognition);
riconoscimento vocale: l’utente impartisce i propri comandi tramite un microfono e il test parlato
viene riconosciuto come se fosse digitato da tastiera.
Periferiche di output
Sono le periferiche che mostrano all’utente l’esito delle elaborazioni. Le due periferiche di output
per antonomasia sono lo schermo e la stampante. Saranno analizzate nelle prossime pagine.
Discretizzazione grafica
Le immagini sono un esempio eclatante degli effetti della discretizzazione imposta dall’uso del
computer. Una qualsiasi figura geometrica che dovessimo immaginare sarebbe quasi sicuramente
un oggetto "continuo", sia perché lo spazio è continuo, sia per nostra consuetudine mentale. Con
l’utilizzo del computer, invece, il concetto di "continuo" può al più essere approssimato con una sua
interpretazione discreta (discretizzazione).
Immaginiamo di voler disegnare con una matita su un foglio di carta un segmento che congiunge
due punti. Indipendentemente dall’inclinazione risultante il segmento viene sempre della stessa
forma e dimensione. In questo caso la discretizzazione si effettua immaginando di sovrapporre al
foglio da disegno un reticolo di quadretti isomorfi. Ogni segmento può quindi essere rappresentato
annerendo i quadretti più vicini al segmento ideale, uno per ogni coordinata lungo l’asse con cui il
segmento forma un angolo minore.
La figura seguente mostra la discretizzazione di diversi segmenti, della stessa lunghezza, inclinati
differentemente. Si noti che i segmenti nel continuo sono di lunghezza uguale tra loro, ma che al
variare della loro inclinazione rispetto agli assi può cambiare il numero di quadratini utilizzati per
rappresentarli nella nostra discretizzazione. Quando il segmento è orizzontale o verticale viene
rappresentato con 13 quadratini, quando è inclinato il numero di quadratini varia da un minimo di 9
a un massimo di 12. Anche la forma assunta dalla sequenza di quadratini, pattern, cambia con
l’inclinazione dei segmento. La circonferenza viene rappresentata con gli stessi quadratini che
verrebbero disegnati volendo rappresentare un ottagono regolare. Gli assi cartesiani sono quelli di
uno schermo, e hanno l’asse delle ordinate che punta verso il basso e non verso l’alto come accade
usualmente. Lo zero del sistema di riferimento è posto in alto a sinistra rispetto alla quadrettatura
del foglio.
Schermo
Pixel
Nel caso del video di un computer i quadratini dell’esempio precedente prendono il nome di pixel,
dall’inglese picture element. Il pixel è la minima unità disegnabile su di uno schermo, può assumere
diversi colori, ma non può essere acceso solo in parte. In un certo senso il pixel è una entità binaria.
In qualsiasi forma di discretizzazione a video di elementi grafici i pixel svolgono un ruolo
fondamentale. La risoluzione di uno schermo è il numero di pixel nell’unità di misura. Maggiore è
questo numero, minore si noteranno i singoli pixel, ossia minore sarà l’effetto "calettatura" dato
dalla discretizzazione. La risoluzione si misura in dpi, ossia dots per inch.
CRT
Nei monitor a raggi catodici, CRT dall’inglese Cathode Ray Tube, ogni singolo pixel è formato
dalla convergenza di tre fasci di elettroni, di diversa intensità, che attivano fosfori di tre colori base
per formare il colore del pixel. La tecnologia utilizzata è la stessa dei televisori, ma con una
maggiore risoluzione. La risoluzione varia dai 72 ai 96 dpi.
I CRT sono molto ingombranti e pesanti e consumano molta energia, ossia scaldano. Questa
tecnologia sta cedendo il passo alle altre, tranne che in alcuni settori di nicchia.
LCD
Sono formati da tre sottili strati colorati e semitrasparenti, ogni pixel è dato dalla sovrapposizione
dei pixel corrispondenti su ogni strato colorato. La geometria del singolo pixel è particolarmente
precisa, a differenza di quanto accade per i CRT, dove la convergenza dei tre fasci luminosi può
risultare non molto accurata. La risoluzione può andare oltre i 100 dpi.
Consumano pochissimo, sono sottilissimi e il loro costo sta rapidamente decrescendo.
Plasma
Sono formati da due pannelli di vetro che racchiudono dei gas tra loro. Quando i pannelli vengono
alimentati elettricamente generano raggi ultravioletti che stimolano fosfori dei colori di base.
Attualmente vengono utilizzati per grandi pannelli.
Stampante
Le stampanti sono il dispositivo di output più utilizzato dopo lo schermo. Ci sono diverse
tecnologie per stampare su carta e diversi formati di carta.
La risoluzione di una stampante si misura in dpi. La risoluzione di una stampante è solitamente
molto maggiore a quella di uno schermo.
Laser
La tecnologia delle stampanti laser si basa su un cilindro rotante, detto tamburo, illuminato da un
sottile raggio laser. Nel punto in cui il raggio laser colpisce il tamburo si genera una carica
elettrostatica che attrae un inchiostro in polvere, detto toner. Ogni punto lasciato dal raggio laser sul
tamburo produrrà un punto come risultato finale su carta. A seguito di pressione e calore il toner
viene trasferito dal tamburo alla carta.
La risoluzione di una stampante laser può andare dai 300 ai 2400 dpi.
Getto di inchiostro
Le stampanti a getto d’inchiostro utilizzano micro-gocce di inchiostro per ogni punto che vogliono
lasciare sulla carta. Un carrello fa muovere orizzontalmente la testina di stampa sul foglio di carta
che avanza in modo da poter disegnare punti in qualsiasi posizione del foglio.
Impatto
Un martelletto di una testina di stampa batte su un nastro inchiostrato che a sua volta batte sul foglio
di carta lasciando un’impronta. Il movimento della testina di stampa e del foglio di carta è analogo a
quello delle stampanti a getto di inchiostro. Il martelletto può avere una forma predefinita, oppure
essere formato da una matrice di aghi, 9 o 24, che sporgono o si ritraggono per formare la porzione
di foglio da stampare.
Classificazione dei computer
Lo schema seguente riporta una possibile classificazione dei computer in base alla potenza di
calcolo. Tale schema non è esatto e rigido, viene presentato solo come possibile riferimento.
Supercomputer
Sono i più potenti computer disponibili. Possono contenere da qualche migliaio a diverse centinaia
di migliaia di processori, e sono in grado di svolgere 1015, ossia un milione di miliardi di operazioni
al secondo. Vengono utilizzati per elaborazioni che richiedono un enorme quantitativo di calcoli,
quali, ad esempio, previsioni del tempo, progettazioni di velivoli o simulazioni di realtà complesse,
ad esempio in cinematografia. Hanno costi che possono arrivare alle decine di milioni di euro.
Mainframe
Sono una tipologia di computer che era molto diffusa alcuni anni addietro. Solitamente sono
impiegati da grosse organizzazioni che gestiscono, con continuità, grandi quantità di dati. Hanno
costi che possono arrivare a qualche milione di euro. Per la loro gestione è necessario un gruppo di
personale specializzato. Spesso gli utenti accedono al mainframe per mezzo di terminali, ovvero
piccoli calcolatori periferici connessi da una rete di comunicazione.
Workstation
Questa tipologia di computer è stata introdotta negli anni ottanta. Eroga una potenza di calcolo
inferiore a quella di un mainframe, con prezzi più bassi e minore richiesta di risorse. Viene
utilizzato nella progettazione o nella produzione assistita al computer, rispettivamente CAD,
Computer Aided Design, e CAM, Computer Aided Manifacturing. I costi delle workstation sono
dell’ordine di grandezza delle decine di migliaia di euro. Le prestazioni della fascia bassa di questa
categoria si sovrappongono a quelle di punta dei personal computer.
Personal computer
Computer di costo e dimensioni contenuti, introdotti all’inizio degli anni ottanta, adatto all’uso
personale sia domestico che lavorativo. Il costo è dell’ordine di grandezza di alcune migliaia di
euro. Alcuni personal computer sono portatili, ossia hanno dimensioni e peso che permettono
all’utente di trasportarli manualmente e frequentemente.
Appartengono a questa categoria anche i PDA, personal digital assistant, gli smartphone e i
palmari.
Microcontroller
Sono i computer invisibili, ossia quelli che vengono utilizzati per governare il funzionamento di un
altro strumento. Il loro costo è una frazione minimale di quello dello strumento nella sua interezza.
Schema a livelli gerarchici
La figura seguente rappresenta le relazioni fra le diverse entità analizzate sino ad ora. Ogni
elemento della figura ha una interfaccia con quelli che gli sono a contatto. Possiamo pensare che
l’interazione possa avvenire solo attraverso i piani orizzontali.
In basso l’hardware fornisce supporto a tutto il resto, esso contiene il firmware, che è la parte di
astrazione più vicina al software. Lo strato successivo è il sistema operativo, che "maschera"
completamente l’hardware sottostante, ossia l’insieme hardware e sistema operativo costituisce una
macchina astratta che ha l’interfaccia agli strati superiori fornita dal sistema operativo.
Al livello più alto troviamo l’utente che interagisce direttamente con il sistema operativo oppure
possono esserci diversi programmi. I programmi si appoggiano all’interfaccia del sistema operativo
e forniscono a loro volta un’interfaccia di più alto livello all’utente, ossia una nuova macchina
astratta.
Linguaggi di programmazione
L’unico linguaggio che il computer è in grado di comprendere ed eseguire è il linguaggio macchina,
di cui c’è un semplice esempio nelle pagine precedenti. Il linguaggio macchina è molto lontano dal
modo di esprimersi degli umani, quindi risulterebbe molto difficile scrivere programmi direttamente
come sequenze di zero e uno.
Assembler
I primi computer erano programmabili solo in linguaggio macchina, successivamente venne
introdotto un linguaggio che permettesse di scrivere i programmi per mezzo del codice delle
istruzioni, invece che con l’istruzione vera e propria. Tale linguaggio prese il nome di assembler.
Occorreva però tradurre un programma dall’assembler, leggibile da un umano, al linguaggio
macchina, comprensibile dal computer. Per questo scopo fu ideato un programma detto
assemblatore, che prendeva come input un file contenente il programma scritto in assembler, detto
codice sorgente, e produceva come output un altro file contenente il corrispondente programma in
linguaggio macchina, detto codice oggetto.
Linguaggi di alto livello
Il linguaggio assembler, pur essendo analizzabile e definibile dall’uomo, è molto vicino
all’hardware e richiede la descrizione dettagliata della sequenza di operazioni elementari necessarie
a svolgere un compito. Un linguaggio con un più alto livello di astrazione fornisce un insieme di
istruzioni elementari molto più complesse rispetto all’assembler. I linguaggi procedurali offrono
questo tipo di astrazione. Una singola istruzione elementare in linguaggio procedurale coinvolge un
grande numero di istruzioni, sia in assembler che in linguaggio macchina.
Un linguaggio offre un’astrazione di computer, ossia un computer più semplice e potente
dell’hardware effettivamente utilizzato. Gli insiemi di istruzioni elementari messe a disposizione dai
linguaggi procedurali possono variare sensibilmente tra loro. I linguaggi procedurali sono
specializzati alla soluzione di problemi in ambiti specifici, per cui offrono un’astrazione dedicata.
Tra i linguaggi procedurali ricordiamo:





il FORTRAN, ideato alla fine degli anni ’50 e tuttora in uso, per la risoluzione di problemi
scientifici;
il COBOL, coevo del FORTRAN, indirizzato alla risoluzione di problematiche di tipo
commerciale e gestionale;
il C, ideato ai primi degli anni ’70, per implementare sistemi operativi;
il Pascal, dei primi anni ’70, per la didattica della programmazione;
Java, degli anni ’90, per la programmazione di carattere generale.
Traduzione di un programma
Uno dei vantaggi offerti dai linguaggi procedurali è quello di essere "distanti" dai dettagli del
linguaggio macchina, ossia dalla piattaforma hardware-software in uso. Un linguaggio procedurale
fornisce un’astrazione piuttosto indipendente dal computer in uso e più facilmente trasportabile da
un tipo di computer ad un altro rispetto al linguaggio macchina.
Uno stesso programma in linguaggio procedurale può essere tradotto nei linguaggi macchina dei
computer in uso affinché questi lo eseguano.
Compilatori e Interpreti
Ci sono due modi per tradurre un programma dal linguaggio procedurale all’assembler. Un
compilatore traduce completamente il programma e lo memorizza in un file. L’esecuzione del
programma tradotto comporta il suo preventivo caricamento in memoria. Una volta tradotto il
programma può essere eseguito indipendentemente dal compilatore e la velocità di esecuzione sarà
la massima possibile per il computer in uso.
Un interprete esegue la traduzione nel corso dell’esecuzione del programma: ogni istruzione viene
prima tradotta e poi eseguita. Il processo di traduzione quindi rallenta l’esecuzione complessiva del
programma, ma permette molta flessibilità nel corso di scrittura del programma.
Cos’è un sistema operativo?
Definizione:

Un sistema operativo è un programma che controlla l’esecuzione di programmi applicativi e
agisce come interfaccia tra le applicazioni e l’hardware del calcolatore
Obiettivi di un sistema operativo:




Semplicità:
Deve semplificare l’utilizzazione della macchina da parte degli utenti
Astrazione:
Deve fornire una visione astratta delle risorse del calcolatore per i programmatori
Efficienza:
Deve utilizzare in modo efficiente le risorse del calcolatore
Protezione:
Deve proteggere le risorse del computer e permettere un accesso controllato ad esse
I servizi offerti dai sistemi operativi







Esecuzione di programmi (applicativi e di sistema)
Gestione dell’accesso alla memoria (principale e secondaria) del calcolatore
Gestione dell’accesso ai dispositivi di I/O
Rilevazione e risposta agli errori
Amministrazione di utenti diversi
Controllo degli accessi
Accounting
Hardware, software e sistemi operativi
Un sistema di calcolo può essere suddiviso nei seguenti elementi:
Un sistema di calcolo è composto da elementi hardware ed software. E’ possibile rappresentare le
relazioni che esistono fra i vari elementi tramite un diagramma a strati, come quello proposto in
figura. L’hardware è lo strato inferiore: è il più complesso e difficile da utilizzare e programmare.
Per fare un esempio, la lettura di informazioni da un floppy disk richiede una complessa interazione
tra il controllore del floppy disk (hardware) e il software; questo ultimo deve orchestrare numerose
operazioni, incluse l’accensione del motore, l’attesa che il disco raggiunga una velocità di rotazione
sufficiente, lo spostamento della testina di lettura, e così via. Possiamo indicativamente suddividere
l’hardware in processore, memoria e dispositivi di I/O. Il nucleo del sistema operativo (in inglese,
kernel) è quella parte del sistema operativo che si colloca immediatamente sopra l’hardware, con il
compito di nascondere ai livelli soprastanti i dettagli più complessi e fungere da gestore delle
risorse del sistema. La comunicazione tra il nucleo e gli altri elementi software è mediata da
un’interfaccia di programmazione, detta delle chiamate di sistema (system call). Sopra a questa
interfaccia sono costruite le librerie (di sistema e applicative), un insieme di funzioni di base che
permettono di eseguire le operazioni più comuni realizzate da un sistema operativo (esecuzione di
programmi, lettura di file, ecc.), e da tool di sistema, ovvero programmi che permettono di
realizzare le operazioni più comuni, come copia di file, backup, ecc. Il nucleo del sistema operativo,
l’interfaccia di programmazione, le librerie e i tool di sistema vengono detti software di sistema, in
quanto si occupano tutti della gestione della macchina. Sopra al software di sistema troviamo il
software applicativo (come ad esempio suite per l’ufficio, per la navigazione in Internet, ecc).
I componenti di un sistema operativo
I principali componenti di un S.O. sono:






Gestore dei processi
Gestore della memoria principale
Gestore dei dispositivi di I/O
Gestore della memoria secondaria
Gestore del file system
Meccanismi di protezione e sicurezza
I S.O. moderni presentano un’elevata complessità strutturale. Al loro interno, è possibile distinguere
un certo numero di unità operative, che si prendono carico di fornire uno o più servizi a
programmatori ed utenti. Il gestore dei processi è l’elemento che si occupa di organizzare
l’esecuzione dei programmi sul processore. Quando un programma è in esecuzione, prende il nome
di processo. Periodicamente o in seguito ad eventi di I/O generati dai dispositivi, il gestore dei
processi sceglie uno fra i processi pronti ad eseguire, e istruisce il processore affinché venga
eseguito. Il meccanismo di gestione deve essere tale che ogni processo riceva una porzione del
tempo del processore proporzionale alla sua importanza (o una porzione equa, se tutti i processi
hanno la stessa importanza). Il gestore della memoria principale si occupa di suddividere la
memoria RAM fra i vari processi attualmente in esecuzione. Le operazioni svolte da tale
componente sono essenzialmente due: tenere traccia di quali sezioni della memoria sono occupate
da quali processi e tenere traccia dello spazio libero di memoria, ovvero dello spazio non utilizzato.
Può avvalersi dei servizi del gestore della memoria secondaria per simulare una quantità maggiore
di memoria principale. I gestori dei dispositivi di I/O si occupano di astrarre la complessità dei
dispositivi hardware fornendo un’interfaccia comune ad ognuno di essi; ad esempio, tastiera e
mouse possono essere modellati semplicemente come un flusso di dati in input. Un gestore di
dispositivo può gestire più dispositivi dello stesso tipo. Il gestore della memoria secondaria e il
gestore del file system sono i componenti che forniscono l’astrazione di file e Directory; come nel
caso della memoria principale, il loro compito più importante è mantenere informazioni su chi
utilizza certe parti della memoria ed eventualmente sopprimere il processo se necessario.I
meccanismi di protezione spesso non sono organizzati come un modulo a parte; invece, permeano
tutti i moduli precedenti, impedendo che i processi e gli utenti eseguano operazioni non consentite.
Sistemi Operativi Moderni
Sistemi operativi Microsoft


Windows 9x-Millenium Edition
Windows NT-2000-XP-Longhorn
Sistemi operativi commerciali basati su UNIX


AIX, Solaris
MacOS X
Sistemi operativi open-source


Linux
FreeBsd, NetBsd, OpenBsd
Ai giorni nostri, esistono tre grandi classi di sistemi operativi. I sistemi Microsoft sono sicuramente
i più diffusi. Esistono due grandi famiglie di prodotti Microsoft nel campo dei sistemi operativi. La
prima famiglia, che comprendeva Windows 95, Windows 98 e Millenium Edition, trae le sue
origini dai vecchi sistemi mono-programmati DOS, ed aggiunge, anche se in modo incompleto,
funzionalità di multi-programmazione e time-sharing. In particolare, gli insufficienti meccanismi di
protezione all’interno del nucleo del sistema operativo per la gestione di processi multipli e il
mancato controllo degli accessi alle risorse condivise, rese questi sistemi operativi inadatti per
l’utilizzazione come server. La seconda famiglia, che include sistemi quali Windows NT, Windows
2000, Windows XP e la futura versione Longhorn, invece, è caratterizzata da sistema operativi
moderni, multi-programmati, output e multiutente. UNIX è un sistema operativo sviluppato
inizialmente negli anni ’70, e oggi presente sotto forma di numerosi sistemi operativi, commerciali
e non. Sistemi operativi come AIX e Solaris (prodotti rispettivamente da IBM e Sun Microsystems)
sono esempi di moderni sistemi operativi basati su UNIX. MAC OS X, recentemente introdotto
dalla Apple, è basato su un nucleo UNIX, sopra al quale è stata costruita una moderna interfaccia
grafica. Oltre alle versioni commerciali, le idee rappresentate da UNIX hanno dato origine a
numerosi progetti open-source, fra cui il sistema più noto è sicuramente Linux. Linux è composto
da un nucleo altamente affidabile, che presenta le stesse interfacce di programmazione di UNIX ed
un insieme di programmi applicativi e di sistema, fra cui interfacce grafiche, programmi per
l’automazione dell’ufficio e web server.
Architettura di un S.O.
E’ possibile suddividere le architetture interne dei sistemi operativi in due grandi famiglie:

Sistemi monolitici

Sistemi a microkernel
Classificando i S.O. in base alla loro struttura interna, esistono due grandi famiglie: sistemi
monolitici e sistemi basati su microkernel. Nei S.O. monolitici, il kernel è implementato come una
semplice collezione di funzionalità e servizi, senza una particolare organizzazione; ognuno di tali
servizi può comunicare con gli altri senza intermediari. Il vantaggio di tale struttura è l’efficienza,
mentre lo svantaggio principale è la mancanza di modularità, che porta a complicare
l’implementazione, la manutenzione e l’espansione di tali sistemi operativi. Come esempi di sistemi
monolitici possiamo ricordare MS-DOS e UNIX. MS-DOS è un sistema a struttura semplice, che
sebbene abbia retto un’evoluzione al di là degli scopi originari (Windows 9x), ha dimostrato come
una mancanza di seria progettazione iniziale può rendere difficile l’implementazione di funzionalità
importanti quali protezione della memoria e sicurezza. UNIX, d’altro canto, ha dimostrato che un
sistema monolitico ben progettato può avere una vita molto lunga. Nel modello di architettura
basato su microkernel, il kernel è ridotto al minimo, e contiene le funzionalità base per la gestione
dei processi, la gestione base della memoria principale e l’interfacciamento con i dispositivi di I/O.
Tutti i servizi ulteriori (gestione avanzata della memoria principale, gestione della memoria
secondaria, implementazione di file system) vengono realizzati come processi privilegiati. La
comunicazione tra processi è mediata dal kernel ed è basata su scambio di messaggi. I vantaggi di
tale struttura sono evidenti: il kernel è molto semplice e facile da realizzare; più espandibile e
modificabile; più facilmente portabile ad altre architetture hardware; più sicuro e affidabile. Lo
svantaggio principale è una ridotta efficienza, in quanto ogni comunicazione tra servizi del sistema
operativo deve passare attraverso il kernel. Windows NT-2000-XP è parzialmente basato su
un’architettura a microkernel. Linux, d’altro canto, pur essendo un sistema monolitico, è dotato del
meccanismo dei moduli, che permette di caricare (anche durante l’esecuzione) nuove funzionalità
nel sistema operativo.