Dispositivi di I/O

Modalità di gestione delle richieste.

Programmato con busy waiting. In questo caso quando la CPU, richiede dei dati, per esempio alla memoria principale, la CPU attende che i dati siano portati sul bus dalla memoria principale (che è più lenta). Mentre la CPU aspetta, per vedere se il dato è stato reso disponibile, effettua delle richieste fino a quando il dato non è pronto. La CPU invia richieste per controllare la disponibilità del dato mentre attende e non svolge altri compiti durante l'attesa.

Programmato con interrupt. Gli interrupt risolvono il problema dell'attesa attiva (busy waiting). Quando la CPU richiede un dato, non attende che il dato sia disponibile, ma svolge altri compiti. Non appena la memoria avrà reso il dato disponibile, invierà un segnale di interrupt al processore, per comunicargli che il dato è pronto.

Programmato con DMA. DMA è l'acronimo di direct memory access. In questo caso un certo dispositivo di I/O, può comunicare con direttamente con la memoria principale, senza passare direttamente dalla CPU. Questo avviene mediante un controller, la DMA engine, normalmente posta direttamente nel dispositivo di I/O.

La CPU comunica con i dispositivi di I/O mediante dei controller. I controller convertono i dati della CPU in segnali elettrici per i dispositivi di I/O e i segnali elettrici dei dispositivi di I/O in dati per la CPU.

I dispositivi di I/O possono essere memory mapped ovvero uno spazio degli indirizzi della memoria principale è riservato a loro e quindi la comunicazione fra CPU e dispositivi mappati in memoria avviene similmente agli accessi in memoria.

I dispositivi di I/O possono essere isolated. Questi vengono gestiti attraverso uno specifico set di istruzioni separate dalle istruzioni in memoria, questo consente l'interazione con il dispositivo senza la partecipazione della memoria principale.

I driver sono dei software che rendono possibile l'interfacciamento tra i dispositivi di I/O e il sistema operativo.

I bus non sono altro che dei fasci di linee di collegamento con la CPU.
Abbiamo bus di controllo, bus dei dati e bus degli indirizzi.
Più larghi sono i bus (più linee elettriche costituiscono il bus) più dati si possono trasferire contemporaneamente.

Dispositivi attivi, possono decidere di iniziare a trasferire dati sul bus tramite un chip installato chiamato bus driver.

Dispositivi passivi, rimangono in attesa di richieste tramite un chip detto bus receiver.

I dispositivi che possono fare entrambe le cose hanno un chip detto bus transceiver (CPU).

I bus possono essere sincroni (con clock) o asincroni. Nel bus sincrono la comunicazione, in termini di tempo, si adatta al dispositivo più lento. Nel bus asincrono no, ma è più complesso da implementare (serve un protocollo).

I bus possono essere condivisi tra più dispositivi, in tal caso occorre un arbitro del bus.

Arbitraggio centralizzato
Nell'arbitraggio centralizzato vi è un dispositivo, un arbitro, che smista al bus tra i dispositivi collegati. Vi sono due linee, entrambe connesse all'arbitro, linea di request e linee di grant. Tutti i dispositivi che condividono il bus, sono connesse a queste. L'organizzazione in questo modo assume la forma di una catena, per questo è chiamato bus disy chaining. La catena può avere più livelli (per gestire la priorità tra i dispositivi).

Arbitraggio decentralizzato
Nell'arbitraggio decentralizzato non c'è un arbitro. Ci sono tre linee: request, busy e linea di arbitraggio. Quando un dispositivo vuole prendere controllo del bus, controlla che esso sia libero (busy) se lo è ne prende il controllo e la linea di busy adesso segnalerà che il bus è occupato.