Il sistema di I/O • • • • • Hardware di I/O Interfaccia di I/O per le applicazioni Sottosistema per l’I/O del kernel Trasformazione delle richieste di I/O in operazioni dell’hardware Prestazioni Operating System Concepts 12.1 Silberschatz and Galvin1999 Hardware di I/O • • • • Esiste una incredibile varietà di dispositivi di I/O. Concetti comuni: – Porta – Bus (daisy chain o accesso diretto condiviso) – Controller (host adapter) Le istruzioni di I/O controllano i dispositivi. I dispositivi hanno indirizzi usati da: – Istruzioni dirette di I/O – Memory-mapped I/O Operating System Concepts 12.2 Silberschatz and Galvin1999 Polling • • Determina lo stato di un dispositivo: – command-ready – busy – error Si ha un ciclo busy-wait per attendere l’I/O dal dispositivo. Operating System Concepts 12.3 Silberschatz and Galvin1999 Interrupt • • • • • La linea di richiesta dell’interrupt della CPU viene settata dal dispositivo di I/O. Il gestore di interrupt (interrupt–handler) riceve gli interrupt. Alcuni tipi di interrupt possono essere mascherati, per ignorarli definitivamente o rimandarne il servizio. Il vettore degli contiene gli indirizzi di memoria dei gestori specializzati. – Basato su priorità – Alcuni sono non mascherabili Il meccanismo di interrupt viene impiegato anche per le eccezioni. Operating System Concepts 12.4 Silberschatz and Galvin1999 Ciclo di I/O guidato da interrupt Operating System Concepts 12.5 Silberschatz and Galvin1999 Accesso diretto alla memoria – DMA • • • Viene impiegato per evitare l’I/O programmato (PIO) per trasferimenti di grandi quantità di dati. Richiede un controller di DMA. Si evita così di sovraccaricare di compiti la CPU: è il controller di DMA che si occupa di trasferire i dati direttamente tra il dispositivo di I/O e la memoria. Operating System Concepts 12.6 Silberschatz and Galvin1999 Passi di un trasferimento DMA Operating System Concepts 12.7 Silberschatz and Galvin1999 Interfaccia di I/O per le applicazioni • • • Le chiamate di sistema di I/O incapsulano i comportamenti dei dispositivi in classi generali. Lo strato dei driver dei dispositivi nasconde al sottosistema di I/O del kernel le differenze fra i controller dei dispositivi di I/O. I dispositivi possono differire per molteplici aspetti: – Character–stream o block–stream (trasferimento a flusso di caratteri o di blocchi); – Accesso sequenziale o casuale; – Dispositivo sincrono o asincrono, condivisibile o dedicato; – Velocità di funzionamento; – Lettura e scrittura, sola lettura o sola scrittura. Operating System Concepts 12.8 Silberschatz and Galvin1999 Dispositivi con trasferimento a blocchi o a caratteri • • Dispositivi con traserimento a blocchi comprendono principalmente drive di dischi: – Il dispositivo comprende istruzioni del tipo read, write, seek; – Raw I/O (I/O di basso livello); – Possibilità di accesso ai file mappato in memoria. Dispositivi a caratteri comprendono tastiere, mouse, porte seriali: – Comandi classici sono get, put; – Con l’uso di librerie appropriate permettono l’accesso per righe e la gestione di un buffer. Operating System Concepts 12.9 Silberschatz and Galvin1999 Dispositivi di rete • • • Variano molto dai dispositivi per il trasferimento di I/O a blocchi e/o caratteri fino a presentare una propria interfaccia specifica. Unix e Windows/NT comprendono un’interfaccia socket: – Separa il protocollo di rete dalle operazioni di rete; – Include la funzionalità select. Gli approcci variano molto (pipe half–duplex, FIFO full–duplex, stream full–duplex, code di messaggi, socket) Operating System Concepts 12.10 Silberschatz and Galvin1999 Clock e Timer • • • Forniscono il tempo corrente, il tempo trascorso, regolano un timer per avviare l’operazione X al tempo T. Se impiega un interval timer per la tempificazione: con questo meccanismo è possibile avere interrupt periodici. La system call ioctl (su UNIX) controlla vari aspetti di I/O come clock e timer. Operating System Concepts 12.11 Silberschatz and Galvin1999 I/O bloccante e non bloccante • • • I/O bloccante: il processo viene sospeso fino al completamento dell’operazione di I/O. – Facile da usare e da comprendere; – Per alcuni scopi è insufficiente. I/O non-bloccante: la chiamata ad I/O ritorna appena possibile (dopo aver iniziato il trasferimento di dati). – Utile per processi utente, e per trasferimento dati, ad esempio da disco a schermo (I/O bufferizzato); – Viene implementato per mezzo di multi-threading; – Ritorna rapidamente con il numero di byte letti o scritti. I/O asincrono: il processo prosegue mentre avviene l’I/O. – Difficile da usare; – Il sottosistema di I/O segnala al processo il completamento dell’I/O. Operating System Concepts 12.12 Silberschatz and Galvin1999 Sottosistema di I/O del kernel • • Scheduling – Alcune richieste di I/O sono ordinate per mezzo di code in ciascun dispositivo; – Il sistema operativo è equo: nessuna applicazione deve ricevere un servizio carente, da maggiore priorità ad applicazioni inficiate da un ritardo nel servizio. Buffering: si memorizzano i dati in memoria mentre avviene il trasferimento fra dispositivi. – Utile per gestire la differenza di velocità dei dispositivi; – Per gestire la differenza di dimensione dei blocchi di trasferimento dei dispositivi; – Per mantenere la “semantica di copia”. Operating System Concepts 12.13 Silberschatz and Galvin1999 Kernel I/O Subsystem • • • Caching: una regione di memoria veloce che serve per mantenere copie di certi dati. L’accesso a queste copie è più rapido che l’accesso agli originali. Spooling: è un buffer contenente output per un dispositivo che non può accettare flussi interfogliati di dati (ad esempio, una stampante). Prenotazione di un dispositivo: fornisce accesso esclusivo ad un dispositivo. – System call per allocazione e deallocazione dei dispositivi; – Responsabilità di evitare i deadlock. Operating System Concepts 12.14 Silberschatz and Galvin1999 Gestione degli errori • • • Un sistema operativo che usi la protezione della memoria può recuperare varie situazioni di errore, ad esempio, errori di lettura di un disco, errori per dispositivi non disponibili o errori di scrittura momentanei. La maggior parte dei sistemi operativi restituisce un codice di errore quando una richiesta di I/O fallisce. I file log di errori possono essere consultati per avere statistiche sul funzionamento del sistema. Operating System Concepts 12.15 Silberschatz and Galvin1999 Strutture dati del kernel • • • Il kernel mantiene informazioni sullo stato dei componenti coinvolti nelle operazioni di I/O, come la tabella dei file aperti e la tabella delle socket. Moltissime strutture dati complesse tengono traccia dell’allocazione dei vari buffer, dell’allocazione della memoria e dei blocchi “dirty”. Alcuni sistemi operativi utilizzano metodologie object-oriented e message passing per l’implementazione dell’I/O. Operating System Concepts 12.16 Silberschatz and Galvin1999 Trasformazione delle richieste di I/O in operazioni hardware • Si consideri la lettura di un file su disco da parte di un processo: – Si determina il dispositivo su cui il file è memorizzato; – Si opera la traduzione fra nome del dispositivo e suo driver fisico; – Si leggono i dati dal disco in un buffer; – Si rendono i dati disponibili al processo che li ha richiesti; – Si ritorna il controllo al processo richiedente. Operating System Concepts 12.17 Silberschatz and Galvin1999 Schema di esecuzione di una richiesta di I/O Operating System Concepts 12.18 Silberschatz and Galvin1999 Prestazioni • L’I/O è un fattore fondamentale per le prestazioni dell’intero sistema: – Richiede un notevole impegno della CPU per l’esecuzione del codice dei driver e per lo scheduling dei processi; – Produce numerosi context switch dovuti agli interrupt; – Sovraccarica il bus della memoria durante i trasferimenti di dati tra i controller e la memoria fisica e tra i buffer del kernel e lo spazio di indirizzamento delle applicazioni. Operating System Concepts 12.19 Silberschatz and Galvin1999 Comunicazione fra computer Operating System Concepts 12.20 Silberschatz and Galvin1999 Come migliorare le prestazioni • • • • • Ridurre il numero di context switch. Ridurre il numero di trasferimenti di dati. Ridurre il numero di interrupt, trasferendo grossi volumi di dati, utilizzando controller intelligenti e polling. Utilizzare il DMA Equilibrare le prestazioni della CPU, della memoria, del bus e dell’I/O, dato che il sovraccarico di una componente qualsiasi provoca il basso utilizzo delle altre. Operating System Concepts 12.21 Silberschatz and Galvin1999