\begin{figure}[!htb]
\centering
- \includegraphics[height=6.5cm]{img/mmap_boundary}
+ \includegraphics[height=6cm]{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}
del contenuto della memoria su cui è mappato.
Per questo, è sempre sconsigliabile eseguire scritture su file attraverso
-l'interfaccia standard, quando lo si è mappato in memoria, è invece possibile
+l'interfaccia standard quando lo si è mappato in memoria, è invece possibile
usare l'interfaccia standard per leggere un file mappato in memoria, purché si
abbia una certa cura; infatti l'interfaccia dell'I/O mappato in memoria mette
a disposizione la funzione \funcd{msync} per sincronizzare il contenuto della
di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto
del file aggiornato.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{11cm}|}
+ \hline
+ \textbf{Valore} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{MS\_SYNC} & richiede una sincronizzazione e ritorna soltanto
+ quando questa è stata completata.\\
+ \const{MS\_ASYNC} & richiede una sincronizzazione, ma ritorna subito
+ non attendendo che questa sia finita.\\
+ \const{MS\_INVALIDATE} & invalida le pagine per tutte le mappature
+ in memoria così da rendere necessaria una
+ rilettura immediata delle stesse.\\
+ \hline
+ \end{tabular}
+ \caption{Valori possibili dell'argomento \param{flag} di \func{msync}.}
+ \label{tab:file_mmap_msync}
+\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ò
+dei valori riportati in tab.~\ref{tab:file_mmap_msync}, di questi però
\const{MS\_ASYNC} e \const{MS\_SYNC} sono incompatibili; con il primo valore
infatti la funzione si limita ad inoltrare la richiesta di sincronizzazione al
meccanismo della memoria virtuale, ritornando subito, mentre con il secondo
attende che la sincronizzazione sia stata effettivamente eseguita. Il terzo
-flag fa invalidare le pagine di cui si richiede la sincronizzazione per tutte
-le mappature dello stesso file, così che esse possano essere immediatamente
-aggiornate ai nuovi valori.
+flag fa sì che vengano invalidate, per tutte le mappature dello stesso file,
+le pagine di cui si è richiesta la sincronizzazione, così che esse possano
+essere immediatamente aggiornate con i nuovi valori.
Una volta che si sono completate le operazioni di I/O si può eliminare la
mappatura della memoria usando la funzione \funcd{munmap}, il suo prototipo è:
anticipata con il meccanismo del
\itindex{read-ahead} \textit{read-ahead} (vedi
sez.~\ref{sec:file_fadvise}) è di
- scarsa utilità.\\
+ scarsa utilità e verrà disabilitata.\\
\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
\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
+ delle pagine quando 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.\\
vari buffer. Un esempio tipico è quando i dati sono strutturati nei campi di
una struttura ed essi devono essere caricati o salvati su un file. Benché
l'operazione sia facilmente eseguibile attraverso una serie multipla di
-chiamate, ci sono casi in cui si vuole poter contare sulla atomicità delle
-operazioni.
-
-Per questo motivo su BSD 4.2 sono state introdotte due nuove system call,
-\funcd{readv} e \funcd{writev},\footnote{in Linux le due funzioni sono riprese
- da BSD4.4, esse sono previste anche dallo standard POSIX.1-2001.} che
-permettono di effettuare con una sola chiamata una lettura o una scrittura su
-una serie di buffer (quello che viene chiamato \textsl{I/O vettorizzato}. I
-relativi prototipi sono:
+chiamate a \func{read} e \func{write}, ci sono casi in cui si vuole poter
+contare sulla atomicità delle operazioni.
+
+Per questo motivo fino da BSD 4.2 vennero introdotte delle nuove system call
+che permettessero di effettuare con una sola chiamata una serie di letture o
+scritture su una serie di buffer, con quello che viene normalmente chiamato
+\textsl{I/O vettorizzato}. Queste funzioni sono \funcd{readv} e
+\funcd{writev},\footnote{in Linux le due funzioni sono riprese da BSD4.4, esse
+ sono previste anche dallo standard POSIX.1-2001.} ed i relativi prototipi
+sono:
\begin{functions}
\headdecl{sys/uio.h}
contenere tutti i dati indicati da \param{vector}. L'operazione avrà successo
ma si perderà l'atomicità del trasferimento da e verso la destinazione finale.
+Si tenga presente infine che queste funzioni operano sui file con
+l'interfaccia dei file descriptor, e non è consigliabile mescolarle con
+l'interfaccia classica dei \textit{file stream}; a causa delle bufferizzazioni
+interne di quest'ultima infatti si potrebbero avere risultati indefiniti e non
+corrispondenti a quanto aspettato.
+
+Come per le normali operazioni di lettura e scrittura, anche per l'\textsl{I/O
+ vettorizzato} si pone il problema di poter effettuare le operazioni in
+maniera atomica a partire da un certa posizione sul file; per questo motivo a
+partire dal kernel 2.6.30 sono state introdotte anche per l'\textsl{I/O
+ vettorizzato} le analoghe delle funzioni \func{pread} e \func{pwrite} (vedi
+sez.~\ref{sec:file_read} e \ref{sec:file_write}) che consentono di effettuare
+letture e scritture vettorizzate a partire da una certa posizione. Le due
+funzioni sono \funcd{preadv} e \func{pwritev} ed i rispettivi prototipi sono:
+
% TODO verificare cosa succederà a preadv e pwritev o alla nuova niovec
% vedi http://lwn.net/Articles/164887/
% inserite nel kernel 2.6.30, vedi http://lwn.net/Articles/326818/
+
\subsection{L'I/O diretto fra file descriptor: \func{sendfile} e
\func{splice}}
\label{sec:file_sendfile_splice}
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
+della funzione. La funzione, per 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
file.\footnote{questo è vero solo per le versioni più recenti, fino al kernel
2.6.6 il valore nullo veniva interpretato letteralmente.} Le modalità sono
indicate dall'argomento \param{advice} che è una maschera binaria dei valori
-illustrati in tab.~\ref{tab:posix_fadvise_flag}. Si tenga presente comunque
-che la funzione dà soltanto un avvertimento, non esiste nessun vincolo per il
-kernel, che utilizza semplicemente l'informazione.
+illustrati in tab.~\ref{tab:posix_fadvise_flag}, che riprendono il significato
+degli analoghi già visti in sez.~\ref{sec:file_memory_map} per
+\func{madvise}.\footnote{dato che si tratta dello stesso tipo di funzionalità,
+ in questo caso applicata direttamente al sistema ai contenuti di un file
+ invece che alla sua mappatura in memoria.} Si tenga presente comunque che la
+funzione dà soltanto un avvertimento, non esiste nessun vincolo per il kernel,
+che utilizza semplicemente l'informazione.
\begin{table}[htb]
\centering
\const{POSIX\_FADV\_DONTNEED}& I dati non saranno acceduti a breve.\\
\hline
\end{tabular}
- \caption{Valori dei bit dell'argomento \param{advice} di
- \func{posix\_fadvise} che indicano la modalità con cui si intende accedere
+ \caption{Valori delle costanti usabili per l'argomento \param{advice} di
+ \func{posix\_fadvise}, che indicano la modalità con cui si intende accedere
ad un file.}
\label{tab:posix_fadvise_flag}
\end{table}
-Anche \func{posix\_fadvise} si appoggia al sistema della memoria virtuale ed
-al meccanismo standard del \textit{readahead} utilizzato dal kernel; in
-particolare con \const{POSIX\_FADV\_SEQUENTIAL} si raddoppia la dimensione
-dell'ammontare di dati letti preventivamente rispetto al default, aspettandosi
-appunto una lettura sequenziale che li utilizzerà, mentre con
+Come \func{madvise} anche \func{posix\_fadvise} si appoggia al sistema della
+memoria virtuale ed al meccanismo standard del \textit{read-ahead} utilizzato
+dal kernel; in particolare con \const{POSIX\_FADV\_SEQUENTIAL} si raddoppia la
+dimensione dell'ammontare di dati letti preventivamente rispetto al default,
+aspettandosi appunto una lettura sequenziale che li utilizzerà, mentre con
\const{POSIX\_FADV\_RANDOM} si disabilita del tutto il suddetto meccanismo,
dato che con un accesso del tutto casuale è inutile mettersi a leggere i dati
immediatamente successivi gli attuali; infine l'uso di
default.
Le due modalità \const{POSIX\_FADV\_NOREUSE} e \const{POSIX\_FADV\_WILLNEED}
-danno invece inizio ad una lettura in cache della regione del file indicata.
-La quantità di dati che verranno letti è ovviamente limitata in base al carico
-che si viene a creare sul sistema della memoria virtuale, ma in genere una
-lettura di qualche megabyte viene sempre soddisfatta (ed un valore superiore è
-solo raramente di qualche utilità). In particolare l'uso di
-\const{POSIX\_FADV\_WILLNEED} si può considerare l'equivalente POSIX di
-\func{readahead}.
+fino al kernel 2.6.18 erano equivalenti, a partire da questo kernel la prima
+viene non ha più alcune effetto, mentre la seconda dà inizio ad una lettura in
+cache della regione del file indicata. La quantità di dati che verranno letti
+è ovviamente limitata in base al carico che si viene a creare sul sistema
+della memoria virtuale, ma in genere una lettura di qualche megabyte viene
+sempre soddisfatta (ed un valore superiore è solo raramente di qualche
+utilità). In particolare l'uso di \const{POSIX\_FADV\_WILLNEED} si può
+considerare l'equivalente POSIX di \func{readahead}.
Infine con \const{POSIX\_FADV\_DONTNEED} si dice al kernel di liberare le
pagine di cache occupate dai dati presenti nella regione di file indicata.
% http://kernelnewbies.org/Linux_2_6_23
% \func{fallocate} con il 2.6.25 supporta pure XFS
+Infine a partire dal kernel 2.6.23 è stata introdotta la nuova system call
+\funcd{fallocate}, che consente di realizzare direttamente all'interno del
+kernel le funzionalità di \func{posix\_fallocate}. Trattandosi di una funzione
+di servizio questa non è stata definita come funzione di libreria e pertanto
+può essere invocata indirettamente con l'ausilio di \func{syscall} (vedi
+sez.~\ref{sec:intro_syscall}; il suo prototipo è:
+
+\begin{functions}
+ \headdecl{linux/falloc.h}
+ \funcdecl{long fallocate(int fd, int mode, loff\_t offset, loff\_t len)}
+
+ Prealloca dello spazio disco per un file.
+
+ \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di errore,
+ nel qual caso \var{errno} può assumere i valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] \param{fd} non fa riferimento ad un file descriptor
+ valido aperto in scrittura.
+ \item[\errcode{EFBIG}] la somma di \param{offset} e \param{len} eccede le
+ dimensioni massime di un file.
+ \item[\errcode{EINVAL}] \param{offset} è minore di zero o \param{len} è
+ minore o uguale a zero.
+ \item[\errcode{ENODEV}] \param{fd} non fa riferimento ad un file ordinario
+ o a una directory.
+ \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per l'operazione.
+ \item[\errcode{ENOSYS}] il filesystem contenente il file associato
+ a \param{fd} non supporta \func{fallocate}.
+ \item[\errcode{EOPNOTSUPP}] il filesystem contenente il file associato
+ a \param{fd} non supporta l'operazione \param{mode}.
+ \end{errlist}
+ ed inoltre \errval{EINTR}, \errval{EIO}.
+}
+\end{functions}
+
+
%\subsection{L'utilizzo delle porte di I/O}
%\label{sec:file_io_port}
% 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
+% LocalWords: POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE tmpfs
+% LocalWords: DONTFORK DOFORK shmfs preadv pwritev syscall linux loff
%%% Local Variables: