Operazioni di I/O 1 Schema di collegamento fra dispositivi periferici e CPU Memoria CPU buffer interfaccia Registro di controllo Registro Di stato Unità di controllo Dispositivo fisico 2 1
Unità di interfaccia Contiene i seguenti registri: Registro di controllo (include vari bit per abilitare particolari comportamenti del dispositivo, es. bit di start) Registro di stato (codifica lo stato del dispositivo) Buffer (contiene dati in lettura o scrittura) La CPU accede ai registri dell interfaccia mediante apposite istruzioni macchina, es.: get(valore, registro) put(valore, registro) 3 Ciclo di I/O basato sulle interruzioni 4 2
Interfaccia di I/O per le applicazioni Le SC di I/O incapsulano i comportamenti dei dispositivi in classi generiche che nascondono le differenze alle applicazioni Il livello dei driver dei dispositivi nasconde al sottosistema di I/O del nucleo le differenze fra i controllori dei dispositivi di I/O I dispositivi differiscono in: A carattere o blocchi Ad accesso sequenziale o random Condivisi o dedicati Velocità delle operazioni read-write, read only, or write only 5 La struttura di I/O di un nucleo 6 3
Sottosistema di I/O del nucleo Scheduling Ordinare le richieste di I/O presenti nelle code dei dispositivi per migliorare l efficienza Buffering per contenere in memoria i dati mentre vengono trasferiti Per gestire le differenze di velocità fra dispositivi Per gestire dispositivi che trasferiscono dati in blocchi di dimensioni diverse 7 Sottosistema di I/O del nucleo Caching per mantenere copia dei dati coinvolti in I/O in una memoria veloce Spooling memoria di transito per tenere i dati destinati a dispositivi che possono servire una sola richiesta per volta i.e., stampanti (coda di file da stampare) 8 4
Gestione degli Errori Il SO si può proteggere da errori dovuti ai dispositivi o alle applicazioni (es. read che non ha successo, dispositivo non pronto, fallimento di una scrittura) Molti SO restituiscono un error number o un codice d errore quando la richiesta di I/O fallisce System error logs riportano gli errori avvenuti 9 Strutture dati del Kernel Il Kernel conserva informazioni sui componenti di I/O in uso, come tabella dei file aperti, connessioni di rete, stato dei dispositivi a carattere Moltissime strutture dati complesse per gestire i buffer, l allocazione di memoria, blocchi difettosi Per implementare l I/O in modo indipendente dai dispositivi si usano molto le tecniche objectoriented e lo scambio di messaggi 10 5
Strutture dati per l I/O del Kernel UNIX 11 I/O ad interruzione di programma Il colloquio fra interfaccia e dispositivo è di tipo handshake Interfaccia: Request to Send Periferica: Ack Interfaccia: Send Dato Il colloquio tra processore ed interfaccia deve essere tale da realizzare l attesa passiva del processo che esegue l operazione di I/O 12 6
Procedura wait_for_interrupt Un processo opera su un dispositivo eseguendo: put(valore, registro-controllo) Wait_for_interrupt Get(valore, registro-di-stato) interno periferico interrupt interrupt 13 Il Driver Due modalità di esecuzione: Il driver fa parte del kernel del S.O.: è invocabile dal processo utente mediante SVC Dunque sarà eseguito nel contesto del processo utente, ma in modo kernel Esiste un processo driver cui il processo utente richiede un servizio Soluzione più leggera, non richiede modifiche del Kernel all aggiunta di una nuova periferica, ma solo la creazione del driver all atto del boot 14 7
Realizzazione del driver Il processo che richiede l I/O invocherà un driver virtuale, capace di garantire la mutua esclusione nell accesso alla periferica Driver Virtuale: Richiesta Periferica Driver-reale Rilascio Periferica Driver Reale: Testa-driver Wait_for_interrupt Coda_driver // è eseguito in modo kernel 15 Sincronizzazione fra processo che esegue il driver e la periferia La testa-driver è responsabile di lanciare l operazione di I/O scrivendo sui registri dell interfaccia Wait-for-interrupt: il processo che esegue il driver si sospenderà attendendo l interrupt di fine I/O, dando la possibilità ad un altro processo di essere schedulato-> corrisponde ad una wait (sem) ove sem è il semaforo associato alla periferica Quando la periferica avrà completato l operazione, alzerà un segnale di interruzione: l ISR relativa provvederà a sbloccare il processo sospeso sul semaforo, attraverso una signal(sem). Il processo rimesso nella ready queue, una volta schedulato, eseguirà la coda del driver nella quale leggerà dal registro di stato dell interfaccia l esito dell operazione 16 8
Il driver virtuale L ultima istruzione del driver virtuale implementa il rilascio della periferica Per rilasciare rapidamente la periferica, due possibili soluzioni: Il processo sbloccato diventa direttamente running, senza passare per lo stato ready Il processo sbloccato va nella coda dei ready ma con una elevata priorità (soluzione UNIX) 17 Comunicazione tra processo utente e processo driver Se il driver fa parte di un processo invocabile dall utente, occorre gestire la comunicazione mediante apposite istruzioni messe a disposizione dal SO. Questa comunicazione sarà realizzata diversamente a seconda del modello scelto: macchina a memoria comune o macchina a scambio di messaggi. 18 9
Realizzazione nel modello a memoria comune La comunicazione tra processo interno e processo driver avviene mediante una risorsa condivisa (monitor) che rappresenta la periferica Il richiedente potrà depositare la sua richiesta nell area di memoria comune interno MONI TOR driver attivazione periferica interruzione esterno/ periferica 19 Realizzazione nel modello a scambio di messaggi Il processo driver fungerà da gestore della risorsa periferica Il processo utente invierà al processo driver la richiesta di operazione di I/O (send) e si sincronizzerà con esso, attendendo il completamento dell operazione (receive) Il processo driver adotterà la stessa soluzione precedente per sincronizzarsi con la periferica 20 10
I/O nel modello a scambio di messaggi utente Send(richiesta di attivazione) driver attivazione periferica Receive(risposta) interrupt Receive(richiesta) testa-driver wait-for-interrupt coda-driver Send(risposta) 21 I/O in UNIX In UNIX non esiste il concetto di processo driver, ma le operazioni di ingresso uscita possono essere realizzate solo da parte del processo utente mediante chiamate al kernel. La ISR possiede tanti rami quanti sono i driver, e in ognuno di essi è presente la coda del rispettivo driver, la quale viene eseguita. Dopodiché si torna al processo utente. In effetti, il processo utente penetra verso l interno del SO, strato per strato, mediante una sequenza di chiamate, fino ad entrare nel kernel e a lanciare una operazione periferica; dopo l esecuzione di tale operazione, la stessa sequenza di chiamate dovrà essere eseguita, ma a ritroso e nel modo più rapido possibile. Il processo utente all'interno del Kernel assume una priorità altissima rispetto a quella che deterrebbe rimanendo al suo esterno 22 11