From: Simone Piccardi Date: Sun, 26 Jun 2005 14:13:24 +0000 (+0000) Subject: Completata remap_file_pages, e documentati un po' meglio MAP_POPULATE e X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=89cbf934a0cf938abbf12c42b0f30308290f22ec;p=gapil.git Completata remap_file_pages, e documentati un po' meglio MAP_POPULATE e MAP_NONBLOCK. --- diff --git a/fileadv.tex b/fileadv.tex index f7fba16..67d6795 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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}