\subsection{Il \textit{Signal driven I/O}}
\label{sec:file_asyncronous_operation}
+\itindbeg{signal~driven~I/O}
+
Abbiamo accennato in sez.~\ref{sec:file_open} che è possibile, attraverso
l'uso del flag \const{O\_ASYNC},\footnote{l'uso del flag di \const{O\_ASYNC} e
dei comandi \const{F\_SETOWN} e \const{F\_GETOWN} per \func{fcntl} è
% TODO fare esempio che usa O_ASYNC
+\itindend{signal~driven~I/O}
+
+
\subsection{I meccanismi di notifica asincrona.}
\label{sec:file_asyncronous_lease}
\textit{lease breaker}, cerca di eseguire una \func{open} o una
\func{truncate} sul file del quale l'\textit{holder} detiene il
\textit{lease}.
-
La notifica avviene in maniera analoga a come illustrato in precedenza per
l'uso di \const{O\_ASYNC}: di default viene inviato al \textit{lease holder}
il segnale \const{SIGIO}, ma questo segnale può essere modificato usando il
Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà
essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e
-con l'interfaccia di \textit{epoll}; siccome gli eventi vengono notificati
-come dati disponibili in lettura, dette funzioni ritorneranno tutte le volte
-che si avrà un evento di notifica. Così, invece di dover utilizzare i
+con l'interfaccia di \textit{epoll};\footnote{ed a partire dal kernel 2.6.25 è
+ stato introdotto anche il supporto per il \itindex{signal~driven~I/O}
+ \texttt{signal-driven I/O} trattato in
+ sez.~\ref{sec:file_asyncronous_operation}.} siccome gli eventi vengono
+notificati come dati disponibili in lettura, dette funzioni ritorneranno tutte
+le volte che si avrà un evento di notifica. Così, invece di dover utilizzare i
segnali,\footnote{considerati una pessima scelta dal punto di vista
dell'interfaccia utente.} si potrà gestire l'osservazione degli eventi con
una qualunque delle modalità di \textit{I/O multiplexing} illustrate in
portato, per i kernel della serie 2.6,\footnote{per alcune motivazioni di
questa scelta si può fare riferimento a quanto illustrato da Linus Torvalds
in \href{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}
- {\texttt{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}}.}
+ {\textsf{http://www.cs.helsinki.fi/linux/linux-kernel/2001-03/0200.html}}.}
alla decisione di consentire l'uso della funzione soltanto quando il file da
cui si legge supporta le operazioni di \textit{memory mapping} (vale a dire
non è un socket) e quello su cui si scrive è un socket; in tutti gli altri
sarebbe altro che la lettura degli stessi su un buffer seguita dalla
relativa scrittura, cosa che in questo caso si dovrebbe eseguire con due
chiamate a \func{splice}.} In realtà le due system call sono profondamente
-diverse nel loro meccanismo di funzionamento; \func{sendfile} infatti, come
-accennato, non necessita affatto di avere a disposizione un buffer interno,
-perché esegue un trasferimento diretto di dati; questo la rende in generale
-molto più efficiente, ma anche limitata nelle sue applicazioni, dato che
-questo tipo di trasferimento è possibile solo in casi specifici.\footnote{e
- nel caso di Linux questi sono anche solo quelli in cui essa può essere
- effettivamente utilizzata.}
+diverse nel loro meccanismo di funzionamento;\footnote{questo fino al kernel
+ 2.6.23, dove \func{sendfile} è stata reimplementata in termini di
+ \func{splice}, pur mantenendo disponibile la stessa interfaccia verso l'user
+ space.} \func{sendfile} infatti, come accennato, non necessita di avere a
+disposizione un buffer interno, perché esegue un trasferimento diretto di
+dati; questo la rende in generale più efficiente, ma anche limitata nelle sue
+applicazioni, dato che questo tipo di trasferimento è possibile solo in casi
+specifici.\footnote{e nel caso di Linux questi sono anche solo quelli in cui
+ essa può essere effettivamente utilizzata.}
Il concetto che sta dietro a \func{splice} invece è diverso,\footnote{in
realtà la proposta originale di Larry Mc Voy non differisce poi tanto negli
stata la reinterpretazione che ne è stata fatta nell'implementazione su
Linux realizzata da Jens Anxboe, concetti che sono esposti sinteticamente
dallo stesso Linus Torvalds in \href{http://kerneltrap.org/node/6505}
- {\texttt{http://kerneltrap.org/node/6505}}.} si tratta semplicemente di una
+ {\textsf{http://kerneltrap.org/node/6505}}.} si tratta semplicemente di una
funzione che consente di fare in maniera del tutto generica delle operazioni
di trasferimento di dati fra un file e un buffer gestito interamente in kernel
space. In questo caso il cuore della funzione (e delle affini \func{vmsplice}
realizza le \textit{pipe} come un insieme di puntatori\footnote{per essere
precisi si tratta di un semplice buffer circolare, un buon articolo sul tema
si trova su \href{http://lwn.net/Articles/118750/}
- {\texttt{http://lwn.net/Articles/118750/}}.} alle pagine di memoria interna
+ {\textsf{http://lwn.net/Articles/118750/}}.} alle pagine di memoria interna
che contengono i dati, per questo una volta che i dati sono presenti nella
memoria del kernel tutto quello che viene fatto è creare i suddetti puntatori
ed aumentare il numero di referenze; questo significa che anche con \func{tee}
La funzione richiede che venga letto in anticipo il contenuto del file
\param{fd} a partire dalla posizione \param{offset} e per un ammontare di
-\param{count} bytes, in modo da portarlo in cache. La funzione usa la
+\param{count} byte, in modo da portarlo in cache. La funzione usa la
\index{memoria~virtuale} memoria virtuale ed il meccanismo della
\index{paginazione} paginazione per cui la lettura viene eseguita in blocchi
corrispondenti alle dimensioni delle pagine di memoria, ed i valori di
La funzione dichiara al kernel le modalità con cui intende accedere alla
regione del file indicato da \param{fd} che inizia alla posizione
\param{offset} e si estende per \param{len} byte. Se per \param{len} si usa un
-valora nullo la regione coperta sarà da \param{offset} alla fine del
+valore nullo la regione coperta sarà da \param{offset} alla fine del
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 utilzza semplicemente l'informazione.
+kernel, che utilizza semplicemente l'informazione.
\begin{table}[htb]
\centering
comportamento sarà identico a quello che si
avrebbe senza nessun avviso.\\
\const{POSIX\_FADV\_SEQUENTIAL}& L'applicazione si aspetta di accedere di
- accedere ai dati spercificati in maniera
+ accedere ai dati specificati in maniera
sequenziale, a partire dalle posizioni più
basse.\\
\const{POSIX\_FADV\_RANDOM} & I dati saranno letti in maniera
- completamete causale.\\
+ completamente causale.\\
\const{POSIX\_FADV\_NOREUSE} & I dati saranno acceduti una sola volta.\\
\const{POSIX\_FADV\_WILLNEED}& I dati saranno acceduti a breve.\\
\const{POSIX\_FADV\_DONTNEED}& I dati non saranno acceduti a breve.\\
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, apettandosi
+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
che inizia dalla posizione \param{offset} e si estende per \param{len} byte;
se questa si estende oltre la fine del file le dimensioni di quest'ultimo
saranno incrementate di conseguenza. Dopo aver eseguito con successo la
-funzione è garantito che una scrittura nella regione inidicata non fallirà per
+funzione è garantito che una scrittura nella regione indicata non fallirà per
mancanza di spazio disco.
% TODO documentare \func{fallocate}, introdotta con il 2.6.23
% vedi http://lwn.net/Articles/226710/ e http://lwn.net/Articles/240571/
+% http://kernelnewbies.org/Linux_2_6_23
+% \func{fallocate} con il 2.6.25 supporta pure XFS
%\subsection{L'utilizzo delle porte di I/O}
% LocalWords: NUL sizeof casting printevent nread limits sysconf SC wrapper Di
% LocalWords: splice result argument DMA controller zerocopy Linus Larry Voy
% LocalWords: Jens Anxboe vmsplice seek ESPIPE GIFT TCP CORK MSG splicecp nr
-% LocalWords: nwrite segs patch readahead
+% LocalWords: nwrite segs patch readahead posix fadvise TC advice FADV NORMAL
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG