From f33b3644807abc20932b00bf13127ddeb1785cc9 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 30 Nov 2009 13:01:23 +0000 Subject: [PATCH] Aggiunte in treno di ieri. --- fileadv.tex | 143 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 106 insertions(+), 37 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 7c3734c..fe93ced 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -192,7 +192,7 @@ bloccher ritornerà subito con un errore di \errcode{EWOULDBLOCK}. Per rilasciare un \textit{file lock} si dovrà invece usare \const{LOCK\_UN}. -Si tenga presente che non esite una modalità per eseguire atomicamente un +Si tenga presente che non esiste una modalità per eseguire atomicamente un cambiamento del tipo di blocco (da \textit{shared lock} a \textit{esclusive lock}), il blocco deve essere prima rilasciato e poi richiesto, ed è sempre possibile che nel frattempo abbia successo un'altra richiesta pendente, @@ -1775,7 +1775,7 @@ anche con il fatto che sono stati restituiti meno dati di quelli richiesti. Come già per \func{select} e \func{poll} anche per l'interfaccia di \textit{epoll} si pone il problema di gestire l'attesa di segnali e di dati -contemponeamente, per far questo di nuovo è necessaria una variante della +contemporaneamente, per far questo di nuovo è necessaria una variante della funzione di attesa che consenta di reimpostare all'uscita una maschera di segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in questo caso la funzione si chiama \funcd{epoll\_pwait}\footnote{introdotta a @@ -3134,7 +3134,6 @@ partire da \param{offset} per \param{lenght} byte, preferibilmente all'indirizzo \param{start}. Il valore di \param{offset} deve essere un multiplo della dimensione di una pagina di memoria. - \begin{table}[htb] \centering \footnotesize @@ -3395,25 +3394,6 @@ relativi tempi di modifica. In questo modo si di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto del file aggiornato. -\begin{table}[htb] - \centering - \footnotesize - \begin{tabular}[c]{|l|l|} - \hline - \textbf{Valore} & \textbf{Significato} \\ - \hline - \hline - \const{MS\_ASYNC} & Richiede la sincronizzazione.\\ - \const{MS\_SYNC} & Attende che la sincronizzazione si eseguita.\\ - \const{MS\_INVALIDATE}& Richiede che le altre mappature dello stesso file - siano invalidate.\\ - \hline - \end{tabular} - \caption{Le costanti che identificano i bit per la maschera binaria - dell'argomento \param{flag} di \func{msync}.} - \label{tab:file_mmap_rsync} -\end{table} - L'argomento \param{flag} è specificato come maschera binaria composta da un OR dei valori riportati in tab.~\ref{tab:file_mmap_rsync}, di questi però \const{MS\_ASYNC} e \const{MS\_SYNC} sono incompatibili; con il primo valore @@ -3667,25 +3647,108 @@ le opportune strategie di ottimizzazione. Il suo prototipo \begin{functions} \headdecl{sys/mman.h} - \funcdecl{int madvise(void *start, size\_t length, int advise)} + \funcdecl{int madvise(void *start, size\_t length, int advice)} - Fornisci indicazioni sull'uso di un \textit{memory mapping}. + Fornisce indicazioni sull'uso previsto 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}] . + \item[\errcode{EBADF}] la mappatura esiste ma non corrisponde ad un file. + \item[\errcode{EINVAL}] \param{start} non è allineato alla dimensione di + una pagina, \param{length} ha un valore negativo, o \param{advice} non è + un valore valido, o si è richiesto il rilascio (con + \const{MADV\_DONTNEED}) di pagine bloccate o condivise. + \item[\errcode{EIO}] la paginazione richiesta eccederebbe i limiti (vedi + sez.~\ref{sec:sys_resource_limit}) sulle pagine residenti in memoria del + processo (solo in caso di \const{MADV\_WILLNEED}). + \item[\errcode{ENOMEM}] gli indirizzi specificati non sono mappati, o, in + caso \const{MADV\_WILLNEED}, non c'è sufficiente memoria per soddisfare + la richiesta. \end{errlist} + ed inoltre \errval{EAGAIN} e \errval{ENOSYS}. } \end{functions} - +La sezione di memoria sulla quale si intendono fornire le indicazioni deve +essere indicata con l'indirizzo iniziale \param{start} e l'estensione +\param{lenght}, il valore di \param{start} deve essere allineato, +mentre \param{length} deve essere un numero positivo.\footnote{la versione di + Linux consente anche un valore nullo per \param{lenght}, inoltre se una + parte dell'intervallo non è mappato in memoria l'indicazione viene comunque + applicata alle restanti parti, anche se la funzione ritorna un errore di + \errval{ENOMEM}.} L'indicazione viene espressa dall'argomento \param{advice} +che deve essere specificato con uno dei valori\footnote{si tenga presente che + gli ultimi tre valori sono specifici di Linux (introdotti a partire dal + kernel 2.6.16) e non previsti dallo standard POSIX.1b.} riportati in +tab.~\ref{tab:madvise_advice_values}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|p{10 cm}|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \const{MADV\_NORMAL} & nessuna indicazione specifica, questo è il valore + di default usato quando non si è chiamato + \func{madvise}.\\ + \const{MADV\_RANDOM} & ci si aspetta un accesso casuale all'area + indicata, pertanto l'applicazione di una lettura + anticipata con il meccanismo del + \itindex{read-ahead} \textit{read-ahead} (vedi + sez.~\ref{sec:file_fadvise}) è di + scarsa utilità.\\ + \const{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file, + quindi da una parte sarà opportuno eseguire una + lettura anticipata, e dall'altra si potranno + scartare immediatamente le pagine una volta che + queste siano state lette.\\ + \const{MADV\_WILLNEED}& ci si aspetta un accesso nell'immediato futuro, + pertanto l'applicazione del \textit{read-ahead} + deve essere incentivata.\\ + \const{MADV\_DONTNEED}& non ci si aspetta nessun accesso nell'immediato + futuro, pertanto le pagine possono essere + liberate dal kernel non appena necessario; l'area + di memoria resterà accessibile, ma un accesso + richiederà che i dati vengano ricaricati dal file + a cui la mappatura fa riferimento.\\ + \hline + \const{MADV\_REMOVE} & libera un intervallo di pagine di memoria ed il + relativo supporto sottostante; è supportato + soltanto sui filesystem in RAM \textit{tmpfs} e + \textit{shmfs}.\footnotemark\\ + \const{MADV\_DONTFORK}& impedisce che l'intervallo specificato venga + ereditato dal processo figlio dopo una + \func{fork}; questo consente di evitare che il + meccanismo del \itindex{copy~on~write} + \textit{copy on write} effettui la rilocazione + delle pagine quando un il padre scrive sull'area + di memoria dopo la \func{fork}, cosa che può + causare problemi per l'hardware che esegue + operazioni in DMA su quelle pagine.\\ + \const{MADV\_DOFORK} & rimuove l'effetto della precedente + \const{MADV\_DONTFORK}.\\ + \hline + \end{tabular} + \caption{Valori dell'argomento \param{advice} di \func{madvise}.} + \label{tab:madvise_advice_values} +\end{table} + +\footnotetext{se usato su altri tipi di filesystem causa un errore di + \errcode{ENOSYS}.} + +La funzione non ha, tranne il caso di \const{MADV\_DONTFORK}, nessun effetto +sul comportamento di un programma, ma può influenzarne le prestazioni fornendo +al kernel indicazioni sulle esigenze dello stesso, così che sia possibile +scegliere le opportune strategie per la gestione del \itindex{read-ahead} +\textit{read-ahead} e del caching dei dati. A differenza da quanto specificato +nello standard POSIX.1b, per il quale l'uso di \func{madvise} è a scopo +puramente indicativo, Linux considera queste richieste come imperative, per +cui ritorna un errore qualora non possa soddisfarle.\footnote{questo + comportamento differisce da quanto specificato nello standard.} -% TODO documentare \func{madvise} \itindend{memory~mapping} @@ -4331,6 +4394,8 @@ questa sezione una serie funzioni che consentono ai programmi di ottimizzare il loro accesso ai dati dei file e controllare la gestione del relativo \textit{caching}. +\itindbeg{read-ahead} + Una prima funzione che può essere utilizzata per modificare la gestione ordinaria dell'I/O su un file è \funcd{readahead},\footnote{questa è una funzione specifica di Linux, introdotta con il kernel 2.4.13, e non deve @@ -4364,12 +4429,12 @@ La funzione richiede che venga letto in anticipo il contenuto del file corrispondenti alle dimensioni delle pagine di memoria, ed i valori di \param{offset} e \param{count} arrotondati di conseguenza. -La funzione estende quello che è un comportamento normale del -kernel\footnote{per ottimizzare gli accessi al disco il kernel quando si legge - un file, aspettandosi che l'accesso prosegua, esegue sempre una lettura - anticipata di una certa quantità di dati; questo meccanismo viene chiamato - \textit{readahead}, da cui deriva il nome della funzione.} effettuando la -lettura in cache della sezione richiesta e bloccandosi fintanto che questa non +La funzione estende quello che è un comportamento normale del kernel che +quando si legge un file, aspettandosi che l'accesso prosegua, esegue sempre +una lettura preventiva di una certa quantità di dati; questo meccanismo di +lettura anticipata viene chiamato \textit{read-ahead}, da cui deriva il nome +della funzione. La funzione, ottimizzare gli accessi a disco, effettua la +lettura in cache della sezione richiesta e si blocca fintanto che questa non viene completata. La posizione corrente sul file non viene modificata ed indipendentemente da quanto indicato con \param{count} la lettura dei dati si interrompe una volta raggiunta la fine del file. @@ -4380,6 +4445,8 @@ dati saranno necessari in seguito. Si potr momento (ad esempio in fase di inizializzazione) la lettura, così da ottenere una migliore risposta nelle operazioni successive. +\itindend{read-ahead} + Il concetto di \func{readahead} viene generalizzato nello standard POSIX.1-2001 dalla funzione \funcd{posix\_fadvise},\footnote{anche se l'argomento \param{len} è stato modificato da \ctyp{size\_t} a \ctyp{off\_t} @@ -4590,6 +4657,8 @@ mancanza di spazio disco. % LocalWords: Jens Anxboe vmsplice seek ESPIPE GIFT TCP CORK MSG splicecp nr % LocalWords: nwrite segs patch readahead posix fadvise TC advice FADV NORMAL % LocalWords: SEQUENTIAL NOREUSE WILLNEED DONTNEED streaming fallocate EFBIG +% LocalWords: POLLRDHUP half close pwait Gb madvise MADV ahead REMOVE +% LocalWords: DONTFORK DOFORK %%% Local Variables: -- 2.30.2