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.