Aggiunte in treno di ieri.
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 30 Nov 2009 13:01:23 +0000 (13:01 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 30 Nov 2009 13:01:23 +0000 (13:01 +0000)
fileadv.tex

index 7c3734c3da82a21225f1522445187fa28be20b07..fe93ced5c1f25d8dded8ff8b4f7b87f0ef6d4e52 100644 (file)
@@ -192,7 +192,7 @@ bloccher
 ritornerà subito con un errore di \errcode{EWOULDBLOCK}. Per rilasciare un
 \textit{file lock} si dovrà invece usare \const{LOCK\_UN}.
 
 ritornerà subito con un errore di \errcode{EWOULDBLOCK}. Per rilasciare un
 \textit{file lock} si dovrà invece usare \const{LOCK\_UN}.
 
-Si tenga presente che non esite una modalità per eseguire atomicamente un
+Si tenga presente che non esiste una modalità per eseguire atomicamente un
 cambiamento del tipo di blocco (da \textit{shared lock} a \textit{esclusive
   lock}), il blocco deve essere prima rilasciato e poi richiesto, ed è sempre
 possibile che nel frattempo abbia successo un'altra richiesta pendente,
 cambiamento del tipo di blocco (da \textit{shared lock} a \textit{esclusive
   lock}), il blocco deve essere prima rilasciato e poi richiesto, ed è sempre
 possibile che nel frattempo abbia successo un'altra richiesta pendente,
@@ -1775,7 +1775,7 @@ anche con il fatto che sono stati restituiti meno dati di quelli richiesti.
 
 Come già per \func{select} e \func{poll} anche per l'interfaccia di
 \textit{epoll} si pone il problema di gestire l'attesa di segnali e di dati
 
 Come già per \func{select} e \func{poll} anche per l'interfaccia di
 \textit{epoll} si pone il problema di gestire l'attesa di segnali e di dati
-contemponeamente, per far questo di nuovo è necessaria una variante della
+contemporaneamente, per far questo di nuovo è necessaria una variante della
 funzione di attesa che consenta di reimpostare all'uscita una maschera di
 segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in
 questo caso la funzione si chiama \funcd{epoll\_pwait}\footnote{introdotta a
 funzione di attesa che consenta di reimpostare all'uscita una maschera di
 segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in
 questo caso la funzione si chiama \funcd{epoll\_pwait}\footnote{introdotta a
@@ -3134,7 +3134,6 @@ partire da \param{offset} per \param{lenght} byte, preferibilmente
 all'indirizzo \param{start}. Il valore di \param{offset} deve essere un
 multiplo della dimensione di una pagina di memoria. 
 
 all'indirizzo \param{start}. Il valore di \param{offset} deve essere un
 multiplo della dimensione di una pagina di memoria. 
 
-
 \begin{table}[htb]
   \centering
   \footnotesize
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -3395,25 +3394,6 @@ relativi tempi di modifica. In questo modo si 
 di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto
 del file aggiornato.
 
 di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto
 del file aggiornato.
 
-\begin{table}[htb]
-  \centering
-  \footnotesize
-  \begin{tabular}[c]{|l|l|}
-    \hline
-    \textbf{Valore} & \textbf{Significato} \\
-    \hline
-    \hline
-    \const{MS\_ASYNC}     & Richiede la sincronizzazione.\\
-    \const{MS\_SYNC}      & Attende che la sincronizzazione si eseguita.\\
-    \const{MS\_INVALIDATE}& Richiede che le altre mappature dello stesso file
-                            siano invalidate.\\
-    \hline    
-  \end{tabular}
-  \caption{Le costanti che identificano i bit per la maschera binaria
-    dell'argomento \param{flag} di \func{msync}.}
-  \label{tab:file_mmap_rsync}
-\end{table}
-
 L'argomento \param{flag} è specificato come maschera binaria composta da un OR
 dei valori riportati in tab.~\ref{tab:file_mmap_rsync}, di questi però
 \const{MS\_ASYNC} e \const{MS\_SYNC} sono incompatibili; con il primo valore
 L'argomento \param{flag} è specificato come maschera binaria composta da un OR
 dei valori riportati in tab.~\ref{tab:file_mmap_rsync}, di questi però
 \const{MS\_ASYNC} e \const{MS\_SYNC} sono incompatibili; con il primo valore
@@ -3667,25 +3647,108 @@ le opportune strategie di ottimizzazione. Il suo prototipo 
 \begin{functions}  
   \headdecl{sys/mman.h} 
 
 \begin{functions}  
   \headdecl{sys/mman.h} 
 
-  \funcdecl{int madvise(void *start, size\_t length, int advise)}
+  \funcdecl{int madvise(void *start, size\_t length, int advice)}
   
   
-  Fornisci indicazioni sull'uso di un \textit{memory mapping}.
+  Fornisce indicazioni sull'uso previsto 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}
 
   \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}] .
+    \item[\errcode{EBADF}] la mappatura esiste ma non corrisponde ad un file.
+    \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.
+    \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}).
+    \item[\errcode{ENOMEM}] gli indirizzi specificati non sono mappati, o, in
+      caso \const{MADV\_WILLNEED}, non c'è sufficiente memoria per soddisfare
+      la richiesta.
     \end{errlist}
     \end{errlist}
