No, quello che stai facendo è mappatura il file nella memoria. Questo è diverso dalla lettura effettiva del file in memoria.
Se lo leggete, dovreste trasferire l'intero contenuto in memoria. Mappandolo, si lascia che il sistema operativo lo gestisca. Se si tenta di leggere o scrivere in una posizione in quell'area di memoria, il sistema operativo caricherà per prima la sezione pertinente. Sarà non caricare l'intero file a meno che non sia necessario l'intero file.
Ecco dove ottieni il tuo guadagno in termini di prestazioni. Se si esegue la mappatura dell'intero file, ma si cambia solo un byte e lo si deseleziona, si scoprirà che non ci sono molti I/O su disco.
Ovviamente, se si tocca ogni byte nel file, allora sì, verrà caricato in un punto qualsiasi ma non necessariamente nella RAM fisica tutto in una volta. Ma questo è il caso anche se si carica l'intero file in anticipo. Il sistema operativo sostituirà parte dei dati se non c'è abbastanza memoria fisica per contenerli tutti insieme a quelli degli altri processi nel sistema.
I principali vantaggi della mappatura della memoria sono:
- si rinviare la lettura delle sezioni di file fino a quando non sono necessari (e, se sono mai necessari, che non vengano caricati). Quindi non c'è un grosso costo iniziale quando si carica l'intero file. Ammortizza il costo del caricamento.
- Le scritture sono automatizzate, non è necessario scrivere ogni byte. Basta chiuderlo e il sistema operativo scriverà le sezioni modificate. Penso che questo accada anche quando la memoria viene scambiata (in situazioni di poca memoria fisica), poiché il buffer è semplicemente una finestra sul file.
Ricordare che è molto probabile una disconnessione tra l'utilizzo dello spazio indirizzo e l'utilizzo della memoria fisica. È possibile allocare uno spazio di indirizzamento di 4G (idealmente, anche se potrebbero esserci limiti di OS, BIOS o hardware) in una macchina a 32 bit con solo 1G di RAM. Il sistema operativo gestisce il paging da e verso il disco.
E per rispondere alla vostra ulteriore richiesta di chiarimento:
tanto per chiarire. Quindi, se ho bisogno dell'intero file, mmap caricherà effettivamente l'intero file?
Sì, ma potrebbero non essere in memoria fisica tutti in una volta. Il sistema operativo scambierà i bit al filesystem per introdurre nuovi bit.
Ma lo farà anche se avete letto l'intero file manualmente. La differenza tra queste due situazioni è la seguente.
Con il file letto in memoria manualmente, il sistema operativo scambierà parti del proprio spazio indirizzo (potrebbero includere i dati o potrebbero non esserlo) nel file di scambio. E avrai bisogno di riscrivere manualmente il file quando hai finito con esso.
Con la mappatura della memoria, è stato effettivamente detto di utilizzare il file originale come area di scambio aggiuntiva per quel file/solo memoria. E, quando i dati vengono scritti in nell'area di scambio, influisce immediatamente sul file effettivo. Quindi non è necessario dover riscrivere manualmente nulla quando hai finito e senza modificare il normale swap (di solito).
E 'davvero solo una finestra per il file:

@monkeyking, la chiusura corretta per code-pre è/pre/code, non post :-) Risolto il problema con i tag del codice. – paxdiablo
Ahh grazie un milione! Che dire di #include Non ho potuto inserire questi nel codice di esempio – monkeyking
Segna l'intero blocco quindi usa CTRL-K - questo farà rientrare di quattro spazi. L'ho fatto ora e dovresti essere in grado di vedere una stdio include. – paxdiablo