ho letto che durante un'operazione di I/O, la CPU mette in pausa il
processo in esecuzione, e in tal caso puᅵ eseguirne un altro.
Ma l'operazione di I/O, se non la gestisce la CPU chi se ne occupa?
grazie
Dipende :)
Generalmente una periferica esterna o un controller integrato nel
microprocessore.
In generale i componenti hardware una volta che la CPU ha impostato i
"parametri" dell'operazione da eseguire (ad esempio recuperare un
settore sul disco o trasferire un pacchetto sulla rete) sono in grado di
lavorare per conto loro e segnalera alla CPU (tipicamente con un segnale
di interrupt) di aver completato l'operazione.
Altri device possono sfruttare il DMA trasferendo direttamente dati da e
verso la memoria senza bisogno della CPU nemmeno in questa fase (una
volta deciso cosa leggere/spedire la CPU si "dimenticherᅵ" del device
fino a fine operazione). Ovviamente se anche la CPU ha bisogno di
accedere alla memoria ci sarᅵ un conflitto (gestito in hardware) e
qualcuno dovrᅵ aspettare.
I tempi di risposta delle periferiche esterne, per quanto veloci possano
essere, sono sempre enormi in termini di cicli di CPU e quindi tutti i
sistemi operativi (e anche i firmware senza sistema operativo!) fanno in
modo di limitare i tempi in cui la CPU resta "oziosa" in attesa del
completamento di una o piᅵ di queste operazioni.
Un sistema operativo multi-thread o multi-processo puᅵ passare ad
eseguire un thread/processo (il concetto cambia da sistema operativo a
sistema operativo) diverso da quello che sta aspettando che si completi
l'operazione hardware richiesta.
Alcuni sistemi operativi (Windows, ad esempio) ti danno la possibilitᅵ
di gestire in modo asincrono le operazioni di I/O. In questo modo
potrai, ad esempio, scrivere dati in un file o su una porta seriale
senza aspettare che il trasferimento sia completato. In questo modo
potrai gestire operazioni contemporanee anche dentro lo stesso
thread/processo. E' una tecnica molto potente che permette di migliorare
le performance della tua applicazione "parallelizzando" (con i limiti
che abbiamo visto sopra) alcune operazioni che altrimenti sarebbero
eseguite in sequenza "sprecando" (dal punto di vista della tua
applicazione) tempo di CPU in attesa dell'interrupt. D'altro canto
richide una gestione sicuramente piᅵ complessa a livello di
sincronizzazioni, gestione dei buffer di dati etc. per cui vale la pena
di utilizzarla solo quando ᅵ strettamente indispensabile.
--
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non ᅵ valido)
grazie!