Al livello di un processo in modalità utente, ci sono due modi fondamentali in cui il file sequenziale IO come la riproduzione di un film dall'inizio alla fine può avvenire:
-
Il processo può allocare un buffer, che è tipicamente dimensionato da qualche kilobyte fino a un megabyte o giù di lì, ma raramente più grande di così, e poi chiede al sistema operativo di riempirlo. Quando ha finito con i dati da quel buffer, chiede quindi al sistema operativo altro, e così via, finché non raggiunge la fine del file. Come una leggera variante su questo, al fine di ridurre la latenza può allocare due buffer, e chiedere al sistema operativo di riempire il secondo mentre sta elaborando i dati dal primo, e quindi scambiare tra buffer quando termina l'elaborazione dei dati dal primo.
-
Oppure, potrebbe invece chiedere al sistema operativo di "mappare" il file (o una sezione di esso) in memoria. In questo caso, il sistema operativo comunica al processore che la memoria non è al momento disponibile e quindi quando il processo di lettura tenta di utilizzare la memoria, il processore lo rileva e torna al sistema operativo, provocando il caricamento del sistema operativo nel la prossima pagina di dati dal disco. Questo potrebbe essere molto leggermente più efficiente perché il sistema operativo è in grado di gestire la memoria stessa piuttosto che dover allocare i propri buffer interni e quindi copiare i dati dopo che sono stati letti nei buffer del processo, ma è probabile che gli effetti siano molto difficili da notare nella maggior parte dei casi.
Il mio sospetto è che la maggior parte dei lettori multimediali utilizzi il primo approccio, probabilmente con la variante che utilizza due buffer. Il terzo può essere più efficiente, ma ha un problema: è necessario allocare gli indirizzi per l'intero contenuto del file [1], che può essere un problema con file di grandi dimensioni con sistemi operativi a 32 bit, quindi qualsiasi lettore multimediale progettato per lavorare con un tale sistema è improbabile che lo faccia.
A livello di sistema operativo, il kernel vede una serie di richieste per sezioni di file da caricare, e il driver del filesystem traduce quelli in richieste di blocchi di dischi da caricare. L'IO manager assegna i blocchi di memoria dal suo pool di buffer (noto anche come IO cache) e chiede al driver del dispositivo del disco di trasferire il contenuto dei blocchi del disco nei blocchi di memoria. Una volta eseguita questa operazione, i dati vengono copiati nel buffer del processo utente (caso 1 sopra) o la pagina del buffer di sistema viene mappata nello spazio di memoria del processo utilizzando una tabella di pagina e il processo riprende (caso 2).
È anche probabile che un sistema operativo moderno noti che il processo sta leggendo i blocchi in sequenza e inizia a precaricarli prima che le richieste arrivino per migliorare le prestazioni.
[1] - puoi solo mappare parte del file e quindi spostare la finestra, ma la mia comprensione è che pochissimi programmi lo fanno.