X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileadv.tex;h=87d5ba7319a6f3f52561e3f0aa539e98ebc2e714;hb=0e076776e7518bf19a03be39bdfb45cd76040cba;hp=4b603130f60921044b11ed1c67bcb1d20c99a5aa;hpb=3baefd41c790c995a2ca8e25bf5b56ad4eec6c83;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index 4b60313..87d5ba7 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -913,6 +913,8 @@ operazioni di I/O volute. \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} è @@ -1001,6 +1003,9 @@ utilizzabili.\footnote{vale a dire impostare il contenuto di % TODO fare esempio che usa O_ASYNC +\itindend{signal~driven~I/O} + + \subsection{I meccanismi di notifica asincrona.} \label{sec:file_asyncronous_lease} @@ -1054,7 +1059,6 @@ questo \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 @@ -1300,9 +1304,12 @@ eliminato.\footnote{anzi, una delle capacit 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 @@ -2910,7 +2917,7 @@ che anzi in certi casi si potevano avere anche dei peggioramenti. Questo ha 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 @@ -2937,13 +2944,15 @@ semplicemente un ``\textsl{dimezzamento}'' di \func{sendfile}.\footnote{nel 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 @@ -2951,7 +2960,7 @@ Il concetto che sta dietro a \func{splice} invece 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} @@ -3335,7 +3344,7 @@ detto che i dati vengono effettivamente spostati o copiati, il kernel infatti 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} @@ -3389,7 +3398,7 @@ all'accesso al disco; il suo prototipo 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 @@ -3444,13 +3453,13 @@ definisce la macro \macro{\_XOPEN\_SOURCE} ad almeno 600, 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 @@ -3465,11 +3474,11 @@ kernel, che utilzza semplicemente l'informazione. 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.\\ @@ -3484,7 +3493,7 @@ kernel, che utilzza semplicemente l'informazione. 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 @@ -3548,7 +3557,7 @@ possibile scrivere sul file indicato dall'argomento \param{fd} nella regione 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. @@ -3559,6 +3568,8 @@ 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} @@ -4467,10 +4478,11 @@ possibilit % 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