Finita madvise, trattata posix_madvise
[gapil.git] / fileadv.tex
index aecd73e5fcc3ab66c91508d0fb8b03560ad8e7a2..a255851500e3df6f31b39457cfc58da36b883175 100644 (file)
@@ -4547,17 +4547,20 @@ verranno eseguiti gli accessi ad un file; è ad esempio molto comune per i
 database effettuare accessi ai dati in maniera pressoché casuale, mentre un
 riproduttore audio o video eseguirà per lo più letture sequenziali.
 
+\itindend{memory~mapping}
+
 Per migliorare le prestazioni a seconda di queste modalità di accesso è
 disponibile una apposita funzione, \funcd{madvise},\footnote{tratteremo in
   sez.~\ref{sec:file_fadvise} le funzioni che consentono di ottimizzare
   l'accesso ai file con l'interfaccia classica.} che consente di fornire al
-kernel delle indicazioni su dette modalità, così che possano essere adottate
-le opportune strategie di ottimizzazione. Il suo prototipo è:
+kernel delle indicazioni su come un processo intende accedere ad un segmento
+di memoria, anche al di là delle mappature dei file, così che possano essere
+adottate le opportune strategie di ottimizzazione. Il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{sys/mman.h}
 \fdecl{int madvise(void *start, size\_t length, int advice)}
-\fdesc{Fornisce indicazioni sull'uso previsto di un \textit{memory mapping}.} 
+\fdesc{Fornisce indicazioni sull'uso previsto di un segmento di memoria.} 
 }
 
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
@@ -4567,7 +4570,9 @@ le opportune strategie di ottimizzazione. Il suo prototipo è:
     \item[\errcode{EINVAL}] \param{start} non è allineato alla dimensione di
       una pagina, \param{length} ha un valore negativo, o \param{advice} non è
       un valore valido, o si è richiesto il rilascio (con
-      \const{MADV\_DONTNEED}) di pagine bloccate o condivise.
+      \const{MADV\_DONTNEED}) di pagine bloccate o condivise o si è usato
+      \const{MADV\_MERGEABLE} o \const{MADV\_UNMERGEABLE} ma il kernel non è
+      stato compilato per il relativo supporto.
     \item[\errcode{EIO}] la paginazione richiesta eccederebbe i limiti (vedi
       sez.~\ref{sec:sys_resource_limit}) sulle pagine residenti in memoria del
       processo (solo in caso di \const{MADV\_WILLNEED}).
@@ -4578,7 +4583,6 @@ le opportune strategie di ottimizzazione. Il suo prototipo è:
   ed inoltre \errval{EAGAIN} e \errval{ENOSYS} nel loro significato generico.}
 \end{funcproto}
 
-
 La sezione di memoria sulla quale si intendono fornire le indicazioni deve
 essere indicata con l'indirizzo iniziale \param{start} e l'estensione
 \param{length}, il valore di \param{start} deve essere allineato,
@@ -4591,10 +4595,15 @@ applicata alle restanti parti, anche se la funzione ritorna un errore di
 L'indicazione viene espressa dall'argomento \param{advice} che deve essere
 specificato con uno dei valori riportati in
 tab.~\ref{tab:madvise_advice_values}; si tenga presente che i valori indicati
-nella seconda parte sono specifici di Linux e non sono previsti dallo standard
-POSIX.1b.
+nella seconda parte della tabella sono specifici di Linux e non sono previsti
+dallo standard POSIX.1b.
+La funzione non ha, tranne il caso di \const{MADV\_DONTFORK}, nessun effetto
+sul comportamento di un programma, ma può influenzarne le prestazioni fornendo
+al kernel indicazioni sulle esigenze dello stesso, così che sia possibile
+scegliere le opportune strategie per la gestione del \itindex{read-ahead}
+\textit{read-ahead} e del caching dei dati.
 
-\begin{table}[htb]
+\begin{table}[!htb]
   \centering
   \footnotesize
   \begin{tabular}[c]{|l|p{10 cm}|}
@@ -4613,7 +4622,8 @@ POSIX.1b.
                             \func{madvise}.\\
     \const{MADV\_RANDOM}  & ci si aspetta un accesso casuale all'area
                             indicata, pertanto l'applicazione di una lettura
