GNU/Linux >> Linux Esercitazione >  >> Linux

Modo più veloce per spostare la pagina di memoria rispetto a mremap()?

Cosa ti fa pensare mremap potrebbe mai essere efficiente per lo scambio di singole pagine 4k? Per lo meno, un viaggio di andata e ritorno nel kernelspace anche solo per leggere un singolo valore (come pid) e restituirlo costerà di più che spostare 4k di dati. E questo prima di arrivare ai costi di invalidazione della cache/TLB della rimappatura della memoria, che non capisco abbastanza bene da affrontare in questa risposta, ma che dovrebbe avere dei costi seri.

mremap è utile fondamentalmente per una cosa:implementare realloc per grande allocazioni servite da mmap . E per grandi intendo probabilmente almeno 100k.


Sembra che non esista un meccanismo user-land più veloce per riordinare le pagine di memoria rispetto a memcpy(). mremap() è molto più lento e quindi utile solo per ridimensionare un'area di memoria precedentemente assegnata usando mmap().

Ma le tabelle delle pagine devono essere estremamente veloci, ti sento dire! Ed è possibile che user-land chiami le funzioni del kernel milioni di volte al secondo! I seguenti riferimenti aiutano a spiegare perché mremap() è così lento:

"An Introduction to Intel Memory Management" è una bella introduzione alla teoria della mappatura delle pagine di memoria.

"Concetti chiave della memoria virtuale Intel" mostra come funziona in modo più dettagliato, nel caso in cui prevedi di scrivere il tuo sistema operativo :-)

"Condivisione delle tabelle delle pagine nel kernel Linux" mostra alcune delle difficili decisioni architettoniche di mappatura delle pagine della memoria di Linux e il loro effetto sulle prestazioni.

Esaminando tutti e tre i riferimenti insieme, possiamo vedere che finora gli architetti del kernel hanno compiuto pochi sforzi per esporre la mappatura della pagina di memoria all'area utente in modo efficiente. Anche nel kernel, la manipolazione della tabella delle pagine deve essere eseguita utilizzando fino a tre blocchi che saranno lenti.

Andando avanti, poiché la tabella delle pagine stessa è composta da 4k pagine, potrebbe essere possibile modificare il kernel in modo che determinate pagine della tabella delle pagine siano uniche per un particolare thread e si possa presumere che abbiano accesso senza blocco per la durata del processi. Ciò faciliterebbe una manipolazione molto efficiente di quella particolare pagina della tabella delle pagine tramite user-land. Ma questo esula dall'ambito della domanda originale.


Linux
  1. Gestione della memoria Linux:scambio, cache e VM condivisa

  2. Cosa sono la pagina mappata in memoria e la pagina anonima?

  3. Qual è il modo migliore per gestire le condizioni di memoria insufficiente in Java?

  4. Qual è il modo più veloce per spostare un milione di immagini da una directory all'altra in Linux?

  5. Modo più veloce per eliminare un gran numero di file

Scopri perché "meno" è più veloce del comando "più" per un'efficace navigazione dei file

Un modo più semplice per eseguire il Chroot rispetto al Bind-mounting?

Gestione della memoria Linux:memoria virtuale e paginazione della domanda

Java utilizza molta più memoria rispetto alla dimensione dell'heap (o dimensiona correttamente il limite di memoria Docker)

C'è qualcosa di più veloce di `find . | wc -l` per contare i file in una directory?

Linux - C'è un modo per identificare la velocità della tua memoria attraverso il software?