X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=fileadv.tex;h=e7b93dcff3d3448739fbf361f88340e119f7d55c;hb=74b559a3958675adf01c9a906cdd485eaf399290;hp=904e81ea18cdbbc17f00762232e937babf2d05fd;hpb=c49e97bdcba8e4da8578d5a048a5764a622aff1e;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index 904e81e..e7b93dc 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -38,12 +38,11 @@ I/O. Abbiamo visto in sez.~\ref{sec:sig_gen_beha}, affrontando la suddivisione fra \textit{fast} e \textit{slow} system call,\index{system~call~lente} che in certi casi le funzioni di I/O possono bloccarsi indefinitamente.\footnote{si - ricordi però che questo può accadere solo per le pipe, i - socket\index{socket} ed alcuni file di - dispositivo\index{file!di~dispositivo}; sui file normali le funzioni di - lettura e scrittura ritornano sempre subito.} Ad esempio le operazioni di -lettura possono bloccarsi quando non ci sono dati disponibili sul descrittore -su cui si sta operando. + ricordi però che questo può accadere solo per le pipe, i socket ed alcuni + file di dispositivo\index{file!di~dispositivo}; sui file normali le funzioni + di lettura e scrittura ritornano sempre subito.} Ad esempio le operazioni +di lettura possono bloccarsi quando non ci sono dati disponibili sul +descrittore su cui si sta operando. Questo comportamento causa uno dei problemi più comuni che ci si trova ad affrontare nelle operazioni di I/O, che si verifica quando si deve operare con @@ -91,8 +90,8 @@ ulteriori dettagli e qualche esempio in sez.~\ref{sec:TCP_sock_multiplexing}. Il primo kernel unix-like ad introdurre una interfaccia per l'\textit{I/O multiplexing} è stato BSD,\footnote{la funzione \func{select} è apparsa in BSD4.2 e standardizzata in BSD4.4, ma è stata portata su tutti i sistemi che - supportano i \textit{socket}\index{socket}, compreso le varianti di System - V.} con la funzione \funcd{select}, il cui prototipo è: + supportano i socket, compreso le varianti di System V.} con la funzione +\funcd{select}, il cui prototipo è: \begin{functions} \headdecl{sys/time.h} \headdecl{sys/types.h} @@ -167,8 +166,8 @@ effettuare una lettura,\footnote{per essere precisi la funzione ritorner tutti i casi in cui la successiva esecuzione di \func{read} risulti non bloccante, quindi anche in caso di \textit{end-of-file}.} il secondo, \param{writefds}, per verificare la possibilità effettuare una scrittura ed il -terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni (come i -messaggi urgenti su un \textit{socket}\index{socket}, vedi +terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni (come i dati +urgenti \itindex{out-of-band} su un socket, vedi sez.~\ref{sec:TCP_urgent_data}). Dato che in genere non si tengono mai sotto controllo fino a @@ -393,7 +392,8 @@ nel campo \var{revents} per notificare delle condizioni di errore. \const{POLLIN} & È possibile la lettura.\\ \const{POLLRDNORM}& Sono disponibili in lettura dati normali.\\ \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari. \\ - \const{POLLPRI} & È possibile la lettura di dati urgenti.\\ + \const{POLLPRI} & È possibile la lettura di \itindex{out-of-band} dati + urgenti.\\ \hline \const{POLLOUT} & È possibile la scrittura immediata.\\ \const{POLLWRNORM}& È possibile la scrittura di dati normali. \\ @@ -418,15 +418,15 @@ compatibilit delle librerie standard del C.} è da questi che derivano i nomi di alcune costanti, in quanto per essi sono definite tre classi di dati: \textsl{normali}, \textit{prioritari} ed \textit{urgenti}. In Linux la -distinzione ha senso solo per i dati \textit{out-of-band} dei socket (vedi -sez.~\ref{sec:TCP_urgent_data}), ma su questo e su come \func{poll} reagisce -alle varie condizioni dei socket torneremo in sez.~\ref{sec:TCP_serv_poll}, -dove vedremo anche un esempio del suo utilizzo. Si tenga conto comunque che le -costanti relative ai diversi tipi di dati (come \const{POLLRDNORM} e -\const{POLLRDBAND}) sono utilizzabili soltanto qualora si sia definita la -macro \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di farlo sempre in - testa al file, definirla soltanto prima di includere \file{sys/poll.h} non è - sufficiente.} +distinzione ha senso solo per i dati urgenti \itindex{out-of-band} dei socket +(vedi sez.~\ref{sec:TCP_urgent_data}), ma su questo e su come \func{poll} +reagisce alle varie condizioni dei socket torneremo in +sez.~\ref{sec:TCP_serv_poll}, dove vedremo anche un esempio del suo utilizzo. +Si tenga conto comunque che le costanti relative ai diversi tipi di dati (come +\const{POLLRDNORM} e \const{POLLRDBAND}) sono utilizzabili soltanto qualora si +sia definita la macro \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di + farlo sempre in testa al file, definirla soltanto prima di includere + \file{sys/poll.h} non è sufficiente.} In caso di successo funzione ritorna restituendo il numero di file (un valore positivo) per i quali si è verificata una delle condizioni di attesa richieste @@ -785,14 +785,14 @@ 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\index{socket} e gli altri -file per i quali le funzioni di I/O sono \index{system~call~lente}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, che prevede un insieme di funzioni dedicate per la -lettura e la scrittura dei file, completamente separate rispetto a quelle -usate normalmente. +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}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, 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 @@ -907,8 +907,8 @@ richiesta, o in caso di errore. Non \errcode{EINVAL} siano rilevati immediatamente al momento della chiamata, potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che -il file non sia stato aperto in \textit{append mode} (vedi -sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate +il file non sia stato aperto in \itindex{append~mode} \textit{append mode} +(vedi sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}. Si tenga inoltre presente che deallocare la memoria indirizzata da @@ -1856,18 +1856,20 @@ mappatura che gi \label{sec:file_locking} \index{file!locking|(} + In sez.~\ref{sec:file_sharing} abbiamo preso in esame le modalità in cui un sistema unix-like gestisce la condivisione dei file da parte di processi diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti -in \textit{append mode}, quando più processi scrivono contemporaneamente sullo -stesso file non è possibile determinare la sequenza in cui essi opereranno. +in \itindex{append~mode} \textit{append mode}, quando più processi scrivono +contemporaneamente sullo stesso file non è possibile determinare la sequenza +in cui essi opereranno. -Questo causa la possibilità di una \textit{race condition} -\itindex{race~condition}; in generale le situazioni più comuni sono due: -l'interazione fra un processo che scrive e altri che leggono, in cui questi -ultimi possono leggere informazioni scritte solo in maniera parziale o -incompleta; o quella in cui diversi processi scrivono, mescolando in maniera -imprevedibile il loro output sul file. +Questo causa la possibilità di una \itindex{race~condition} \textit{race + condition}; in generale le situazioni più comuni sono due: l'interazione fra +un processo che scrive e altri che leggono, in cui questi ultimi possono +leggere informazioni scritte solo in maniera parziale o incompleta; o quella +in cui diversi processi scrivono, mescolando in maniera imprevedibile il loro +output sul file. In tutti questi casi il \textit{file locking} è la tecnica che permette di evitare le \textit{race condition}\itindex{race~condition}, attraverso una @@ -2600,6 +2602,8 @@ affatto equivalente a \func{flock}). \subsection{Il \textit{mandatory locking}} \label{sec:file_mand_locking} +\itindbeg{mandatory~locking|(} + Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4, per introdurre un file locking che, come dice il nome, fosse effettivo indipendentemente dai controlli eseguiti da un processo. Con il @@ -2686,6 +2690,7 @@ soltanto quando si chiama \func{mmap} con l'opzione \const{MAP\_SHARED} (nel qual caso la funzione fallisce con il solito \errcode{EAGAIN}) che comporta la possibilità di modificare il file. \index{file!locking|)} +\itindend{mandatory~locking|(}