X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=7c3734c3da82a21225f1522445187fa28be20b07;hp=bb1df38d03c8114448eead5d32e4287929657437;hb=376c897446e3a3c24c3f45df9d6c320f3eef2e09;hpb=1fe3be8e307c2190bf91e531478d39a6d3d51911 diff --git a/fileadv.tex b/fileadv.tex index bb1df38..7c3734c 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1612,7 +1612,7 @@ quest'ultima serve sia in ingresso (quando usata con \func{epoll\_ctl}) ad impostare quali eventi osservare, che in uscita (nei risultati ottenuti con \func{epoll\_wait}) per ricevere le notifiche degli eventi avvenuti. La sua definizione è riportata in fig.~\ref{fig:epoll_event}. -« + Il primo campo, \var{events}, è una maschera binaria in cui ciascun bit corrisponde o ad un tipo di evento, o una modalità di notifica; detto campo deve essere specificato come OR aritmetico delle costanti riportate in @@ -3040,11 +3040,11 @@ rispetto a quella classica vista in cap.~\ref{cha:file_unix_interface}, cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della \textsl{paginazione} \index{paginazione} usato dalla memoria virtuale (vedi sez.~\ref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un -file in una sezione dello spazio di indirizzi del processo. - che lo ha allocato +file in una sezione dello spazio di indirizzi del processo che lo ha allocato. + \begin{figure}[htb] \centering - \includegraphics[width=12cm]{img/mmap_layout} + \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} @@ -3229,7 +3229,7 @@ tab.~\ref{tab:file_mmap_flag}. ignorati.\footnotemark\\ \const{MAP\_ANON} & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\ \const{MAP\_FILE} & Valore di compatibilità, ignorato.\\ - \const{MAP\_32BIT} & Esegue la mappatura sui primi 2GiB dello spazio + \const{MAP\_32BIT} & Esegue la mappatura sui primi 2Gb dello spazio degli indirizzi, viene supportato solo sulle piattaforme \texttt{x86-64} per compatibilità con le applicazioni a 32 bit. Viene ignorato se si è @@ -3248,6 +3248,17 @@ tab.~\ref{tab:file_mmap_flag}. \label{tab:file_mmap_flag} \end{table} +\footnotetext[68]{dato che tutti faranno riferimento alle stesse pagine di + memoria.} + +\footnotetext[69]{l'uso di questo flag con \const{MAP\_SHARED} è stato + implementato in Linux a partire dai kernel della serie 2.4.x; esso consente + di creare segmenti di memoria condivisa e torneremo sul suo utilizzo in + sez.~\ref{sec:ipc_mmap_anonymous}.} + +\footnotetext{questo flag ed il precedente \const{MAP\_POPULATE} sono stati + introdotti nel kernel 2.5.46 insieme alla mappatura non lineare di cui + parleremo più avanti.} Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere piuttosto complessi, essi si possono comprendere solo tenendo presente che @@ -3262,32 +3273,19 @@ tipo di accesso. regione di cui si è richiesta la mappatura. A prima vista infatti si potrebbe ritenere che anch'essi debbano generare un segnale di violazione di accesso; questo però non tiene conto del fatto che, essendo basata sul meccanismo della -paginazione \index{paginazione}, la mappatura in memoria non può che essere +\index{paginazione} paginazione, la mappatura in memoria non può che essere eseguita su un segmento di dimensioni rigorosamente multiple di quelle di una pagina, ed in generale queste potranno non corrispondere alle dimensioni effettive del file o della sezione che si vuole mappare. -\footnotetext[68]{dato che tutti faranno riferimento alle stesse pagine di - memoria.} - -\footnotetext[69]{l'uso di questo flag con \const{MAP\_SHARED} è stato - implementato in Linux a partire dai kernel della serie 2.4.x; esso consente - di creare segmenti di memoria condivisa e torneremo sul suo utilizzo in - sez.~\ref{sec:ipc_mmap_anonymous}.} - -\footnotetext{questo flag ed il precedente \const{MAP\_POPULATE} sono stati - introdotti nel kernel 2.5.46 insieme alla mappatura non lineare di cui - parleremo più avanti.} - \begin{figure}[!htb] \centering - \includegraphics[height=6cm]{img/mmap_boundary} + \includegraphics[height=6.5cm]{img/mmap_boundary} \caption{Schema della mappatura in memoria di una sezione di file di dimensioni non corrispondenti al bordo di una pagina.} \label{fig:file_mmap_boundary} \end{figure} - Il caso più comune è quello illustrato in fig.~\ref{fig:file_mmap_boundary}, in cui la sezione di file non rientra nei confini di una pagina: in tal caso verrà il file sarà mappato su un segmento di memoria che si estende fino al @@ -3653,9 +3651,43 @@ mappatura che gi essere utile per il linker dinamico, in particolare quando viene effettuato il \textit{prelink} delle applicazioni.} -\itindend{memory~mapping} +Per i vantaggi illustrati all'inizio del paragrafo l'interfaccia del +\textit{memory mapped I/O} viene usata da una grande varietà di programmi, +spesso con esigenze molto diverse fra di loro riguardo le modalità con cui +verranno eseguiti gli accessi ad un file; è ad esempio molto comune per i +database effettuare accessi ai dati in maniera pressoché casuale, mentre un +riproduttore audio o video eseguirà per lo più letture sequenziali. + +Per migliorare le prestazioni a seconda di queste modalità di accesso è +disponibile una apposita funzione, \funcd{madvise},\footnote{tratteremo in + sez.~\ref{sec:file_fadvise} le funzioni che consentono di ottimizzare + l'accesso ai file con l'interfaccia classica.} che consente di fornire al +kernel delle indicazioni su dette modalità, così che possano essere adottate +le opportune strategie di ottimizzazione. Il suo prototipo è: +\begin{functions} + \headdecl{sys/mman.h} + + \funcdecl{int madvise(void *start, size\_t length, int advise)} + + Fornisci indicazioni sull'uso di un \textit{memory mapping}. + + \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EAGAIN}] . + \item[\errcode{EBADF}] . + \item[\errcode{EINVAL}] . + \item[\errcode{EIO}] . + \item[\errcode{ENOMEM}] . + \end{errlist} + } +\end{functions} + + % TODO documentare \func{madvise} +\itindend{memory~mapping} + \subsection{I/O vettorizzato: \func{readv} e \func{writev}} \label{sec:file_multiple_io}