Completata remap_file_pages, e documentati un po' meglio MAP_POPULATE e
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 26 Jun 2005 14:13:24 +0000 (14:13 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 26 Jun 2005 14:13:24 +0000 (14:13 +0000)
MAP_NONBLOCK.

fileadv.tex

index f7fba16f329e1116e2f3d44123f7d51635667b7b..67d6795a113785b3eb8ff1e9c00e73d4a833304c 100644 (file)
@@ -1493,8 +1493,9 @@ Esistono per
   dai database o dai programmi che realizzano macchine virtuali.} in cui è
 utile poter mappare sezioni diverse di un file su diverse zone di memoria.
 
-Questo è ovviamente sempre possibile eseguendo la funzione \func{mmap} per
-ciascuna delle diverse aree,\footnote{ed in effetti è quello che veniva fatto
+Questo è ovviamente sempre possibile eseguendo ripetutamente la funzione
+\func{mmap} per ciascuna delle diverse aree del file che si vogliono mappare
+in sequenza non lineare,\footnote{ed in effetti è quello che veniva fatto
   anche con Linux prima che fossero introdotte queste estensioni.} ma questo
 approccio ha delle conseguenze molto pesanti in termini di prestazioni.
 Infatti per ciascuna mappatura in memoria deve essere definita nella
@@ -1549,14 +1550,47 @@ memoria e pagine del file; si tenga presente che \func{remap\_file\_pages}
 permette anche di mappare la stessa pagina di un file in più pagine della
 regione mappata.
 
-La funzione richiede che si identifichi la pagine di file che si vuole
-rimappare con \param{pgoff} e \param{size}, che ne indicano l'inizio (in unità
-della dimensione delle pagine di memoria) \param{start}
-
-Insiema al meccanismo per la mappatura non-lineare con sono stati introdotti
-anche due nuovi flag per \func{mmap}: \const{MAP\_POPULATE} e
-\const{MAP\_NONBLOCK}.
-
+La funzione richiede che si identifichi la sezione del file che si vuole
+riposizionare all'interno del \textit{memory mapping} con gli argomenti
+\param{pgoff} e \param{size}; l'argomento \param{start} invece deve indicare
+un indirizzo all'interno dell'area definita dall'\func{mmap} iniziale, a
+partire dal quale la sezione di file indicata verrà rimappata. L'argomento
+\param{prot} deve essere sempre nullo, mentre \param{flags} prende gli stessi
+valori di \func{mmap} (quelli di tab.~\ref{tab:file_mmap_prot}) ma di tutti i
+flag solo \const{MAP\_NONBLOCK} non viene ignorato.
+
+Insieme alla funzione \func{remap\_file\_pages} nel kernel 2.5.46 con sono
+stati introdotti anche due nuovi flag per \func{mmap}: \const{MAP\_POPULATE} e
+\const{MAP\_NONBLOCK}.  Il primo dei due consente di abilitare il meccanismo
+del \itindex{prefaulting} \textit{prefaulting}. Questo viene di nuovo in aiuto
+per migliorare le prestazioni in certe condizioni di utilizzo del
+\textit{memory mapping}. 
+
+Il problema si pone tutte le volte che si vuole mappare in memoria un file di
+grosse dimensioni. Il comportamento normale del sistema della
+\index{memoria~virtuale} memoria virtuale è quello per cui la regione mappata
+viene aggiunta alla \itindex{page~table} \textit{page table} del processo, ma
+i dati verranno effettivamente utilizzati (si avrà cioè un
+\itindex{page~fault} \textit{page fault} che li trasferisce dal disco alla
+memoria) soltanto in corrispondenza dell'accesso a ciascuna delle pagine
+interessate dal \textit{memory mapping}. 
+
+Questo vuol dire che il passaggio dei dati dal disco alla memoria avverrà una
+pagina alla volta con un gran numero di \itindex{page~fault} \textit{page
+  fault}, chiaramente se si sa in anticipo che il file verrà utilizzato
+immediatamente, è molto più efficiente eseguire un \itindex{prefaulting}
+\textit{prefaulting} in cui tutte le pagine di memoria interessate alla
+mappatura vengono ``\textsl{popolate}'' in una sola volta, questo
+comportamento viene abilitato quando si usa con \func{mmap} il flag
+\const{MAP\_POPULATE}.
+
+Dato che l'uso di \const{MAP\_POPULATE} comporta dell'l'I/O su disco che può
+rallentare l'esecuzione di \func{mmap} è stato introdotto anche un secondo
+flag, \const{MAP\_NONBLOCK}, che esegue un \itindex{prefaulting}
+\textit{prefaulting} più limitato in cui vengono popolate solo le pagine della
+mappatura che già si trovano nella cache del kernel.\footnote{questo può
+  essere utile per il linker dinamico, in particolare quando viene effettuato
+  il \textit{prelink} delle applicazioni.}
 
 \itindend{memory~mapping}