Altre info su mmap
[gapil.git] / fileadv.tex
index 40dc7a50fe7f6b7dba6cdea07f6ed4699de324ea..a0081db8104795adcfdc0829904498a81ecfee75 100644 (file)
@@ -78,7 +78,7 @@ con la funzione \func{select}, il cui prototipo 
   
   \bodydesc{La funzione in caso di successo restituisce il numero di file
     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
   
   \bodydesc{La funzione in caso di successo restituisce il numero di file
     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
-    caso \var{errno} viene settata ai valori:
+    caso \var{errno} viene impostata ai valori:
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
@@ -141,9 +141,9 @@ pi
 
 Infine l'argomento \param{timeout}, specifica un tempo massimo di
 attesa\footnote{il tempo è valutato come \textit{elapsed time}.} prima che la
 
 Infine l'argomento \param{timeout}, specifica un tempo massimo di
 attesa\footnote{il tempo è valutato come \textit{elapsed time}.} prima che la
-funzione ritorni; se settato a \macro{NULL} la funzione attende
+funzione ritorni; se impostato a \macro{NULL} la funzione attende
 indefinitamente. Si può specificare anche un tempo nullo (cioè una \var{struct
 indefinitamente. Si può specificare anche un tempo nullo (cioè una \var{struct
-  timeval} con i campi settati a zero), qualora si voglia semplicemente
+  timeval} con i campi impostati a zero), qualora si voglia semplicemente
 controllare lo stato corrente dei file descriptor.
 
 La funzione restituisce il totale dei file descriptor pronti nei tre insiemi,
 controllare lo stato corrente dei file descriptor.
 
 La funzione restituisce il totale dei file descriptor pronti nei tre insiemi,
@@ -153,16 +153,17 @@ operazioni ad esso relative, in modo da poterlo controllare con la macro
 \macro{FD\_ISSET}. In caso di errore la funzione restituisce -1 e gli insiemi
 non vengono toccati.
 
 \macro{FD\_ISSET}. In caso di errore la funzione restituisce -1 e gli insiemi
 non vengono toccati.
 
-In Linux \func{select} modifica anche il valore di \param{timeout}, settandolo
-al tempo restante; questo è utile quando la funzione viene interrotta da un
-segnale, in tal caso infatti si ha un errore di \macro{EINTR}, ed occorre
-rilanciare la funzione; in questo modo non è necessario ricalcolare tutte le
-volte il tempo rimanente.\footnote{questo può causare problemi di portabilità
-  sia quando si trasporta codice scritto su Linux che legge questo valore, sia
-  quando si usano programmi scritti per altri sistemi che non dispongono di
-  questa caratteristica e ricalcolano \param{timeout} tutte le volte. In
-  genere la caratteristica è disponibile nei sistemi che derivano da System V
-  e non disponibile per quelli che derivano da BSD.}
+In Linux \func{select} modifica anche il valore di \param{timeout},
+impostandolo al tempo restante; questo è utile quando la funzione viene
+interrotta da un segnale, in tal caso infatti si ha un errore di
+\macro{EINTR}, ed occorre rilanciare la funzione; in questo modo non è
+necessario ricalcolare tutte le volte il tempo rimanente.\footnote{questo può
+  causare problemi di portabilità sia quando si trasporta codice scritto su
+  Linux che legge questo valore, sia quando si usano programmi scritti per
+  altri sistemi che non dispongono di questa caratteristica e ricalcolano
+  \param{timeout} tutte le volte. In genere la caratteristica è disponibile
+  nei sistemi che derivano da System V e non disponibile per quelli che
+  derivano da BSD.}
 
 Come accennato l'interfaccia di \func{select} è una estensione di BSD; anche
 System V ha introdotto una sua interfaccia per gestire l'\textit{I/O
 
 Come accennato l'interfaccia di \func{select} è una estensione di BSD; anche
 System V ha introdotto una sua interfaccia per gestire l'\textit{I/O
@@ -177,7 +178,7 @@ specificati da \param{ufds}.
   
 \bodydesc{La funzione restituisce il numero di file descriptor con attività in
   caso di successo, o 0 se c'è stato un timeout; in caso di errore viene
   
 \bodydesc{La funzione restituisce il numero di file descriptor con attività in
   caso di successo, o 0 se c'è stato un timeout; in caso di errore viene
-  restituito  -1 ed \var{errno} viene settata ai valori:
+  restituito  -1 ed \var{errno} viene impostata ai valori:
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
@@ -248,10 +249,10 @@ vengono utilizzati solo per \var{revents} come valori in uscita).
 \end{table}
 
 La funzione ritorna, restituendo il numero di file per i quali si è verificata
 \end{table}
 
 La funzione ritorna, restituendo il numero di file per i quali si è verificata
-una delle condizioni di attesa richieste o un errore. Lo stato dei file
+una delle condizioni di attesa richieste od un errore. Lo stato dei file
 all'uscita della funzione viene restituito nel campo \var{revents} della
 all'uscita della funzione viene restituito nel campo \var{revents} della
-relativa struttura \type{pollfd}, che viene settato alla maschera binaria dei
-valori riportati in \tabref{tab:file_pollfd_flags}, ed oltre alle tre
+relativa struttura \type{pollfd}, che viene impostato alla maschera binaria
+dei valori riportati in \tabref{tab:file_pollfd_flags}, ed oltre alle tre
 condizioni specificate tramite \var{events} può riportare anche l'occorrere di
 una condizione di errore.
 
 condizioni specificate tramite \var{events} può riportare anche l'occorrere di
 una condizione di errore.
 
@@ -277,7 +278,7 @@ sostituisce i precedenti, ed aggiunge a \func{select} una nuova funzione
   
   \bodydesc{La funzione in caso di successo restituisce il numero di file
     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
   
   \bodydesc{La funzione in caso di successo restituisce il numero di file
     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
-    caso \var{errno} viene settata ai valori:
+    caso \var{errno} viene impostata ai valori:
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
   degli insiemi.
@@ -299,7 +300,7 @@ L'uso di \param{sigmask} 
 race condition\footnote{in Linux però, non esistendo una system call apposita,
   la funzione è implementata nelle \acr{glibc} usando \func{select}, e la
   possibilità di una race condition resta.} quando si deve eseguire un test su
 race condition\footnote{in Linux però, non esistendo una system call apposita,
   la funzione è implementata nelle \acr{glibc} usando \func{select}, e la
   possibilità di una race condition resta.} quando si deve eseguire un test su
-una variabile settata da un manipolatore sulla base dell'occorrenza di un
+una variabile assegnata da un manipolatore sulla base dell'occorrenza di un
 segnale per decidere se lanciare \func{select}. Fra il test e l'esecuzione è
 presente una finestra in cui potrebbe arrivare il segnale che non sarebbe
 rilevato; la race condition diventa superabile disabilitando il segnale prima
 segnale per decidere se lanciare \func{select}. Fra il test e l'esecuzione è
 presente una finestra in cui potrebbe arrivare il segnale che non sarebbe
 rilevato; la race condition diventa superabile disabilitando il segnale prima
@@ -322,9 +323,9 @@ Abbiamo accennato in \secref{sec:file_open} che 
 del flag \macro{O\_ASYNC},\footnote{l'uso del flag di \macro{O\_ASYNC} e dei
   comandi \macro{F\_SETOWN} e \macro{F\_GETOWN} per \func{fcntl} è specifico
   di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile
 del flag \macro{O\_ASYNC},\footnote{l'uso del flag di \macro{O\_ASYNC} e dei
   comandi \macro{F\_SETOWN} e \macro{F\_GETOWN} per \func{fcntl} è specifico
   di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile
-attivare in un secondo tempo questa modalità settando questo flag attraverso
+attivare in un secondo tempo questa modalità impostando questo flag attraverso
 l'uso di \func{fcntl} con il comando \macro{F\_SETFL} (vedi
 l'uso di \func{fcntl} con il comando \macro{F\_SETFL} (vedi
-\secref{sec:file_fcntl}). 
+\secref{sec:file_fcntl}).
 
 In realtà in questo caso non si tratta di I/O asincrono vero e proprio, quanto
 di un meccanismo asincrono di notifica delle variazione dello stato del file
 
 In realtà in questo caso non si tratta di I/O asincrono vero e proprio, quanto
 di un meccanismo asincrono di notifica delle variazione dello stato del file
@@ -351,9 +352,9 @@ attraverso la struttura \type{siginfo\_t}, utilizzando la forma estesa
 \secref{sec:sig_sigaction}).
 
 Per far questo però occorre utilizzare le funzionalità dei segnali real-time
 \secref{sec:sig_sigaction}).
 
 Per far questo però occorre utilizzare le funzionalità dei segnali real-time
-(vedi \secref{sec:sig_real_time}) settando esplicitamente con il comando
+(vedi \secref{sec:sig_real_time}) imopstando esplicitamente con il comando
 \macro{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare in caso di
 \macro{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare in caso di
-I/O asincrono (il segnale di default è \macro{SIGIO}). In questo caso il
+I/O asincrono (il segnale predefinito è \macro{SIGIO}). In questo caso il
 manipolatore tutte le volte che riceverà \macro{SI\_SIGIO} come valore del
 campo \var{si\_code}\footnote{il valore resta \macro{SI\_SIGIO} qualunque sia
   il segnale che si è associato all'I/O asincrono, ed indica appunto che il
 manipolatore tutte le volte che riceverà \macro{SI\_SIGIO} come valore del
 campo \var{si\_code}\footnote{il valore resta \macro{SI\_SIGIO} qualunque sia
   il segnale che si è associato all'I/O asincrono, ed indica appunto che il
@@ -436,13 +437,13 @@ sul file da cui i dati saranno letti o scritti.  Nel campo \var{aio\_buf} deve
 essere specificato l'indirizzo del buffer usato per l'I/O, ed in
 \var{aio\_nbytes} la lunghezza del blocco di dati da trasferire.
 
 essere specificato l'indirizzo del buffer usato per l'I/O, ed in
 \var{aio\_nbytes} la lunghezza del blocco di dati da trasferire.
 
-Il campo \var{aio\_reqprio} permette di settare la priorità delle operazioni
+Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni
 di I/O.\footnote{in generale perché ciò sia possibile occorre che la
   piattaforma supporti questa caratteristica, questo viene indicato definendo
   le macro \macro{\_POSIX\_PRIORITIZED\_IO}, e
 di I/O.\footnote{in generale perché ciò sia possibile occorre che la
   piattaforma supporti questa caratteristica, questo viene indicato definendo
   le macro \macro{\_POSIX\_PRIORITIZED\_IO}, e
-  \macro{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene settata a partire
-da quella del processo chiamante (vedi \secref{sec:proc_priority}), cui viene
-sottratto il valore di questo campo.
+  \macro{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene impostata a
+partire da quella del processo chiamante (vedi \secref{sec:proc_priority}),
+cui viene sottratto il valore di questo campo.
 
 Il campo \var{aio\_lio\_opcode} è usato soltanto dalla funzione
 \func{lio\_listio}, che, come vedremo più avanti, permette di eseguire con una
 
 Il campo \var{aio\_lio\_opcode} è usato soltanto dalla funzione
 \func{lio\_listio}, che, come vedremo più avanti, permette di eseguire con una
@@ -502,7 +503,7 @@ appena descritta; i rispettivi prototipi sono:
   \param{aiocbp}.
   
   \bodydesc{Le funzioni restituiscono 0 in caso di successo, e -1 in caso di
   \param{aiocbp}.
   
   \bodydesc{Le funzioni restituiscono 0 in caso di successo, e -1 in caso di
-    errore, nel qual caso \var{errno} viene settata ai valori:
+    errore, nel qual caso \var{errno} viene impostata ai valori:
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
   \item[\macro{ENOSYS}] La funzione non è implementata.
   \begin{errlist}
   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
   \item[\macro{ENOSYS}] La funzione non è implementata.
@@ -545,25 +546,16 @@ errore; il suo prototipo 
   \param{aiocbp}.
   
   \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con
   \param{aiocbp}.
   
   \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con
-    successo, altrimenti restituisce il codice di errore.}
-% }, che viene salvato  
-%     anche in \var{errno}, i valori possibili sono:
-%   \begin{errlist}
-%   \item[\macro{ENOSYS}] La funzione non è implementata.
-%   \item[\macro{EINPROGRESS}] L'operazione è ancora in corso.
-%   \item[\macro{EINVAL}] Si è specificato un valore non valido per i campi
-%     \var{aio\_offset} o \var{aio\_reqprio} di \param{aiocbp}.
-%   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
-%   \end{errlist}
-%   più tutti quelli possibili per le sottostanti operazioni, .}
+    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
 \macro{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è
 conclusa con successo, altrimenti restituisce il codice dell'errore
 \end{prototype}
 
 Se l'operazione non si è ancora completata viene restituito l'errore di
 \macro{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è
 conclusa con successo, altrimenti restituisce il codice dell'errore
-verificatosi, ed esegue il corrispondente settaggio di \var{errno}. Il codice
-può essere sia \macro{EINVAL} ed \macro{EBADF}, dovuti ad un valore errato per
-\param{aiocbp}, che uno degli errori possibili durante l'esecuzione
+verificatosi, ed esegue la corrispondente impostazione di \var{errno}. Il
+codice può essere sia \macro{EINVAL} ed \macro{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 system call \func{read}, \func{write} e
 \func{fsync}.
 dell'operazione di I/O richiesta, nel qual caso saranno restituiti, a seconda
 del caso, i codici di errore delle system call \func{read}, \func{write} e
 \func{fsync}.
@@ -639,7 +631,7 @@ da \param{aiocbp}.
   
 \bodydesc{La funzione restituisce il risultato dell'operazione con un codice
   di positivo, e -1 in caso di errore, che avviene qualora si sia specificato
   
 \bodydesc{La funzione restituisce il risultato dell'operazione con un codice
   di positivo, e -1 in caso di errore, che avviene qualora si sia specificato
-  un valore non valido di \param{fildes}, setta \var{errno} al valore
+  un valore non valido di \param{fildes}, imposta \var{errno} al valore
   \macro{EBADF}.}
 \end{prototype}
 
   \macro{EBADF}.}
 \end{prototype}
 
@@ -683,7 +675,7 @@ specifica operazione; il suo prototipo 
   
   \bodydesc{La funzione restituisce 0 se una (o più) operazioni sono state
     completate, e -1 in caso di errore nel qual caso \var{errno} viene
   
   \bodydesc{La funzione restituisce 0 se una (o più) operazioni sono state
     completate, e -1 in caso di errore nel qual caso \var{errno} viene
-    settata ai valori:
+    impostata ai valori:
     \begin{errlist}
     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
       \param{timeout}.
     \begin{errlist}
     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
       \param{timeout}.
@@ -714,7 +706,7 @@ lettura o scrittura; il suo prototipo 
   secondo la modalità \param{mode}.
   
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
   secondo la modalità \param{mode}.
   
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
-    errore, nel qual caso \var{errno} viene settata ai valori:
+    errore, nel qual caso \var{errno} viene impostata ai valori:
     \begin{errlist}
     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
       \param{timeout}.
     \begin{errlist}
     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
       \param{timeout}.
@@ -744,7 +736,7 @@ funzione, se viene specificato il valore \macro{LIO\_WAIT} la funzione si
 blocca fino al completamento di tutte le operazioni richieste; se invece si
 specifica \macro{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver
 messo in coda tutte le richieste. In questo caso il chiamante può richiedere
 blocca fino al completamento di tutte le operazioni richieste; se invece si
 specifica \macro{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, settando l'argomento
+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 \type{aiocb}.
 
 \param{sig} in maniera analoga a come si fa per il campo \var{aio\_sigevent}
 di \type{aiocb}.
 
@@ -764,11 +756,11 @@ operazioni.
 Per questo motivo BSD 4.2\footnote{Le due funzioni sono riprese da BSD4.4 ed
   integrate anche dallo standard Unix 98; fino alle libc5 Linux usava
   \type{size\_t} come tipo dell'argomento \param{count}, una scelta logica,
 Per questo motivo BSD 4.2\footnote{Le due funzioni sono riprese da BSD4.4 ed
   integrate anche dallo standard Unix 98; fino alle libc5 Linux usava
   \type{size\_t} come tipo dell'argomento \param{count}, una scelta logica,
-  che è stata dismessa per restare aderenti allo standard.} ha introdotto due
-nuove system call, \func{readv} e \func{writev}, che permettono di effettuare
-con una sola chiamata una lettura o una scrittura su una serie di buffer
-(quello che viene chiamato \textsl{I/O vettorizzato}. I relativi prototipi
-sono:
+  che però è stata dismessa per restare aderenti allo standard.} ha introdotto
+due nuove system call, \func{readv} e \func{writev}, che permettono di
+effettuare con una sola chiamata una lettura o una scrittura su una serie di
+buffer (quello che viene chiamato \textsl{I/O vettorizzato}. I relativi
+prototipi sono:
 \begin{functions}
   \headdecl{sys/uio.h}
   
 \begin{functions}
   \headdecl{sys/uio.h}
   
@@ -782,7 +774,7 @@ sono:
   
   \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} viene
   
   \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} viene
-    settata ai valori:
+    impostata ai valori:
   \begin{errlist}
   \item[\macro{EBADF}] si è specificato un file descriptor sbagliato.
   \item[\macro{EINVAL}] si è specificato un valore non valido per uno degli
   \begin{errlist}
   \item[\macro{EBADF}] si è specificato un file descriptor sbagliato.
   \item[\macro{EINVAL}] si è specificato un valore non valido per uno degli
@@ -820,10 +812,12 @@ struct iovec {
   \label{fig:file_iovec}
 \end{figure}
 
   \label{fig:file_iovec}
 \end{figure}
 
-I buffer da utilizzare sono specificati attraverso l'argomento \var{vector} che
-è un vettore di tale strutture, la cui lunghezza è specificata da \param{count}.
-Essi verranno letti (o scritti) nell'ordine in cui li si sono specificati.
-
+I buffer da utilizzare sono indicati attraverso l'argomento \param{vector} che
+è un vettore di strutture \var{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 vattore \var{vector}.
 
 
 \subsection{File mappati in memoria}
 
 
 \subsection{File mappati in memoria}
@@ -831,23 +825,36 @@ Essi verranno letti (o scritti) nell'ordine in cui li si sono specificati.
 
 Una modalità alternativa di I/O, che usa una interfaccia completamente diversa
 rispetto a quella classica vista in \capref{cha:file_unix_interface}, è il
 
 Una modalità alternativa di I/O, che usa una interfaccia completamente diversa
 rispetto a quella classica vista in \capref{cha:file_unix_interface}, è il
-cosiddetto \textit{memory-mapped I/O}, che attraverso il meccanismo della
+cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della
 \textsl{paginazione}\index{paginazione} usato dalla memoria virtuale (vedi
 \textsl{paginazione}\index{paginazione} usato dalla memoria virtuale (vedi
-\secref{sec:proc_mem_gen}) permette di \textsl{mappare} il contenuto di un
-file in una sezione dello spazio di indirizzi del processo.
+\secref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un
+file in una sezione dello spazio di indirizzi del processo. Il meccanismo è
+illustrato in \figref{fig:file_mmap_layout}; una sezione del file viene
+riportata direttamente nello spazio degli indirizzi del programma. Tutte le
+operazioni su questa zona verranno riportate indietro sul file dal meccanismo
+della memoria virtuale che trasferirà il contenuto di quel segmento sul file
+invece che nella swap.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=10cm]{img/mmap_layout}
+  \caption{Disposizione della memoria di un processo quando si esegue la
+  mappatuara in memoria di un file.}
+  \label{fig:file_mmap_layout}
+\end{figure}
 
 Tutto questo 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, ma questi potranno essere acceduti
 
 Tutto questo 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, ma questi potranno essere acceduti
-direttamente dalla sezione di memoria; inoltre questa interfaccia
-è più efficiente delle usuali funzioni di I/O, in quanto permette di caricare
-in memoria solo le parti del file che sono effettivamente usate ad un dato
+direttamente nella sezione di memoria mappata; inoltre questa interfaccia è
+più efficiente delle usuali funzioni di I/O, in quanto permette di caricare in
+memoria solo le parti del file che sono effettivamente usate ad un dato
 istante.
 
 Infatti, dato che l'accesso è fatto direttamente attraverso la memoria
 virtuale, la sezione di memoria mappata su cui si opera sarà a sua volta letta
 o scritta sul file una pagina alla volta e solo per le parti effettivamente
 istante.
 
 Infatti, dato che l'accesso è fatto direttamente attraverso la memoria
 virtuale, la sezione di memoria mappata su cui si opera sarà a sua volta letta
 o scritta sul file una pagina alla volta e solo per le parti effettivamente
-usate, il tutto in maniera completamente trasparente al processo; l'acceso
+usate, il tutto in maniera completamente trasparente al processo; l'accesso
 alle pagine non ancora caricate avverrà allo stesso modo con cui vengono
 caricate in memoria le pagine che sono state salvate sullo swap.
 
 alle pagine non ancora caricate avverrà allo stesso modo con cui vengono
 caricate in memoria le pagine che sono state salvate sullo swap.
 
@@ -857,36 +864,36 @@ vengono scritte sulla swap; questo consente di accedere ai file su dimensioni
 il cui solo limite è quello dello spazio di indirizzi disponibile, e non della
 memoria su cui possono esserne lette delle porzioni.
 
 il cui solo limite è quello dello spazio di indirizzi disponibile, e non della
 memoria su cui possono esserne lette delle porzioni.
 
-L'interfaccia prevede varie funzioni per la gestione del \textit{memory
-  mapping}, la prima di queste è \func{mmap}, che esegue la mappatura in
-memoria un file; il suo prototipo è:
+L'interfaccia prevede varie funzioni per la gestione del \textit{memory mapped
+  I/O}, la prima di queste è \func{mmap}, che serve ad eseguire la mappatura
+in memoria di un file; il suo prototipo è:
 \begin{functions}
   
   \headdecl{unistd.h}
   \headdecl{sys/mman.h} 
 
 \begin{functions}
   
   \headdecl{unistd.h}
   \headdecl{sys/mman.h} 
 
-  \funcdecl{void * mmap(void *start, size\_t length, int prot, int flags, int
+  \funcdecl{void * mmap(void * start, size\_t length, int prot, int flags, int
     fd, off\_t offset)}
   
   Esegue la mappatura in memoria del file \param{fd}.
   
   \bodydesc{La funzione restituisce il puntatore alla zona di memoria mappata
     in caso di successo, e \macro{MAP\_FAILED} (-1) in caso di errore, nel
     fd, off\_t offset)}
   
   Esegue la mappatura in memoria del file \param{fd}.
   
   \bodydesc{La funzione restituisce il puntatore alla zona di memoria mappata
     in caso di successo, e \macro{MAP\_FAILED} (-1) in caso di errore, nel
-    qual caso \var{errno} viene settata ai valori:
+    qual caso \var{errno} viene impostata ai valori:
     \begin{errlist}
     \item[\macro{EBADF}] Il file descriptor non è valido, e non si è usato
       \macro{MAP\_ANONYMOUS}.
     \item[\macro{EACCES}] Il file descriptor non si riferisce ad un file
     \begin{errlist}
     \item[\macro{EBADF}] Il file descriptor non è valido, e non si è usato
       \macro{MAP\_ANONYMOUS}.
     \item[\macro{EACCES}] Il file descriptor non si riferisce ad un file
-      normale, o si è richiesto \macro{MAP\_PRIVATE} ma \param{fd} non è
-      aperto in lettura, o si è richiesto \macro{MAP\_SHARED} e settato
+      regolare, o si è richiesto \macro{MAP\_PRIVATE} ma \param{fd} non è
+      aperto in lettura, o si è richiesto \macro{MAP\_SHARED} e impostato
       \macro{PROT\_WRITE} ed \param{fd} non è aperto in lettura/scrittura, o
       \macro{PROT\_WRITE} ed \param{fd} non è aperto in lettura/scrittura, o
-      si è settato \macro{PROT\_WRITE} ed \param{fd} è in
+      si è impostato \macro{PROT\_WRITE} ed \param{fd} è in
       \textit{append-only}.
     \item[\macro{EINVAL}] I valori di \param{start}, \param{length} o
       \param{offset} non sono validi (o troppo grandi o non allineati sulla
       dimensione delle pagine).
       \textit{append-only}.
     \item[\macro{EINVAL}] I valori di \param{start}, \param{length} o
       \param{offset} non sono validi (o troppo grandi o non allineati sulla
       dimensione delle pagine).
-    \item[\macro{ETXTBSY}] Si è settato \macro{MAP\_DENYWRITE} ma \param{fd} è
-      aperto in scrittura.
+    \item[\macro{ETXTBSY}] Si è impostato \macro{MAP\_DENYWRITE} ma \param{fd}
+      è aperto in scrittura.
     \item[\macro{EAGAIN}] Il file è bloccato, o si è bloccata troppa memoria.
     \item[\macro{ENOMEM}] Non c'è memoria o si è superato il limite sul numero
       di mappature possibili.
     \item[\macro{EAGAIN}] Il file è bloccato, o si è bloccata troppa memoria.
     \item[\macro{ENOMEM}] Non c'è memoria o si è superato il limite sul numero
       di mappature possibili.
@@ -948,7 +955,7 @@ come maschera binaria ottenuta dall'OR di uno o pi
     \hline
     \macro{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
                              da \param{start}, se questo non può essere usato
     \hline
     \macro{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
                              da \param{start}, se questo non può essere usato
-                             \func{mmap} fallisce. Se si setta questo flag il
+                             \func{mmap} fallisce. Se si imposta questo flag il
                              valore di \param{start} deve essere allineato
                              alle dimensioni di una pagina. \\
     \macro{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
                              valore di \param{start} deve essere allineato
                              alle dimensioni di una pagina. \\
     \macro{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
@@ -975,12 +982,12 @@ come maschera binaria ottenuta dall'OR di uno o pi
     \macro{MAP\_EXECUTABLE}& Ignorato. \\
     \macro{MAP\_NORESERVE} & Si usa con \macro{MAP\_PRIVATE}. Non riserva
                              delle pagine di swap ad uso del meccanismo di
     \macro{MAP\_EXECUTABLE}& Ignorato. \\
     \macro{MAP\_NORESERVE} & Si usa con \macro{MAP\_PRIVATE}. Non riserva
                              delle pagine di swap ad uso del meccanismo di
-                             \textit{copy on  write} per mantenere le modifiche 
-                             fatte alla regione mappata, in
+                             \textit{copy on write} per mantenere le
+                             modifiche fatte alla regione mappata, in
                              questo caso dopo una scrittura, se non c'è più
                              memoria disponibile, si ha l'emissione di
                              un \macro{SIGSEGV}. \\
                              questo caso dopo una scrittura, se non c'è più
                              memoria disponibile, si ha l'emissione di
                              un \macro{SIGSEGV}. \\
-    \macro{MAP\_LOCKED}    & Se settato impedisce lo swapping delle pagine
+    \macro{MAP\_LOCKED}    & Se impostato impedisce lo swapping delle pagine
                              mappate. \\
     \macro{MAP\_GROWSDOWN} & Usato per gli stack. Indica 
                              che la mappatura deve essere effettuata con gli
                              mappate. \\
     \macro{MAP\_GROWSDOWN} & Usato per gli stack. Indica 
                              che la mappatura deve essere effettuata con gli
@@ -1001,12 +1008,59 @@ come maschera binaria ottenuta dall'OR di uno o pi
 \footnotetext{L'uso di questo flag con \macro{MAP\_SHARED} è
   stato implementato in Linux a partire dai kernel della serie 2.4.x.}
 
 \footnotetext{L'uso di questo flag con \macro{MAP\_SHARED} è
   stato implementato in Linux a partire dai kernel della serie 2.4.x.}
 
-Un file viene sempre mappato su multipli delle dimensioni di una pagina,
-qualora esso sia più corto la parte restante è riempita con zeri; eventuali
-scritture in quella zona di memoria non vengono riportate sul file. Se le
-dimensioni del file cambiano (esso viene esteso o troncato), non è specificato
-quale effetto viene a aversi sulle pagine di memoria che corrispondono alle
-regioni aggiunte o tolte. 
+Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere
+piuttosto complessi, essi si possono comprendere solo tenendo presente che
+tutto quanto è comunque basato sul basato sul meccanismo della memoria
+virtuale. Questo comporta allora una serie di conseguenze. La più ovvia è che
+se si cerca di scrivere su una zona mappata in sola lettura si avrà
+l'emissione di un segnale di \macro{SIGSEGV}, dato che i permessi sul segmento
+di memoria relativo non consentono questo tipo di accesso.
+
+È invece assai più complessa la questione relativa agli accessi al di fuori
+della regione di cui si è richiesta la mappatura. In generale infatti si è
+portati a ritenere che anch'essi dovrebbero dar luogo all'emissione di un
+segnale di \macro{SIGSEGV}; questo però non tiene conto del fatto che essendo
+basata sul meccanismo della paginazione, una mappatura non può che essere
+eseguita su un segmento di memoria di dimensioni uguali ad un multiplo di
+quelle di una pagina.  In generale dette dimensioni potranno non corrispondere
+alle dimensioni effettive del file o della sezione che si vuole mappare. Il
+caso più comune che si presenta è quello illustrato in
+\figref{fig:file_mmap_boundary}, in cui la sezione di file non rientra nei
+confini di una pagina: in tal caso verrà mappato su un segmento di memoria che
+si estende fino al bordo della pagina successiva.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=10cm]{img/mmap_boundary}
+  \caption{Schema della mappatura in memoria di una sezione di file di
+    dimensioni non corripondenti al bordo di una pagina.}
+  \label{fig:file_mmap_boundary}
+\end{figure}
+
+Si ha così una situazione in cui sarà possibile accedere, senza ottenere un
+\macro{SIGSEGV}, a quella zona di memoria che eccede le dimensioni specificate
+da \param{lenght}, dato che essa è presente nello spazio di indirizzi del
+processo, anche se non è mappata sul file. In questo caso quello che succede è
+che gli accessi in lettura restituiranno dei valori nulli, mentre gli accessi
+in scrittura non avranno alcun effetto e non saranno scritti sul file.
+
+Un caso più complesso è quello illustrato in \figref{fig:file_mmap_exceed},
+che avviene quando le dimensioni del file sono più corte di quelle su cui si
+vuole effettuare la mappatura, oppure quando il file è stato troncato da un
+altro processo ad una dimensione inferiore.
+
+\begin{figure}[htb]
+  \centering
+  \includegraphics[width=10cm]{img/mmap_exceed}
+  \caption{Schema della mappatura in memoria di file di dimensioni inferiori
+    alla lunghezza richiesta.}
+  \label{fig:file_mmap_exceed}
+\end{figure}
+
+In tal caso per la parte del file esistente vale esattamente quanto detto in
+precedenza, mentre per la parte di memoria che eccede il bordo della pagina,
+ma inferiore alle dimensioni richiete con \param{length}, si avrà il segnale
+\macro{SIGBUS}.
 
 Si tenga presente che non tutti i file possono venire mappati in memoria, la
 mappatura infatti introduce una corrispondenza biunivoca fra una sezione di un
 
 Si tenga presente che non tutti i file possono venire mappati in memoria, la
 mappatura infatti introduce una corrispondenza biunivoca fra una sezione di un
@@ -1019,14 +1073,14 @@ ricordi quanto esposto in \secref{sec:file_vfs_work}), ma esistono anche casi
 (un esempio è l'interfaccia ponte PCI-VME del chip Universe) di dispositivi
 che sono utilizzabili praticamente solo con questa interfaccia.
 
 (un esempio è l'interfaccia ponte PCI-VME del chip Universe) di dispositivi
 che sono utilizzabili praticamente solo con questa interfaccia.
 
-Passando attraverso una \func{fork} i file mappati in memoria vengono
-ereditati in maniera trasparente dal processo figlio, mantenendo gli stessi
-attributi avuti nel padre; così se si è usato \macro{MAP\_SHARED} padre e
-figlio accederanno allo stesso file in maniera condivisa, mentre se si è usato
-\macro{MAP\_PRIVATE} ciascuno di essi manterrà una sua versione privata
-indipendente. Non c'è invece nessun passaggio attraverso una \func{exec}, dato
-che quest'ultima sostituisce tutto lo spazio degli indirizzi di un processo
-con quello di un nuovo programma.
+Dato che passando attraverso una \func{fork} lo spazio di indirizzi viene
+copiato, i file mappati in memoria verranno ereditati in maniera trasparente
+dal processo figlio, mantenendo gli stessi attributi avuti nel padre; così se
+si è usato \macro{MAP\_SHARED} padre e figlio accederanno allo stesso file in
+maniera condivisa, mentre se si è usato \macro{MAP\_PRIVATE} ciascuno di essi
+manterrà una sua versione privata indipendente. Non c'è invece nessun
+passaggio attraverso una \func{exec}, dato che quest'ultima sostituisce tutto
+lo spazio degli indirizzi di un processo con quello di un nuovo programma.
 
 Quando si effettua la mappatura di un file vengono pure modificati i tempi ad
 esso associati (si ricordi quanto esposto in \secref{sec:file_file_times}). Il
 
 Quando si effettua la mappatura di un file vengono pure modificati i tempi ad
 esso associati (si ricordi quanto esposto in \secref{sec:file_file_times}). Il
@@ -1067,7 +1121,7 @@ contenuto della memoria mappata con il file su disco; il suo prototipo 
   Sincronizza i contenuti di una sezione di un file mappato in memoria.
   
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
   Sincronizza i contenuti di una sezione di un file mappato in memoria.
   
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
-    errore nel qual caso \var{errno} viene settata ai valori:
+    errore nel qual caso \var{errno} viene impostata ai valori:
     \begin{errlist}
     \item[\macro{EINVAL}] O \param{start} non è multiplo di \macro{PAGESIZE},
     o si è specificato un valore non valido per \param{flags}.
     \begin{errlist}
     \item[\macro{EINVAL}] O \param{start} non è multiplo di \macro{PAGESIZE},
     o si è specificato un valore non valido per \param{flags}.
@@ -1123,7 +1177,7 @@ mappatura della memoria usando la funzione \func{munmap}, il suo prototipo 
   Rilascia la mappatura sulla sezione di memoria specificata.
 
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
   Rilascia la mappatura sulla sezione di memoria specificata.
 
   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
-    errore nel qual caso \var{errno} viene settata ai valori:
+    errore nel qual caso \var{errno} viene impostata ai valori:
     \begin{errlist}
     \item[\macro{EINVAL}] L'intervallo specificato non ricade in una zona
       precedentemente mappata.
     \begin{errlist}
     \item[\macro{EINVAL}] L'intervallo specificato non ricade in una zona
       precedentemente mappata.
@@ -1139,8 +1193,8 @@ pagine contenute (anche parzialmente) nell'intervallo indicato, verr
 Indicare un intervallo che non contiene pagine mappate non è un errore.
 
 Alla conclusione del processo, ogni pagina mappata verrà automaticamente
 Indicare un intervallo che non contiene pagine mappate non è un errore.
 
 Alla conclusione del processo, ogni pagina mappata verrà automaticamente
-rilasciata, mentre la chiusura del file descriptor non ha alcun effetto sulla
-mappatura della memoria.
+rilasciata, mentre la chiusura del file descriptor usato per effettuare la
+mappatura in memoria non ha alcun effetto sulla stessa.
 
 
 \section{Il file locking}
 
 
 \section{Il file locking}
@@ -1179,9 +1233,23 @@ esiste una condizione di blocco per l'accesso ai file.
 \subsection{Il \textit{mandatory locking}}
 \label{sec:file_mand_locking}
 
 \subsection{Il \textit{mandatory locking}}
 \label{sec:file_mand_locking}
 
-Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4, 
-
-
+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
+\textit{mandatory locking} infatti è possibile far eseguire il blocco del file
+direttamente al sistema, così che anche qualora non si predisponessero le
+opportune verifiche nei processi, questo verrebbe comunque rispettato.
+
+Per poter utilizzare il \textit{mandatory locking} è stato introdotto un
+utilizzo particolare del bit \acr{suid}. Se si ricorda quanto esposto in
+\secref{sec:file_suid_sgid}), esso viene di norma utlizzato per cambiare
+l'\textit{effective user ID} con cui viene eseguito un programma, ed è
+pertanto sempre associato alla presenza del permesso di esecuzione. Impostando
+questo bit su un file senza permesso di esecuzione in un sistema che supporta
+il \textit{mandatory locking}, fa sì che quest'ultimo venga attivato per il
+file in questione. In questo modo una combinaizone dei permessi
+originariamente non contemplata, in quanto senza significato, diventa
+l'indicazione della presenza o meno del \textit{mandatory locking}.