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;
}