From 1e09a8256d97540694702ac3952f36281542bc60 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 24 Jul 2002 16:08:11 +0000 Subject: [PATCH] Iniziato l'AIO. --- fileadv.tex | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 531aaa0..56b24be 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -392,9 +392,65 @@ di thread. Al momento\footnote{fino ai kernel della serie 2.4.x, nella serie asincrono.} esiste una sola versione stabile di questa interfaccia, quella delle \acr{glibc}, che è realizzata completamente in user space. Esistono comunque vari progetti sperimentali (come il KAIO della SGI, o i patch di -Benjamin La Haise) che prevedono una interfaccia che utilizza un supporto -diretto da parte del kernel. +Benjamin La Haise) che prevedono un supporto diretto da parte del kernel. +Lo standard prevede che tutte le operazioni di I/O asincrono siano controllate +attraverso l'uso di una apposita struttura \type{aiocb} (il cui nome sta per +\textit{asyncronous I/O control block}), che viene passata come argomento a +tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in +\file{aio.h}, è riportata in \figref{fig:file_aiocb}. Nello steso file è +definita la macro \macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la +disponibilità di questa funzionalità. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} +struct aiocb +{ + int aio_fildes; /* File descriptor. */ + off_t aio_offset; /* File offset */ + int aio_lio_opcode; /* Operation to be performed. */ + int aio_reqprio; /* Request priority offset. */ + volatile void *aio_buf; /* Location of buffer. */ + size_t aio_nbytes; /* Length of transfer. */ + struct sigevent aio_sigevent; /* Signal number and value. */ +}; + \end{lstlisting} + \end{minipage} + \normalsize + \caption{La struttura \type{aiocb}, usata per il controllo dell'I/O + asincrono.} + \label{fig:file_aiocb} +\end{figure} + +Le operazioni di I/O asincrono possono essere effettuate solo su un file già +aperto, il cui file descriptor deve essere specificato tramite il campo +\var{aio\_fildes}; il file deve inolte supportare la funzione \func{lseek}, +pertanto terminali e pipe sono esclusi. Non c'è limite al numero di operazioni +contemporanee effettuabili su un singolo file. + +Dato che più operazioni possono essere eseguita in maniera asincrona, il +concetto di posizione corrente sul file viene a mancare; pertanto ciascuna +operazione deve sempre specificare nel campo \var{aio\_offset} la posizione +sul file da cui i dati saranno letti o scritti. Nel campo \var{aio\_buf} poi +andrà specificato l'indirizzo del buffer usato per l'I/O, ed in +\var{aio\_nbytes} la lunghezza del trasferimento. + +Dato che l'I/O asincrono può supportare + + + +Le due funzioni principali dell'interfaccia sono quelle per la lettura e +scrittura, \func{aio\_read} e \func{aio\_write}, i cui prototipi sono: +\begin{functions} + \headdecl{aio.h} + \funcdecl{int aio\_read(struct aiocb *aiocbp)} + Richiede una lettura asincrona sul file specificato tramite \param{aiocbp}. + + \funcdecl{int aio\_write(struct aiocb *aiocbp)} + Richiede una scrittura asincrona sul file specificato tramite \param{aiocbp}. +\end{functions} @@ -403,7 +459,7 @@ diretto da parte del kernel. Un caso abbastanza comune è quello in cui ci si trova a dover affrontare una serie multipla di operazioni di I/O, come una serie di letture o scritture di -vari buffer. In questo caso +vari buffer. In questo caso -- 2.30.2