Poca roba di domenica
[gapil.git] / fileadv.tex
index bb1df38d03c8114448eead5d32e4287929657437..7c3734c3da82a21225f1522445187fa28be20b07 100644 (file)
@@ -1612,7 +1612,7 @@ quest'ultima serve sia in ingresso (quando usata con \func{epoll\_ctl}) ad
 impostare quali eventi osservare, che in uscita (nei risultati ottenuti con
 \func{epoll\_wait}) per ricevere le notifiche degli eventi avvenuti.  La sua
 definizione è riportata in fig.~\ref{fig:epoll_event}. 
+
 Il primo campo, \var{events}, è una maschera binaria in cui ciascun bit
 corrisponde o ad un tipo di evento, o una modalità di notifica; detto campo
 deve essere specificato come OR aritmetico delle costanti riportate in
@@ -3040,11 +3040,11 @@ rispetto a quella classica vista in cap.~\ref{cha:file_unix_interface}, 
 cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della
 \textsl{paginazione} \index{paginazione} usato dalla memoria virtuale (vedi
 sez.~\ref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un
-file in una sezione dello spazio di indirizzi del processo
- che lo ha allocato
+file in una sezione dello spazio di indirizzi del processo che lo ha allocato.
+
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=12cm]{img/mmap_layout}
+  \includegraphics[width=14cm]{img/mmap_layout}
   \caption{Disposizione della memoria di un processo quando si esegue la
   mappatura in memoria di un file.}
   \label{fig:file_mmap_layout}
@@ -3229,7 +3229,7 @@ tab.~\ref{tab:file_mmap_flag}.
                              ignorati.\footnotemark\\
     \const{MAP\_ANON}      & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
     \const{MAP\_FILE}      & Valore di compatibilità, ignorato.\\
-    \const{MAP\_32BIT}     & Esegue la mappatura sui primi 2GiB dello spazio
+    \const{MAP\_32BIT}     & Esegue la mappatura sui primi 2Gb dello spazio
                              degli indirizzi, viene supportato solo sulle
                              piattaforme \texttt{x86-64} per compatibilità con
                              le applicazioni a 32 bit. Viene ignorato se si è
@@ -3248,6 +3248,17 @@ tab.~\ref{tab:file_mmap_flag}.
   \label{tab:file_mmap_flag}
 \end{table}
 
+\footnotetext[68]{dato che tutti faranno riferimento alle stesse pagine di
+  memoria.}  
+
+\footnotetext[69]{l'uso di questo flag con \const{MAP\_SHARED} è stato
+  implementato in Linux a partire dai kernel della serie 2.4.x; esso consente
+  di creare segmenti di memoria condivisa e torneremo sul suo utilizzo in
+  sez.~\ref{sec:ipc_mmap_anonymous}.}
+
+\footnotetext{questo flag ed il precedente \const{MAP\_POPULATE} sono stati
+  introdotti nel kernel 2.5.46 insieme alla mappatura non lineare di cui
+  parleremo più avanti.}
 
 Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere
 piuttosto complessi, essi si possono comprendere solo tenendo presente che
@@ -3262,32 +3273,19 @@ tipo di accesso.
 regione di cui si è richiesta la mappatura. A prima vista infatti si potrebbe
 ritenere che anch'essi debbano generare un segnale di violazione di accesso;
 questo però non tiene conto del fatto che, essendo basata sul meccanismo della
-paginazione \index{paginazione}, la mappatura in memoria non può che essere
+\index{paginazione} paginazione, la mappatura in memoria non può che essere
 eseguita su un segmento di dimensioni rigorosamente multiple di quelle di una
 pagina, ed in generale queste potranno non corrispondere alle dimensioni
 effettive del file o della sezione che si vuole mappare.
 
-\footnotetext[68]{dato che tutti faranno riferimento alle stesse pagine di
-  memoria.}  
-
-\footnotetext[69]{l'uso di questo flag con \const{MAP\_SHARED} è stato
-  implementato in Linux a partire dai kernel della serie 2.4.x; esso consente
-  di creare segmenti di memoria condivisa e torneremo sul suo utilizzo in
-  sez.~\ref{sec:ipc_mmap_anonymous}.}
-
-\footnotetext{questo flag ed il precedente \const{MAP\_POPULATE} sono stati
-  introdotti nel kernel 2.5.46 insieme alla mappatura non lineare di cui
-  parleremo più avanti.}
-
 \begin{figure}[!htb] 
   \centering
-  \includegraphics[height=6cm]{img/mmap_boundary}
+  \includegraphics[height=6.5cm]{img/mmap_boundary}
   \caption{Schema della mappatura in memoria di una sezione di file di
     dimensioni non corrispondenti al bordo di una pagina.}
   \label{fig:file_mmap_boundary}
 \end{figure}
 
-
 Il caso più comune è quello illustrato in fig.~\ref{fig:file_mmap_boundary},
 in cui la sezione di file non rientra nei confini di una pagina: in tal caso
 verrà il file sarà mappato su un segmento di memoria che si estende fino al
@@ -3653,9 +3651,43 @@ mappatura che gi
   essere utile per il linker dinamico, in particolare quando viene effettuato
   il \textit{prelink} delle applicazioni.}
 
-\itindend{memory~mapping}
+Per i vantaggi illustrati all'inizio del paragrafo l'interfaccia del
+\textit{memory mapped I/O} viene usata da una grande varietà di programmi,
+spesso con esigenze molto diverse fra di loro riguardo le modalità con cui
+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.
+
+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 è:
+\begin{functions}  
+  \headdecl{sys/mman.h} 
+
+  \funcdecl{int madvise(void *start, size\_t length, int advise)}
+  
+  Fornisci indicazioni sull'uso di un \textit{memory mapping}.
+
+  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+    \begin{errlist}
+    \item[\errcode{EAGAIN}] .
+    \item[\errcode{EBADF}] .
+    \item[\errcode{EINVAL}] .
+    \item[\errcode{EIO}] .
+    \item[\errcode{ENOMEM}] .
+    \end{errlist}
+  }
+\end{functions}
+
 
 % TODO documentare \func{madvise}
+\itindend{memory~mapping}
+
 
 \subsection{I/O vettorizzato: \func{readv} e \func{writev}}
 \label{sec:file_multiple_io}