Come si verifica I / O per file di dati di grandi dimensioni?

3

Supponiamo di avere un processore RAM da 4 GB. Diciamo che vogliamo riprodurre un film da 4 GB nel lettore VLC. A questo punto, il processore avvia per primo VLC Process e quindi inizia a caricare dati a 4 GB. La mia domanda è come avviene questo trasferimento di dati, è come ottenere quasi tutto il 4Gb e memorizzarne alcuni nell'area di swap e portarlo quando è richiesto o prima ottenere i dati di avvio e trasmettere continuamente i dati tra RAM e hard disk?

    
posta AV94 21.07.2016 - 18:36
fonte

1 risposta

4

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.

    
risposta data 21.07.2016 - 19:05
fonte

Leggi altre domande sui tag