ho sentito (letto su internet da qualche parte) che mmap() è più veloce di sequenziale IO. È corretto? Se sì allora perché è più veloce?
Può essere - ci sono pro e contro, elencati di seguito. Quando si ha davvero motivo di preoccuparsi, si analizzano sempre entrambi.
A prescindere dall'effettiva efficienza dell'IO, ci sono implicazioni per il modo in cui il codice dell'applicazione tiene traccia quando è necessario eseguire l'I/O e l'elaborazione/generazione dei dati, che a volte può avere un impatto notevole sulle prestazioni.
1) mmap() non sta leggendo in sequenza. 2) mmap() deve recuperare dal disco stesso come read() fa 3) L'area mappata non è sequenziale - quindi non DMA (?).
Quindi mmap() dovrebbe essere effettivamente più lento di read() da un file? Quale delle mie supposizioni sopra è sbagliata?
1) è sbagliato ... mmap()
assegna una regione di spazio di indirizzamento virtuale corrispondente al file contenuti ... ogni volta che si accede una pagina in quello spazio di indirizzi, RAM fisica si trova a sostenere gli indirizzi virtuali e il corrispondente il contenuto del disco è guasto in quella RAM. Quindi, l'ordine in cui le letture vengono eseguite dal disco corrisponde all'ordine di accesso. È un meccanismo I/O "pigro". Se, ad esempio, è necessario indicizzare in un'enorme tabella hash che deve essere letta dal disco, quindi mmap
il file e iniziare a fare l'accesso significa che l'I/O del disco non viene eseguito in modo sequenziale e può pertanto comportare un tempo trascorso più lungo fino a quando l'intero file non viene letto in memoria, ma mentre ciò accade le ricerche sono riuscite e il lavoro dipendente può essere intrapreso, e se parti del file non sono mai realmente necessarie non vengono lette (consentire la granularità delle pagine di memoria e disco, e anche quando si utilizza la mappatura della memoria, molti sistemi operativi consentono di specificare alcuni suggerimenti sull'efficienza della memoria/miglioramento della memoria in merito ai modelli di accesso pianificati in modo da poter leggere in anticipo in modo proattivo o rilasciare memoria in modo più aggressivo, sapendo che non si ritorna in futuro.
2) assolutamente vero
3) "L'area mappata non è sequenziale" è vago. Le regioni mappate in memoria sono "contigue" (sequenziali) nello spazio degli indirizzi virtuali. Abbiamo discusso I/O del disco in sequenza sequenziale sopra. Oppure stai pensando ad altro? Ad ogni modo, mentre le pagine vengono criticate, possono essere trasferite tramite DMA.
Inoltre, ci sono altri motivi per cui la mappatura della memoria può sovraperformare al solito I/O:
- c'è meno la copia:
- spesso OS & routine di livello di libreria passare i dati attraverso uno o più buffer prima di raggiunge un buffer specificato dall'applicativo, l'applicaton alloca dinamicamente l'archiviazione, quindi copia dal buffer I/O su quella memoria in modo che i dati siano utilizzabili dopo che la lettura del file ha completato
- mapping di memoria consente (ma non forzare) in posto di utilizzo (si può solo registrare un puntatore e, eventualmente, di lunghezza)
- continuando per accedere ai dati in-place rischi sono aumentati scambiando tardi: il file/memoria carta potrebbero essere più dettagliato di strutture dati in cui potrebbe essere analizzato, così modelli di accesso sui dati in esso potrebbero avere ulteriori ritardi per colpa in più pagine di memoria
- mappatura della memoria in grado di semplificare il lavoro di analisi dell'applicazione, consentendo l'applicazione trattare l'intero contenuto del file il più accessibile, piuttosto che preoccuparsi di quando leggere un altro buffer completo
- l'ap plication rimanda di più al numero di pagine di saggezza del sistema operativo in RAM fisica in qualsiasi momento, condividendo in modo efficace una cache di dischi ad accesso diretto con l'applicazione
- come pure i commenti di wisher di seguito, "utilizzando la mappatura della memoria tipicamente utilizzare meno chiamate di sistema"
- se più processi accedono lo stesso file, dovrebbero essere in grado di condividere le pagine backing fisiche
le sono ragioni anche il motivo per mmap
può essere più lenta - leggo di post here Linus Torvalds che dice di mmap
:
... giochi da tavolo pagina insieme con l'errore (e anche solo TLB perdere) overhead è facilmente più che il costo della copia di una pagina in una bella maniera in streaming ...
E da un altro di his posts:
abbastanza evidente i costi di installazione e teardown. E intendo apprezzabile. È come seguire le tabelle delle pagine per rimuovere tutto in modo pulito. È la contabilità per mantenere un elenco di tutti i mapping. È lo svuotamento TLB necessario dopo la decompressione.
errore di pagina è costoso. Ecco come viene compilata la mappatura, ed è piuttosto lenta.
FWIW, l'ultima volta che questo è nata per me sul posto di lavoro, inseriti mappato memoria era 80% più veloce di fread
et al per la lettura di record del database binari in un database proprietario, a 64 bit di Linux con i file ~ 170GB .
Cosa ti dice che è più veloce? – Mehrdad
@ Mehrdad Ho visto alcuni commenti in internet che mmap è più veloce –
http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access –