I/O
I sistemi di Input/Output servono per permettere alla CPU di comunicare con periferiche esterne (e.g. mouse, tastiera, bluetooth). Questo avviene tramite un bus, cioè dei fili di collegamento tra componenti.
Tra i fili del bus, ci sono:
- Fili di controllo: che si occupano delle richieste di I/O
- Fili per dati: dedicati al trasferimento di dati
Data la latenza che si genera per la distanza e le richieste di accesso al bus, il northbridge (i.e. memory controller) è integrato nella CPU per cui è direttamente connessa alla RAM e alla GPU, mentre il southbridge (i.e. I/O controller) è connesso alla CPU tramite un bus più lento.
Bus sincrono e asincrono
I dispositivi che comunicano su un bus sincrono dispongono dello stesso clock e lo sfruttano per accordare gli accessi al bus. Questo però è limitato a bus corti, perchè altrimenti il segnale di clock si disallinea.
In un bus asincrono invece, ogni dispositivo ha un clock diverso, che permette il trasferimento a lunghe distanze e a velocità diverse (e.g. USB e SATA). Questo richiederà un costo iniziale dato dall'handshake per sincronizzare i due dispositivi, che avviene su due fili aggiuntivi chiamati Req e Ack.
La richiesta di invio dati req
è impostata dal mittente, mentre la conferma di lettura ack
dal destinatario:
bool req = 0, ack = 0;
char data[2]; // 16+2 bit di fili condivisi
void sender() {
update(data); req = 1;
while (ack == 0);
req = 0;
}
void receiver() {
while (req == 0);
read(data); ack = 1;
while (req == 1);
ack = 0;
}