2012-03-22 21 views
27

Eventuali duplicati:
mmap() vs. reading blocksPerché mmap() è più veloce dell'IO sequenziale?

ho sentito (letto su internet da qualche parte), che è più veloce di mmap() sequenziale IO. È corretto? Se sì allora perché è più veloce?

  • mmap() non legge in modo sequenziale.
  • mmap() deve recuperare dal disco stesso stesso read() fa
  • La zona mappata non è sequenziale - quindi nessun DMA (?).

Quindi mmap() dovrebbe essere effettivamente più lento di read() da un file? Quale delle mie supposizioni sopra è sbagliata?

+3

Cosa ti dice che è più veloce? – Mehrdad

+1

@ Mehrdad Ho visto alcuni commenti in internet che mmap è più veloce –

+3

http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access –

risposta

42

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 .

+2

Bella risposta. Inoltre, utilizzando la mappatura della memoria in genere si utilizzano meno chiamate di sistema. Ciò potrebbe comportare una significativa accelerazione delle letture ad accesso casuale (ad esempio 'lseek' prima di ogni' read'). –

+0

@ well-wisher: buon punto, lo aggiungo alla lista sopra ... evviva –

+1

Anche se questa è una domanda duplicata, questa risposta sembra essere più chiara di altre risposte in [questo post] (http: // stackoverflow.com/questions/45972/mmap-vs-reading-blocks) ... – sleepsort

5

"Più veloce" in termini assoluti non esiste. Dovresti specificare vincoli e circostanze.

mmap() non sta leggendo in sequenza.

cosa ti fa pensare? Se si accede effettivamente alla memoria mappata in sequenza, il sistema di solito preleverà le pagine nell'ordine indicato.

mmap() deve recuperare dal disco stesso stessa lettura() fa

sicuro, ma il sistema operativo determina il tempo e la dimensione del buffer

La zona mappata non è sequenziale - quindi niente DMA (?).

vedi sopra

Cosa mmap aiuta con è che non v'è alcun tampone più spazio utente coinvolto, il "leggere" si svolge là dove il kernel del sistema operativo vede in forma e in blocchi che possono essere ottimizzate. Questo può essere un vantaggio in termini di velocità, ma prima di tutto questa è solo un'interfaccia che è più facile da usare.

Se si desidera conoscere la velocità per una particolare configurazione (hardware, sistema operativo, utilizzare il modello), è necessario misurare.

6
  1. mmap() possono condividere tra processo.
  2. DMA verrà utilizzato quando possibile. DMA non richiede memoria contigua: molte schede di fascia alta supportano DMA scatter-gather.
  3. Se possibile, l'area di memoria può essere condivisa con la cache del blocco kernel. Quindi c'è il lessor che copia.
  4. La memoria per mmap è allocata dal kernel, è sempre allineata.
Problemi correlati