+    ed inoltre \errval{EAGAIN} e \errval{ENOSYS}.
   }
 \end{functions}
 
   }
 \end{functions}
 
+La sezione di memoria sulla quale si intendono fornire le indicazioni deve
+essere indicata con l'indirizzo iniziale \param{start} e l'estensione
+\param{lenght}, il valore di \param{start} deve essere allineato,
+mentre \param{length} deve essere un numero positivo.\footnote{la versione di
+  Linux consente anche un valore nullo per \param{lenght}, inoltre se una
+  parte dell'intervallo non è mappato in memoria l'indicazione viene comunque
+  applicata alle restanti parti, anche se la funzione ritorna un errore di
+  \errval{ENOMEM}.} L'indicazione viene espressa dall'argomento \param{advice}
+che deve essere specificato con uno dei valori\footnote{si tenga presente che
+  gli ultimi tre valori sono specifici di Linux (introdotti a partire dal
+  kernel 2.6.16) e non previsti dallo standard POSIX.1b.} riportati in
+tab.~\ref{tab:madvise_advice_values}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{10 cm}|}
+    \hline
+    \textbf{Valore} & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{MADV\_NORMAL}  & nessuna indicazione specifica, questo è il valore
+                            di default usato quando non si è chiamato
+                            \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
+                            \itindex{read-ahead} \textit{read-ahead} (vedi
+                            sez.~\ref{sec:file_fadvise}) è di
+                            scarsa utilità.\\
+    \const{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file,
+                            quindi da una parte sarà opportuno eseguire una
+                            lettura anticipata, e dall'altra si potranno
+                            scartare immediatamente le pagine una volta che
+                            queste siano state lette.\\
+    \const{MADV\_WILLNEED}& ci si aspetta un accesso nell'immediato futuro,
+                            pertanto l'applicazione del \textit{read-ahead}
+                            deve essere incentivata.\\
+    \const{MADV\_DONTNEED}& non ci si aspetta nessun accesso nell'immediato
+                            futuro, pertanto le pagine possono essere
+                            liberate dal kernel non appena necessario; l'area
+                            di memoria resterà accessibile, ma un accesso
+                            richiederà che i dati vengano ricaricati dal file
+                            a cui la mappatura fa riferimento.\\
+    \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}.\footnotemark\\ 
+    \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 \itindex{copy~on~write}
+                            \textit{copy on write} effettui la rilocazione
+                            delle pagine quando un il padre scrive sull'area
+                            di memoria dopo la \func{fork}, cosa che può
+                            causare problemi per l'hardware che esegue
+                            operazioni in DMA su quelle pagine.\\
+    \const{MADV\_DOFORK}  & rimuove l'effetto della precedente
+                            \const{MADV\_DONTFORK}.\\ 
+    \hline
+  \end{tabular}
+  \caption{Valori dell'argomento \param{advice} di \func{madvise}.}
+  \label{tab:madvise_advice_values}
+\end{table}
+
+\footnotetext{se usato su altri tipi di filesystem causa un errore di
+  \errcode{ENOSYS}.}
+
+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.}
 
 
-% TODO documentare \func{madvise}
 \itindend{memory~mapping}
 
 
 \itindend{memory~mapping}
 
 
