From baec5331e567f35346bf2d0a6938f081d6c698ee Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 17 Jan 2015 09:19:43 +0000 Subject: [PATCH] Materiale su aio_error e aio_return --- fileadv.tex | 95 +++++++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 43 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 1c7f147..4410d6b 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -3493,10 +3493,6 @@ raggruppati in un solo evento. \subsection{L'interfaccia POSIX per l'I/O asincrono} \label{sec:file_asyncronous_io} -% vedere anche http://davmac.org/davpage/linux/async-io.html e -% http://www.ibm.com/developerworks/linux/library/l-async/ - - Una modalità alternativa all'uso dell'\textit{I/O multiplexing} per gestione dell'I/O simultaneo su molti file è costituita dal cosiddetto \textsl{I/O asincrono} o ``AIO''. Il concetto base dell'\textsl{I/O asincrono} è che le @@ -3505,16 +3501,17 @@ ritornare, così che il processo non viene bloccato. In questo modo diventa ad esempio possibile effettuare una richiesta preventiva di dati, in modo da poter effettuare in contemporanea le operazioni di calcolo e quelle di I/O. -Benché la modalità di apertura asincrona di un file possa risultare utile in -varie occasioni (in particolar modo con i socket e gli altri file per i quali -le funzioni di I/O sono \index{system~call~lente} \textit{system call} lente), -essa è comunque limitata alla notifica della disponibilità del file descriptor -per le operazioni di I/O, e non ad uno svolgimento asincrono delle medesime. -Lo standard POSIX.1b definisce una interfaccia apposita per l'I/O asincrono -vero e proprio,\footnote{questa è stata ulteriormente perfezionata nelle - successive versioni POSIX.1-2001 e POSIX.1-2008.} che prevede un insieme di -funzioni dedicate per la lettura e la scrittura dei file, completamente -separate rispetto a quelle usate normalmente. +Benché la modalità di apertura asincrona di un file vista in +sez.~\ref{sec:signal_driven_io} possa risultare utile in varie occasioni (in +particolar modo con i socket e gli altri file per i quali le funzioni di I/O +sono \index{system~call~lente} \textit{system call} lente), essa è comunque +limitata alla notifica della disponibilità del file descriptor per le +operazioni di I/O, e non ad uno svolgimento asincrono delle medesime. Lo +standard POSIX.1b definisce una interfaccia apposita per l'I/O asincrono vero +e proprio,\footnote{questa è stata ulteriormente perfezionata nelle successive + versioni POSIX.1-2001 e POSIX.1-2008.} che prevede un insieme di funzioni +dedicate per la lettura e la scrittura dei file, completamente separate +rispetto a quelle usate normalmente. In generale questa interfaccia è completamente astratta e può essere implementata sia direttamente nel kernel, che in user space attraverso l'uso @@ -3623,60 +3620,72 @@ riutilizzare la stessa struttura per un'altra operazione fintanto che la precedente non sia stata ultimata. In generale per ogni operazione si deve utilizzare una diversa struttura \struct{aiocb}. +% vedere anche http://davmac.org/davpage/linux/async-io.html e +% http://www.ibm.com/developerworks/linux/library/l-async/ + Dato che si opera in modalità asincrona, il successo di \func{aio\_read} o \func{aio\_write} non implica che le operazioni siano state effettivamente eseguite in maniera corretta; per verificarne l'esito l'interfaccia prevede altre due funzioni, che permettono di controllare lo stato di esecuzione. La prima è \funcd{aio\_error}, che serve a determinare un eventuale stato di errore; il suo prototipo è: -\begin{prototype}{aio.h} - {int aio\_error(const struct aiocb *aiocbp)} - Determina lo stato di errore delle operazioni di I/O associate a - \param{aiocbp}. - - \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con - successo, altrimenti restituisce il codice di errore relativo al loro - fallimento.} -\end{prototype} -Se l'operazione non si è ancora completata viene restituito l'errore di -\errcode{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è +\begin{funcproto}{ +\fhead{aio.h} +\fdecl{int aio\_error(const struct aiocb *aiocbp)} +\fdesc{Determina lo stato di errore di una operazione di I/O asincrono.} +} + +{La funzione ritorna $0$ se le operazioni si sono concluse con successo, + altrimenti restituisce \errval{EINPROGRESS} se non sono concluse, + \errcode{ECANCELED} se sono state cancellate o il relativo codice di errore + se sono fallite.} +\end{funcproto} + +Se l'operazione non si è ancora completata viene sempre restituito l'errore di +\errcode{EINPROGRESS}, mentre se è stata cancellata ritorna +\errcode{ECANCELED}. La funzione ritorna zero quando l'operazione si è conclusa con successo, altrimenti restituisce il codice dell'errore verificatosi, ed esegue la corrispondente impostazione di \var{errno}. Il codice può essere sia \errcode{EINVAL} ed \errcode{EBADF}, dovuti ad un valore errato per \param{aiocbp}, che uno degli errori possibili durante l'esecuzione dell'operazione di I/O richiesta, nel qual caso saranno restituiti, a seconda del caso, i codici di errore delle \textit{system call} \func{read}, -\func{write} e \func{fsync}. +\func{write}, \func{fsync} e \func{fdatasync}. Una volta che si sia certi che le operazioni siano state concluse (cioè dopo che una chiamata ad \func{aio\_error} non ha restituito \errcode{EINPROGRESS}), si potrà usare la funzione \funcd{aio\_return}, che permette di verificare il completamento delle operazioni di I/O asincrono; il suo prototipo è: -\begin{prototype}{aio.h} -{ssize\_t aio\_return(const struct aiocb *aiocbp)} -Recupera il valore dello stato di ritorno delle operazioni di I/O associate a -\param{aiocbp}. - -\bodydesc{La funzione restituisce lo stato di uscita dell'operazione - eseguita.} -\end{prototype} +\begin{funcproto}{ +\fhead{aio.h} +\fdecl{ssize\_t aio\_return(const struct aiocb *aiocbp)} +\fdesc{Ottiene lo stato dei risultati di una operazione di I/O asincrono.} +} + +{La funzione ritorna lo stato di uscita dell'operazione eseguita (il valore + che avrebbero restituito le equivalenti funzioni eseguite in maniera + sincrona).} +\end{funcproto} -La funzione deve essere chiamata una sola volte per ciascuna operazione -asincrona, essa infatti fa sì che il sistema rilasci le risorse ad essa -associate. É per questo motivo che occorre chiamare la funzione solo dopo che -l'operazione cui \param{aiocbp} fa riferimento si è completata. Una chiamata -precedente il completamento delle operazioni darebbe risultati indeterminati. +La funzione recupera il valore dello stato di ritorno delle operazioni di I/O +associate a \param{aiocbp} deve essere chiamata una sola volta per ciascuna +operazione asincrona, essa infatti fa sì che il sistema rilasci le risorse ad +essa associate. É per questo motivo che occorre chiamare la funzione solo dopo +che l'operazione cui \param{aiocbp} fa riferimento si è completata +verificandolo con \func{aio\_error} ed una sola volta. Una chiamata precedente +il completamento delle operazioni darebbe risultati indeterminati, così come +chiamarla più di una volta. La funzione restituisce il valore di ritorno relativo all'operazione eseguita, così come ricavato dalla sottostante \textit{system call} (il numero di byte -letti, scritti o il valore di ritorno di \func{fsync}). É importante chiamare -sempre questa funzione, altrimenti le risorse disponibili per le operazioni di -I/O asincrono non verrebbero liberate, rischiando di arrivare ad un loro -esaurimento. +letti, scritti o il valore di ritorno di \func{fsync} o \func{fdatasync}). É +importante chiamare sempre questa funzione, altrimenti le risorse disponibili +per le operazioni di I/O asincrono non verrebbero liberate, rischiando di +arrivare ad un loro esaurimento. Oltre alle operazioni di lettura e scrittura l'interfaccia POSIX.1b mette a disposizione un'altra operazione, quella di sincronizzazione dell'I/O, -- 2.30.2