Pilotare
le periferiche
Dopo avere
esaminato i supporti fisici dei file e le relative periferiche (device),
vediamo come i dati in essi contenuti sono trasferiti nella memoria
centrale del computer per essere elaborati.
Le varie
periferiche, presenti in un computer, hanno tempi di lavoro molto superiori
a quelli della CPU; il collegamento diretto fra periferiche e la CPU
comporterebbe quindi periodi inaccettabili di attesa e di inattività
dell'unità centrale.
Il colloquio
tra unità centrale e periferica avviene attraverso dispositivi di controllo
della comunicazione detti interfacce e secondo regole comuni
ad emittente e ricevente dette protocollo di comunicazione.
Quando
la CPU esegue un'applicazione e richiede le prestazioni di una periferica,
comunica con essa per ottenere le informazioni sulle caratteristiche
fondamentali: per esempio, per un disco, il numero di cilindri, testine
e settori. Questo consente di potersi poi riferire al disco, secondo
una visione logica, come ad un insieme di blocchi sequenziali numerati.
I dispositivi
hardware della periferica, per servire adeguatamente le richieste dell'unità
centrale, devono compiere operazioni fisiche per cercare i dati contenuti
nelle tracce e attendere che il settore passi sotto la testina per l'operazione
di I/O.
Le
unità periferiche, come dischi e stampanti, non
possono essere controllate da una struttura integrata nell'unità
centrale in quanto hanno caratteristiche molto diverse da essa in
termini di velocità e modalità operative. |
|
|
|
Negli elaboratori
attuali si tende a separare nettamente l'unità centrale dalle unità
di controllo (controller) delle periferiche.
In
generale, un controller
è un dispositivo capace di pilotare una periferica, attraverso l'elaborazione
di funzioni logiche secondo un programma scritto in un linguaggio relativamente
semplice e riconducibile alle funzioni svolte dall'apparecchiatura da
controllare.
|
Controller SCSI |
Un controller
si diversifica da un adattatore perché ha al suo interno un processore
indipendente dalla CPU, mentre l'adattatore è un circuito direttamente posto a disposizione della CPU, adatto a collegare le unità esterne.
|
Host Bus Adapter (Fibre Channel) |
L'unità
centrale invia alle periferiche solo comandi di alto livello, indipendenti
dal particolare device che lo esegue; la successione di controlli richiesta
dai device per espletare la loro operazione è trasparente all'utente
ed all'unità centrale. Questo consente alla CPU ed al controller di
lavorare contemporaneamente. Per introdurre questo parallelismo tra l'attività di I/O e le operazioni
della CPU, viene utilizzato il meccanismo dell'interrupt (interruzione).
La
CPU attiva l'operazione di I/O e poi prosegue nella sua elaborazione:
quando l'operazione di I/O è ultimata, un segnale del device (interrupt)
interrompe l'attività della CPU che riprende il controllo della
funzione globale di I/O richiesta. |
Per realizzare
la completa indipendenza tra le operazioni di I/O e l'attività della
CPU, il sistema di elaborazione utilizza i bus di I/O, che sono
i canali di comunicazione (channel) specializzati per
eseguire autonomamente trasferimenti dati tra le periferiche e la memoria
centrale. Questo tipo di canale può essere di tipo seriale
o parallelo.
|
Controller IDE Vesa Local Bus |
Naturalmente
i programmatori non scrivono direttamente i comandi per le unità di
I/O, bensì richiamano i sottoprogrammi del sistema operativo che forniscono
tali comandi secondo le necessità dell'utente.
Viene
così costruito in memoria centrale un programma di canale,
costituito da un insieme di comandi che l'unità di I/O deve eseguire
per ottenere il trasferimento dei dati richiesto dal programmatore. |
A questo
punto è sufficiente che la CPU comunichi al canale:
- l'indirizzo
iniziale della zona di memoria dove si trova il programma di canale
da eseguire;
- l'indirizzo
della periferica con cui dialogare, che consiste in un numero
che identifica univocamente il dispositivo;
- l'ordine
di esecuzione.
Dopo aver
trasmesso al canale queste informazioni con l'esecuzione di un'istruzione
di start, la CPU è libera dal controllo dettagliato dell'operazione
e solo a trasferimento ultimato riceverà un segnale (interrupt) dal
canale.
Il
processo, con il quale i dati vengono trasferiti da un disco
alla memoria centrale senza passare attraverso la CPU, si chiama
DMA (Direct Memory Access): esso consente al sistema
di continuare altre elaborazioni mentre i dati vengono ritrovati.
Lo standard DMA (Direct Memory Access) fa si che i dati provenienti dalle periferiche (hd, cd-rom...) vadano direttamente alla RAM senza il passaggio obbligato dalla CPU, limitando così il carico elaborativo della stessa. Tutto questo grazie ai controller IDE delle più recenti main-board, per intenderci, l'interfaccia che permette alle nostre periferiche (IDE, cd-rom, hd, etc) di colloquiare e scambiare dati ed informazioni con l'unita centrale. |
I trasferimenti
avvengono in modo indipendente dalla CPU del sistema che può effettuare
qualunque altro lavoro, mentre lo scambio di dati avviene tra interfaccia
e disco. L'interfaccia che gestisce il disco è in grado di accedere
direttamente alla memoria del sistema e di scaricarvi i dati.
Le moderne
interfacce ricevono ed eseguono più comandi contemporaneamente e
la coda di esecuzione viene gestita dalla scheda di controllo per ottimizzare
le prestazioni. Inoltre con la stessa interfaccia è possibile collegare
all'unità centrale più periferiche, anche differenti dalle memorie
di massa, come stampanti e scanner.
Un esempio
I dischi magnetici, come altri dispositivi con un elevato tasso di trasferimento, possono essere collegati ad un processore autonomo di I/O chiamato Direct Memory
Access Controller (DMAC). In questo caso è possibile programmare
tramite appositi flag di una porta di I/O l’attivazione del DMA per il dispositivo.
Grazie al DMAC, il nucleo del sistema operativo è in grado di avviare una operazione di I/O
relativamente complessa, ad esempio la lettura di più blocchi di dati da disco in
un’area prefissata di RAM, per poi passare a svolgere altre attività senza aspettare
la terminazione dell’operazione di I/O. Quando il DMAC ha terminato di
trasferire dati, invia un segnale alla interfaccia di I/O interessata, la quale genera,
a sua volta, un segnale di interruzione.
|
I
canali
Per comunicare
con i dispositivi di I/O un elaboratore dispone di uno o più
processori esterni a cui affidare il compito di comunicare direttamente
con i dispositivi di I/O. Un'unità di questo tipo si chiama canale
di I/O o anche Input Output Processor (IOP).
Un canale di I/O può essere dunque identificato con un processore con accesso diretto
alla memoria (DMA) in grado di comunicare con i dispositivi di I/O. Mentre
l'unità centrale si occupa delle elaborazioni dati, il canale
di I/O trasferisce i dati fra la memoria centrale ed i dispositivi
periferici.
E'importante fare attenzione anche ad un'altra definizione di canale, rintracciabile nei testi tecnici prchè utilizzata da IBM.
IBM usa il termine canale (channel) per indicare il flusso dei dati gestiti dal FEP (Front End processor). Il FEP è, nei mainframe IBM, il processore dedicato alla gestione del traffico ed all'uso dei bus. |
La comunicazione fra l'unità centrale ed il canale di I/O generalmente
segue questo schema:
-
L'unità centrale fa iniziare l'operazione di I/O
attivando il canale di I/O con le indicazioni di:
-
quale mezzo periferico deve usare,
-
l'indirizzo in memoria centrale a partire dal quale può
trovare altre istruzioni.
|
|
L'unità
centrale può conoscere lo stato del canale di I/O e lo
stato di avanzamento delle operazioni, con opportune istruzioni
che esaminano il registro di stato del canale di I/O, in modo da
poter prendere decisioni circa la gestione di varie operazioni di
I/O memorizzati in memoria centrale in modo analogo ai programmi
che sono eseguiti dall'unità centrale. |
- Il
canale di I/O:
-
legge dalla memoria centrale i comandi che deve eseguire
(questi sono chiamati comandi per distinguerli dalle istruzioni
eseguibili dall'unità centrale),
- le
interpreta,
-
esegue sul mezzo le operazioni indicate,
- comunica
poi all'unità centrale che ha finito di eseguire
il proprio programma tramite un'interruzione.
|
|
Il
canale di I/O esegue dei veri e propri programmi detti
programmi canale. |
I
bus
Il bus è un "canale" attraverso cui le varie parti di un computer dialogano fra loro. Il bus di sistema, presente in tutti i microcalcolatori, è composto da 50 a 100 fili in rame incisi sulla scheda madre ed è dotato di connettori separati ad intervalli regolari per l'innesto dei moduli di memoria e di I/O. Si tratta di una serie di connessioni elettriche ognuna delle quali può trasmettere cifre binarie (0 o 1) in successione. L'insieme delle cifre binarie trasmesse è interpretato dai vari componenti del sistema secondo protocolli prestabiliti.
E' praticamente impossibile localizzare visivamente il/i bus all'interno di un elaboratore.
In definitiva si può dire che un bus è un insieme di fili in grado di trasmettere una collezione di segnali e protocolli (tipi di transazioni che un bus supporta, ossia lettura e scrittura a blocchi o per singoli byte, tra uno o più dispositivi, ecc.). |
Un bus esteriormente si presenta come piste su una scheda stampata o come un gruppo di connettori e la cui logica è distribuita su ciascuna delle schede che implementano il protocollo e la connessione.
Il bus prevede più fili per la trasmissione di interrupt: ad esempio nei bus per PC della famiglia ISA tali fili, in numero di 15, vengono chiamati fili IRQ (Interrupt ReQuest): ogni scheda connessa al bus deve avere un proprio numero di IRQ univoco in modo da distinguere le diverse interruzioni. I vecchi bus ISA prevedevano, al momento dell'installazione, l'impostazione manuale dei valori IRQ tramite switch o jumper sulle schede o via software ma, già a partire dagli anni '80, sono nati bus che prevedono l'uso di componenti accessorie e sistemi operativi autoconfiguranti (Plug and Play).
Un bus che collega due componenti appartenenti alla stessa scheda integrata è detto INTERNAL BUS, se collega due componenti generici è detto EXTERNAL BUS. Se c'è un solo bus esterno è detto System bus.
I bus quindi interterconnettono
le principali componenti dell'unità centrale, in particolare CPU, memoria e dispositivi di I/O, trasportando
indirizzi (address bus), dati (data bus), istruzioni (data bus) e segnali
di controllo (control bus).
I dispositivi collegati al bus possono trovarsi sia nella condizione
di dover trasmettere (master) che in quella di dover ricevere
(slave). Ad esempio quando la CPU ordina al controller del disco
di leggere o scrivere un blocco, la CPU si comporta da master ed il
controller da slave. In genere tutti i dispositivi possono funzionare
sia come master sia come slave eccetto la memoria che si comporta sempre
da slave.
Per interconnettere
più unità diverse esistono due approcci possibili:
- il primo
è quello di creare dei percorsi punto-punto sino a interconnettere
tutte le unità,
- il secondo
è quello di utilizzare un unico percorso condiviso e
istituire delle regole per controllare il traffico.
Sotto l'influenza
della tecnologia dei personal computer è entrato nell'uso corrente
distinguere più bus:
- il local
bus: è il bus che connette CPU e memoria; le caratteristiche
specifiche di questi bus sono legate sostanzialmente a quelle del
processore e non hanno alcuna ripercussione, ad esempio, sui dispositivi
di input/output, connessi ad altro bus. Il local bus è in grado
di operare a 32 bit e con frequenza di cicli di 33Mhz che corrisponde
alla velocità del flusso delle informazioni dell'ordine dei 132
Megabyte al secondo.
- l'I/O
bus: è il bus cui sono connessi i dispositivi di I/O
ed è quasi sempre separato dal local bus. Le caratteristiche
specifiche di questi bus hanno ripercussioni rilevanti sul resto del
sistema in quanto tutti i dispositivi esterni da connettere (dischi,
nastri, stampanti, video, ecc.) devono essere collegati tramite opportune
schede di interfaccia (dotate degli opportuni connettori) ad esso
compatibili. Questo tipo di bus è in grado di operare a 5
Mb al secondo.
- il
system bus: è un bus utilizzato per architetture diverse
dal personal computer, connette la CPU con le altre componenti del
computer come memoria e dispositivi di input/output.
Vista la
loro velocità di trasferimento delle informazioni (5 Mb al
secondo), i tradizionali bus di I/O non sono adatti per trasferire
le informazioni dalle periferiche ad una velocità sufficiente per le
applicazioni di tipo multimediale (immagini, suoni, filmati).
Viene usato allora il local
bus in grado di operare a velocità decisamente superiore
rispetto ai tradizionali bus di I/O (132 Megabyte al secondo).
In sostanza il bus locale esclude le periferiche dal bus di I/O e le
connette alle altre unità del sistema elaborazione, CPU e memoria centrale
o alle memorie dedicate, per esempio la memoria video, con veloci flussi.
Il risultato
complessivo è un trasferimento rapido di informazioni tra CPU e periferiche,
che risulta importante nelle moderne applicazioni multimediali.
Un local
bus è in grado di gestire periferiche diverse (da tre a cinque)
e di alte prestazioni:
- adattatori
video,
- schede
per l'acquisizione di filmati,
- schede
musicali,
- controller
di dischi magnetici e ottici,
- connessioni
in rete,
- etc.
Queste
periferiche possono essere integrate direttamente sulla piastra principale
(scheda madre o motherboard) del computer, oppure aggiunte successivamente
utilizzando gli alloggiamenti (slot) di espansione, nei quali connettere
le diverse schede per le periferiche.
Il local
bus integra e non sostituisce il lavoro dei bus tradizionali di I/O
ai quali rimangono connessi i dispositivi, quali la stampante o il modem,
che non necessitano di grandi velocità.
Nella fascia
dei personal computer ci sono vari modelli commerciali di local bus:
- i più
diffusi sono PCI (Peripheral Component Interconnect),
sviluppatosi a partire dalla seconda metà degli anni '90 per
l'industria dei PC;
- VESA
(Video Equipment Standards Associatíon) local bus.
I tradizionali
bus non locali sono invece ISA, EISA e MCA.
La
memoria cache
Per intervenire
efficacemente in tutte le situazioni nelle quali l'avanzamento dei processi
è condizionato dai rallentamenti dovuti ai tempi diversi di elaborazione
da parte delle unità del sistema è stata introdotta la
memoria cache. Questo tipo di memoria è una, così detta,
memoria temporanea utilizzata per trasferire dati da un dispositivo
ad un altro operanti a velocità di lavoro diverse (uno veloce e l'altro
lento).
Possiamo
trovare memorie cache:
- nella
comunicazione tra memoria RAM e unità a disco,
- nel
trasferimento dati tra memoria RAM e CPU quando la RAM non è in grado
di servire tempestivamente le richieste della CPU.
In commercio
esistono infatti memorie RAM caratterizzate da velocità e costi diversi,
adatte quindi ad operare con CPU funzionanti a frequenze diverse.
Una CPU
veloce, in assenza di cache, dovrebbe compiere a vuoto molti cicli di
elaborazione (colpi di clock) prima che la RAM sia pronta a rispondere,
data la notevole differenza di velocità tra CPU e RAM, oltre ai cicli
necessari per attivare la connessione sul bus e l'invio delle richieste.
Per esempio una CPU a 100 Mhz ha cicli di 10 nanosecondi ciascuno, mentre
il tempo medio di accesso a una memoria RAM è di 100 ns.
Per questo
si affianca alla memoria RAM normale, presente in quantità anche elevata,
una piccola cache memory, di dimensioni comprese tra 256
e 512 Kbyte, di velocità superiore (per esempio 10 ns), che serve da
rifornimento veloce per la CPU.
Anche per
il trasferimento dei dati tra la memoria RAM e una periferica si usano
memorie cache di dimensioni comprese tra 128 e 256 Kbyte, in lettura
e scrittura: queste consentono di organizzare i dati prima che il processore
li richieda (cache di lettura), ed accettare i dati prima che l'unità
sia pronta a trascriverli (cache di scrittura).
L'uso di
una cache per un disco è dovuto alla maggior differenza tra le velocità
del disco e della RAM (50.000 volte) rispetto alla differenza che intercorre
tra quelle della RAM normale e della cache per la CPU (alcune volte).
|