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,
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
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
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
\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}
- \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}
+ ed inoltre \errval{EAGAIN} e \errval{ENOSYS}.
}
\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}
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
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.
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}
% 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: