2012-02-03 13 views
7

Quando faccio un fopen e poi un fread, quando il file è effettivamente/parzialmente caricato nella memoria durante fopen o fread?Quando viene caricato il file in memoria - per le chiamate fread, fopen e fwrite?

Oppure è parzialmente caricato in fopen in base alla dimensione del file e quindi completamente caricato al momento di fread?

Analogamente, cosa accade internamente a livello di sistema operativo quando viene chiamato fwrite? Il file è stato caricato in memoria in quel momento oppure uno scambio di pagina avviene eseguendo nuovamente quella parte del file in memoria?

Cosa succede a livello di SO a ciascuna di queste chiamate in relazione al caricamento dei file in memoria?

+4

Per quale file system? Per quale sistema operativo? –

+4

Quale sistema operativo? Questo dipende interamente dal sistema operativo. (Mi aspetto che in genere non vengano letti dati dal file quando lo si interrompe.) –

+0

avevo bisogno dei dati per Windows, ma sarei curioso di sapere anche la differenza per lo stesso in linux – seahorse

risposta

6
  • fopen() crea solo un handle per il file.
  • fread() legge effettivamente il file in un buffer di memoria (livello di sistema operativo buffer può verificarsi in modo trasparente al cliente.)
  • fwrite() scrive i dati nel file, anche se la sua impegnandosi allo stoccaggio può ottenere in ritardo (per esempio con filesystem journaling.
4

In genere, il file non viene caricato in memoria all'apertura. Invece, le parti vengono caricate per ogni lettura; a causa di tutti i tipi di buffering, possono essere caricati pezzi più grandi, quindi lo si chiede in ogni fread.

Quando si immettono alcuni dati, fwrite viene copiato nel kernel che verrà quindi scritto sul disco (o ovunque) dopo il buffering. In generale, per scrivere non è necessario caricare alcuna parte di un file.

2

Generalmente dipende dal file system e dal sistema operativo. in Windows è presente un meccanismo di memorizzazione nella cache che gestisce un file in blocchi da 256 KB e carica ogni blocco sulla richiesta di lettura che rientra in quel blocco. Una chiamata a fopen non dovrebbe causare la lettura del contenuto del file dal supporto. E fread causerà la lettura parziale (o la lettura completa per i file di piccole dimensioni) dal supporto. La lettura parziale di solito è uguale alla dimensione della linea della cache nel gestore della cache (256 KB).

fwrite potrebbe anche/non causare una scrittura effettiva sul supporto. Solitamente, i dati del client vengono trasferiti nell'area del file memorizzato nella RAM, ma non è garantito che i dati vengano effettivamente scritti sui supporti. in Windows, il gestore cache decide quando svuotare l'area cache di un file sul supporto. Se si desidera assicurarsi che tutti i dati sporchi vengano scaricati sul supporto dopo fwrite, è necessario chiamare lo fflush in seguito.

1

Mentre questo è dipendente dal sistema operativo, nel sistema operativo moderno l'intera attività del disco è memorizzata nella cache in modo trasparente, in modo che quando si apre un file in realtà viene mappato su una porzione dello spazio di memoria virtuale.

Ciò significa che nessuna attività del disco si verifica prima della lettura/scrittura effettiva.

Ciò è vero anche se si apre il file senza memoria-mapping (per esempio: fopen), mentre se lo si apre con la memoria-mapping (per esempio: mmap) semplicemente perdere la "trasparenza".

Problemi correlati