-                            anticipata con il meccanismo del \textit{read-ahead} (vedi
+                            anticipata con il meccanismo del
+                            \textit{read-ahead} (vedi 
                             sez.~\ref{sec:file_fadvise}) è di
                             scarsa utilità e verrà disabilitata.\\
     \const{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file,
@@ -4625,35 +4635,63 @@ POSIX.1b.
                             pertanto l'applicazione del \textit{read-ahead}
                             deve essere incentivata.\\
     \hline
-    \const{MADV\_REMOVE}  & libera un intervallo di pagine di memoria ed il
-                            relativo supporto sottostante; è supportato
-                            soltanto sui filesystem in RAM \textit{tmpfs} e
-                            \textit{shmfs} se usato su altri tipi di
-                            filesystem causa un errore di \errcode{ENOSYS}
-                            (dal kernel 2.6.16).\\
+    \const{MADV\_DONTDUMP}& esclude da un \textit{core dump} (vedi
+                            sez.~\ref{sec:sig_standard}) le pagine 
+                            specificate, viene usato per evitare di scrivere
+                            su disco dati relativi a zone di memoria che si sa
+                            non essere utili in un \textit{core dump}.\\
+    \const{MADV\_DODUMP}  & rimuove l'effetto della precedente
+                            \const{MADV\_DONTDUMP} (dal kernel 3.4).\\ 
     \const{MADV\_DONTFORK}& impedisce che l'intervallo specificato venga
                             ereditato dal processo figlio dopo una
                             \func{fork}; questo consente di evitare che il
                             meccanismo del \textit{copy on write} effettui la
                             rilocazione delle pagine quando il padre scrive
-                            sull'area di memoria dopo la \func{fork}, cosa che può
-                            causare problemi per l'hardware che esegue
+                            sull'area di memoria dopo la \func{fork}, cosa che
+                            può causare problemi per l'hardware che esegue
                             operazioni in DMA su quelle pagine (dal kernel
                             2.6.16).\\
     \const{MADV\_DOFORK}  & rimuove l'effetto della precedente
                             \const{MADV\_DONTFORK} (dal kernel 2.6.16).\\ 
-    \const{MADV\_MERGEABLE}& marca la pagina come accorpabile (indicazione
+    \const{MADV\_HUGEPAGE}& abilita il meccanismo delle \textit{Transparent
+                              Huge Page} (vedi sez.~\ref{sec:huge_pages})
+                            sulla regione indicata; se questa è allineata
+                            alle relative dimensioni il kernel alloca
+                            direttamente delle \textit{huge page}; è
+                            utilizzabile solo con mappature anomime private
+                            (dal kernel 2.6.38).\\
+    \const{MADV\_NOHUGEPAGE}& impedisce che la regione indicata venga
+                            collassata in eventuali \textit{huge page} (dal
+                            kernel 2.6.38).\\
+    \const{MADV\_HWPOISON} &opzione ad uso di debug per verificare codice
+                            che debba gestire errori nella gestione della
+                            memoria; richiede una apposita opzione di
+                            compilazione del kernel, privilegi amministrativi
+                            (la capacità \const{CAP\_SYS\_ADMIN}) e provoca
+                            l'emissione di un segnale di \const{SIGBUS} dal
+                            programma chiamante e rimozione della mappatura
+                            (dal kernel 2.6.32).\\
+    \const{MADV\_SOFT\_OFFLINE}&opzione utilizzata per il debug del
+                            codice di verifica degli errori di gestione
+                            memoria, richiede una apposita opzione di
+                            compilazione (dal kernel 2.6.33).\\
+    \const{MADV\_MERGEABLE}& marca la pagina come accorpabile, indicazione
                             principalmente ad uso dei sistemi di
-                            virtualizzazione).\footnotemark\\
-    \const{MADV\_UNMERGEABLE}& \\
+                            virtualizzazione\footnotemark (dal kernel 2.6.32).\\
+    \const{MADV\_REMOVE}  & libera un intervallo di pagine di memoria ed il
+                            relativo supporto sottostante; è supportato
+                            soltanto sui filesystem in RAM \textit{tmpfs} e
+                            \textit{shmfs} se usato su altri tipi di
+                            filesystem causa un errore di \errcode{ENOSYS}
+                            (dal kernel 2.6.16).\\
+    \const{MADV\_UNMERGEABLE}& rimuove l'effetto della precedente
+                            \const{MADV\_MERGEABLE} (dal kernel 2.6.32). \\
      \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{advice} di \func{madvise}.}
   \label{tab:madvise_advice_values}
 \end{table}
 
-\footnotetext{.}
-
 \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che
   identifica pagine di memoria identiche e le accorpa in una unica pagina
   (soggetta al \textit{copy-on-write} per successive modifiche); per evitare
@@ -4663,19 +4701,70 @@ POSIX.1b.
   la loro occupazione di memoria, ma il meccanismo può essere usato anche in
   altre applicazioni in cui sian presenti numerosi processi che usano gli
   stessi dati; per maggiori dettagli si veda
-  \href{http://kernelnewbies.org/Linux_2_6_32\#head-d3f32e41df508090810388a57efce73f52660ccb}{\texttt{http://kernelnewbies.org/Linux\_2\_6\_32}}.}
+  \href{http://kernelnewbies.org/Linux_2_6_32\#head-d3f32e41df508090810388a57efce73f52660ccb}{\texttt{http://kernelnewbies.org/Linux\_2\_6\_32}}
+  e la documentazione nei sorgenti del kernel
+  (\texttt{Documentation/vm/ksm.txt}).} 
 
-La funzione non ha, tranne il caso di \const{MADV\_DONTFORK}, nessun effetto
-sul comportamento di un programma, ma può influenzarne le prestazioni fornendo
-al kernel indicazioni sulle esigenze dello stesso, così che sia possibile
-scegliere le opportune strategie per la gestione del \itindex{read-ahead}
-\textit{read-ahead} e del caching dei dati. A differenza da quanto specificato
-nello standard POSIX.1b, per il quale l'uso di \func{madvise} è a scopo
-puramente indicativo, Linux considera queste richieste come imperative, per
-cui ritorna un errore qualora non possa soddisfarle.\footnote{questo
-  comportamento differisce da quanto specificato nello standard.}
 
-\itindend{memory~mapping}
+A differenza da quanto specificato nello standard POSIX.1b, per il quale l'uso
+di \func{madvise} è a scopo puramente indicativo, Linux considera queste
+richieste come imperative, per cui ritorna un errore qualora non possa
+soddisfarle; questo comportamento differisce da quanto specificato nello
+standard.
+
+Nello standard POSIX.1-2001 è prevista una ulteriore funzione
+\funcd{posix\_madvise} che su Linux viene reimplementata utilizzando
+\func{madvise}; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/mman.h}
+\fdecl{int posix\_madvise(void *start, size\_t lenght, int advice)}
+\fdesc{Fornisce indicazioni sull'uso previsto di un segmento di memoria.} 
+}
+
+{La funzione ritorna $0$ in caso di successo ed un valore positivo per un
+  errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+    \item[\errcode{EINVAL}] \param{start} non è allineato alla dimensione di
+      una pagina, \param{length} ha un valore negativo, o \param{advice} non è
+      un valore valido.
+    \item[\errcode{ENOMEM}] gli indirizzi specificati non sono nello spazio di
+      indirizzi del processo.
+  \end{errlist}
+}
+\end{funcproto}
+
+Gli argomenti \param{addr} e \param{len} hanno lo stesso significato degli
+analoghi di \func{madvise}, mentre \param{advice} può assumere solo i valori
+indicati in tab.~\ref{tab:posix_madvise_advice_values}, che riflettono gli
+analoghi di \func{madvise}. 
+
+\begin{table}[!htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|l|}
+    \hline
+    \textbf{Valore} & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{POSIX\_MADV\_DONTNEED}& analogo a \const{MADV\_DONTNEED}.\\
+    \const{POSIX\_MADV\_NORMAL}  & identico a \const{MADV\_NORMAL}.\\
+    \const{POSIX\_MADV\_RANDOM}  & identico a \const{MADV\_RANDOM}.\\
+    \const{POSIX\_MADV\_SEQUENTIAL}& identico a \const{MADV\_SEQUENTIAL}.\\
+    \const{POSIX\_MADV\_WILLNEED}& identico a \const{MADV\_WILLNEED}.\\
+     \hline
+  \end{tabular}
+  \caption{Valori dell'argomento \param{advice} di \func{posix\_madvise}.}
+  \label{tab:posix_madvise_advice_values}
+\end{table}
+
+A differenza di quanto indicato dallo standard su Linux un valore nullo
+di \param{len} è consentito. Inoltre a partire dalle \acr{glibc} 2.6
+\const{POSIX\_MADV\_DONTNEED} viene ignorato, in quanto l'uso del
+corrispondente \const{MADV\_DONTNEED} di \func{madvise} ha, per la semantica
+imperativa, l'effetto immediato di far liberare le pagine da parte del kernel,
+che viene considerato distruttivo.
+
 
 
 \subsection{I/O vettorizzato: \func{readv} e \func{writev}}