X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=75f04719580043d508630eda1a59ef497cc50dba;hp=b4c7d0012595d51cd65f87f041d978b6a19b3875;hb=dc6f430983f53479f813a2b7bc5ec6517e4b7e98;hpb=5caa39643ac00a899fd137969f04831c569929e5 diff --git a/fileadv.tex b/fileadv.tex index b4c7d00..75f0471 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1026,10 +1026,9 @@ valore di \param{aiocbp}. Quando una operazione viene cancellata una successiva chiamata ad \func{aio\_error} riporterà \errcode{ECANCELED} come codice di errore, ed il suo codice di ritorno sarà -1, inoltre il meccanismo di notifica non verrà invocato. Se si specifica una operazione relativa ad un -altro file descriptor il risultato è indeterminato. - -In caso di successo, i possibili valori di ritorno per \func{aio\_cancel} sono -tre (anch'essi definiti in \file{aio.h}): +altro file descriptor il risultato è indeterminato. In caso di successo, i +possibili valori di ritorno per \func{aio\_cancel} (anch'essi definiti in +\file{aio.h}) sono tre: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\const{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la cancellazione sono state già completate, @@ -1104,29 +1103,28 @@ lettura o scrittura; il suo prototipo } \end{prototype} -La funzione esegue la richiesta delle \param{nent} operazioni indicate dalla -lista \param{list}; questa deve contenere gli indirizzi di altrettanti -\textit{control block}, opportunamente inizializzati; in particolare nel caso -dovrà essere specificato il tipo di operazione tramite il campo -\var{aio\_lio\_opcode}, che può prendere i tre valori: +La funzione esegue la richiesta delle \param{nent} operazioni indicate nella +lista \param{list} che deve contenere gli indirizzi di altrettanti +\textit{control block} opportunamente inizializzati; in particolare dovrà +essere specificato il tipo di operazione con il campo \var{aio\_lio\_opcode}, +che può prendere i valori: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{LIO\_READ}] si richiede una operazione di lettura. \item[\const{LIO\_WRITE}] si richiede una operazione di scrittura. \item[\const{LIO\_NOP}] non si effettua nessuna operazione. \end{basedescript} -l'ultimo valore viene usato quando si ha a che fare con un vettore di -dimensione fissa, per poter specificare solo alcune operazioni, o quando si è -dovuto cancellare delle operazioni e si deve ripetere la richiesta per quelle -non completate. +dove \const{LIO\_NOP} viene usato quando si ha a che fare con un vettore di +dimensione fissa, per poter specificare solo alcune operazioni, o quando si +sono dovute cancellare delle operazioni e si deve ripetere la richiesta per +quelle non completate. -L'argomento \param{mode} permette di stabilire il comportamento della -funzione, se viene specificato il valore \const{LIO\_WAIT} la funzione si -blocca fino al completamento di tutte le operazioni richieste; se invece si -specifica \const{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver -messo in coda tutte le richieste. In questo caso il chiamante può richiedere -la notifica del completamento di tutte le richieste, impostando l'argomento -\param{sig} in maniera analoga a come si fa per il campo \var{aio\_sigevent} -di \struct{aiocb}. +L'argomento \param{mode} controlla il comportamento della funzione, se viene +usato il valore \const{LIO\_WAIT} la funzione si blocca fino al completamento +di tutte le operazioni richieste; se si usa \const{LIO\_NOWAIT} la funzione +ritorna immediatamente dopo aver messo in coda tutte le richieste. In tal caso +il chiamante può richiedere la notifica del completamento di tutte le +richieste, impostando l'argomento \param{sig} in maniera analoga a come si fa +per il campo \var{aio\_sigevent} di \struct{aiocb}. \section{Altre modalità di I/O avanzato} @@ -1163,37 +1161,34 @@ prototipi sono: \begin{functions} \headdecl{sys/uio.h} - \funcdecl{int readv(int fd, const struct iovec *vector, int count)} Esegue - una lettura vettorizzata da \param{fd} nei \param{count} buffer specificati - da \param{vector}. - - \funcdecl{int writev(int fd, const struct iovec *vector, int count)} Esegue - una scrittura vettorizzata da \param{fd} nei \param{count} buffer - specificati da \param{vector}. + \funcdecl{int readv(int fd, const struct iovec *vector, int count)} + \funcdecl{int writev(int fd, const struct iovec *vector, int count)} + + Eseguono rispettivamente una lettura o una scrittura vettorizzata. \bodydesc{Le funzioni restituiscono il numero di byte letti o scritti in caso di successo, e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EBADF}] si è specificato un file descriptor sbagliato. \item[\errcode{EINVAL}] si è specificato un valore non valido per uno degli argomenti (ad esempio \param{count} è maggiore di \const{MAX\_IOVEC}). \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di di avere eseguito una qualunque lettura o scrittura. \item[\errcode{EAGAIN}] \param{fd} è stato aperto in modalità non bloccante e non ci sono dati in lettura. - \item[\errcode{EOPNOTSUPP}] La coda delle richieste è momentaneamente piena. + \item[\errcode{EOPNOTSUPP}] la coda delle richieste è momentaneamente piena. \end{errlist} - ed inoltre \errval{EISDIR}, \errval{ENOMEM}, \errval{EFAULT} (se non sono - stato allocati correttamente i buffer specificati nei campi - \var{iov\_base}), più tutti gli ulteriori errori che potrebbero avere le - usuali funzioni di lettura e scrittura eseguite su \param{fd}.} + ed anche \errval{EISDIR}, \errval{EBADF}, \errval{ENOMEM}, \errval{EFAULT} + (se non sono stati allocati correttamente i buffer specificati nei campi + \var{iov\_base}), più gli eventuali errori delle funzioni di lettura e + scrittura eseguite su \param{fd}.} \end{functions} -Entrambe le funzioni usano una struttura \struct{iovec}, definita in -fig.~\ref{fig:file_iovec}, che definisce dove i dati devono essere letti o -scritti. Il primo campo, \var{iov\_base}, contiene l'indirizzo del buffer ed -il secondo, \var{iov\_len}, la dimensione dello stesso. +Entrambe le funzioni usano una struttura \struct{iovec}, la cui definizione è +riportata in fig.~\ref{fig:file_iovec}, che definisce dove i dati devono +essere letti o scritti ed in che quantità. Il primo campo della struttura, +\var{iov\_base}, contiene l'indirizzo del buffer ed il secondo, +\var{iov\_len}, la dimensione dello stesso. \begin{figure}[!htb] \footnotesize \centering @@ -1206,12 +1201,12 @@ il secondo, \var{iov\_len}, la dimensione dello stesso. \label{fig:file_iovec} \end{figure} -I buffer da utilizzare sono indicati attraverso l'argomento \param{vector} che -è un vettore di strutture \struct{iovec}, la cui lunghezza è specificata da -\param{count}. Ciascuna struttura dovrà essere inizializzata per -opportunamente per indicare i vari buffer da/verso i quali verrà eseguito il -trasferimento dei dati. Essi verranno letti (o scritti) nell'ordine in cui li -si sono specificati nel vettore \param{vector}. +La lista dei buffer da utilizzare viene indicata attraverso l'argomento +\param{vector} che è un vettore di strutture \struct{iovec}, la cui lunghezza +è specificata dall'argomento \param{count}. Ciascuna struttura dovrà essere +inizializzata opportunamente per indicare i vari buffer da e verso i quali +verrà eseguito il trasferimento dei dati. Essi verranno letti (o scritti) +nell'ordine in cui li si sono specificati nel vettore \param{vector}. \subsection{File mappati in memoria} @@ -1225,6 +1220,14 @@ cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della sez.~\ref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un file in una sezione dello spazio di indirizzi del processo. +\begin{figure}[htb] + \centering + \includegraphics[width=12cm]{img/mmap_layout} + \caption{Disposizione della memoria di un processo quando si esegue la + mappatura in memoria di un file.} + \label{fig:file_mmap_layout} +\end{figure} + Il meccanismo è illustrato in fig.~\ref{fig:file_mmap_layout}, una sezione del file viene \textsl{mappata} direttamente nello spazio degli indirizzi del programma. Tutte le operazioni di lettura e scrittura su variabili contenute @@ -1236,14 +1239,6 @@ segmento di memoria con quello del file mappato su di esso. Per questo motivo si può parlare tanto di \textsl{file mappato in memoria}, quanto di \textsl{memoria mappata su file}. -\begin{figure}[htb] - \centering - \includegraphics[width=14cm]{img/mmap_layout} - \caption{Disposizione della memoria di un processo quando si esegue la - mappatura in memoria di un file.} - \label{fig:file_mmap_layout} -\end{figure} - L'uso del \textit{memory-mapping} comporta una notevole semplificazione delle operazioni di I/O, in quanto non sarà più necessario utilizzare dei buffer intermedi su cui appoggiare i dati da traferire, poiché questi potranno essere