@@ -4331,6 +4394,8 @@ questa sezione una serie funzioni che consentono ai programmi di ottimizzare
 il loro accesso ai dati dei file e controllare la gestione del relativo
 \textit{caching}.
 
 il loro accesso ai dati dei file e controllare la gestione del relativo
 \textit{caching}.
 
+\itindbeg{read-ahead}
+
 Una prima funzione che può essere utilizzata per modificare la gestione
 ordinaria dell'I/O su un file è \funcd{readahead},\footnote{questa è una
   funzione specifica di Linux, introdotta con il kernel 2.4.13, e non deve
 Una prima funzione che può essere utilizzata per modificare la gestione
 ordinaria dell'I/O su un file è \funcd{readahead},\footnote{questa è una
   funzione specifica di Linux, introdotta con il kernel 2.4.13, e non deve
@@ -4364,12 +4429,12 @@ La funzione richiede che venga letto in anticipo il contenuto del file
 corrispondenti alle dimensioni delle pagine di memoria, ed i valori di
 \param{offset} e \param{count} arrotondati di conseguenza.
 
 corrispondenti alle dimensioni delle pagine di memoria, ed i valori di
 \param{offset} e \param{count} arrotondati di conseguenza.
 
-La funzione estende quello che è un comportamento normale del
-kernel\footnote{per ottimizzare gli accessi al disco il kernel quando si legge
-  un file, aspettandosi che l'accesso prosegua, esegue sempre una lettura
-  anticipata di una certa quantità di dati; questo meccanismo viene chiamato
-  \textit{readahead}, da cui deriva il nome della funzione.} effettuando la
-lettura in cache della sezione richiesta e bloccandosi fintanto che questa non
+La funzione estende quello che è un comportamento normale del kernel che
+quando si legge un file, aspettandosi che l'accesso prosegua, esegue sempre
+una lettura preventiva di una certa quantità di dati; questo meccanismo di
+lettura anticipata viene chiamato \textit{read-ahead}, da cui deriva il nome
+della funzione. La funzione, ottimizzare gli accessi a disco, effettua la
+lettura in cache della sezione richiesta e si blocca fintanto che questa non
 viene completata.  La posizione corrente sul file non viene modificata ed
 indipendentemente da quanto indicato con \param{count} la lettura dei dati si
 interrompe una volta raggiunta la fine del file.
 viene completata.  La posizione corrente sul file non viene modificata ed
 indipendentemente da quanto indicato con \param{count} la lettura dei dati si
 interrompe una volta raggiunta la fine del file.
@@ -4380,6 +4445,8 @@ dati saranno necessari in seguito. Si potr
 momento (ad esempio in fase di inizializzazione) la lettura, così da ottenere
 una migliore risposta nelle operazioni successive.
 
 momento (ad esempio in fase di inizializzazione) la lettura, così da ottenere
 una migliore risposta nelle operazioni successive.
 
+\itindend{read-ahead}
+
 Il concetto di \func{readahead} viene generalizzato nello standard
 POSIX.1-2001 dalla funzione \funcd{posix\_fadvise},\footnote{anche se
   l'argomento \param{len} è stato modificato da \ctyp{size\_t} a \ctyp{off\_t}
 Il concetto di \func{readahead} viene generalizzato nello standard
 POSIX.1-2001 dalla funzione \funcd{posix\_fadvise},\footnote{anche se
   l'argomento \param{len} è stato modificato da \ctyp{size\_t} a \ctyp{off\_t}
@@ -4590,6 +4657,8 @@ mancanza di spazio disco.
 % LocalWords:  Jens Anxboe vmsplice seek ESPIPE GIFT TCP CORK MSG splicecp nr
 % LocalWords:  nwrite segs patch readahead posix fadvise TC advice FADV NORMAL
 % LocalWords:  SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG
 % LocalWords:  Jens Anxboe vmsplice seek ESPIPE GIFT TCP CORK MSG splicecp nr
 % LocalWords:  nwrite segs patch readahead posix fadvise TC advice FADV NORMAL
 % LocalWords:  SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG
+% LocalWords:  POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE
+% LocalWords:  DONTFORK DOFORK
 
 
 %%% Local Variables: 
 
 
 %%% Local Variables: