X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=a255851500e3df6f31b39457cfc58da36b883175;hp=aecd73e5fcc3ab66c91508d0fb8b03560ad8e7a2;hb=f2e24e170e8ad0d5d1194f492e5cb1349ebe5622;hpb=8e1c72a56bbdf56f1b1590101495c5066e6cb247 diff --git a/fileadv.tex b/fileadv.tex index aecd73e..a255851 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -4547,17 +4547,20 @@ 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. +\itindend{memory~mapping} + 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 è: +kernel delle indicazioni su come un processo intende accedere ad un segmento +di memoria, anche al di là delle mappature dei file, così che possano essere +adottate le opportune strategie di ottimizzazione. Il suo prototipo è: \begin{funcproto}{ \fhead{sys/mman.h} \fdecl{int madvise(void *start, size\_t length, int advice)} -\fdesc{Fornisce indicazioni sull'uso previsto di un \textit{memory mapping}.} +\fdesc{Fornisce indicazioni sull'uso previsto di un segmento di memoria.} } {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual @@ -4567,7 +4570,9 @@ le opportune strategie di ottimizzazione. Il suo prototipo è: \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. + \const{MADV\_DONTNEED}) di pagine bloccate o condivise o si è usato + \const{MADV\_MERGEABLE} o \const{MADV\_UNMERGEABLE} ma il kernel non è + stato compilato per il relativo supporto. \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}). @@ -4578,7 +4583,6 @@ le opportune strategie di ottimizzazione. Il suo prototipo è: ed inoltre \errval{EAGAIN} e \errval{ENOSYS} nel loro significato generico.} \end{funcproto} - La sezione di memoria sulla quale si intendono fornire le indicazioni deve essere indicata con l'indirizzo iniziale \param{start} e l'estensione \param{length}, il valore di \param{start} deve essere allineato, @@ -4591,10 +4595,15 @@ applicata alle restanti parti, anche se la funzione ritorna un errore di L'indicazione viene espressa dall'argomento \param{advice} che deve essere specificato con uno dei valori riportati in tab.~\ref{tab:madvise_advice_values}; si tenga presente che i valori indicati -nella seconda parte sono specifici di Linux e non sono previsti dallo standard -POSIX.1b. +nella seconda parte della tabella sono specifici di Linux e non sono previsti +dallo standard POSIX.1b. +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. -\begin{table}[htb] +\begin{table}[!htb] \centering \footnotesize \begin{tabular}[c]{|l|p{10 cm}|} @@ -4613,7 +4622,8 @@ POSIX.1b. \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 \textit{read-ahead} (vedi + anticipata con il meccanismo del + \textit{read-ahead} (vedi sez.~\ref{sec:file_fadvise}) è di scarsa utilità e verrà disabilitata.\\ \const{MADV\_SEQUENTIAL}& ci si aspetta un accesso sequenziale al file, @@ -4625,35 +4635,63 @@ POSIX.1b. pertanto l'applicazione del \textit{read-ahead} deve essere incentivata.\\ \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} se usato su altri tipi di - filesystem causa un errore di \errcode{ENOSYS} - (dal kernel 2.6.16).\\ + \const{MADV\_DONTDUMP}& esclude da un \textit{core dump} (vedi + sez.~\ref{sec:sig_standard}) le pagine + specificate, viene usato per evitare di scrivere + su disco dati relativi a zone di memoria che si sa + non essere utili in un \textit{core dump}.\\ + \const{MADV\_DODUMP} & rimuove l'effetto della precedente + \const{MADV\_DONTDUMP} (dal kernel 3.4).\\ \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 \textit{copy on write} effettui la rilocazione delle pagine quando il padre scrive - sull'area di memoria dopo la \func{fork}, cosa che può - causare problemi per l'hardware che esegue + sull'area di memoria dopo la \func{fork}, cosa che + può causare problemi per l'hardware che esegue operazioni in DMA su quelle pagine (dal kernel 2.6.16).\\ \const{MADV\_DOFORK} & rimuove l'effetto della precedente \const{MADV\_DONTFORK} (dal kernel 2.6.16).\\ - \const{MADV\_MERGEABLE}& marca la pagina come accorpabile (indicazione + \const{MADV\_HUGEPAGE}& abilita il meccanismo delle \textit{Transparent + Huge Page} (vedi sez.~\ref{sec:huge_pages}) + sulla regione indicata; se questa è allineata + alle relative dimensioni il kernel alloca + direttamente delle \textit{huge page}; è + utilizzabile solo con mappature anomime private + (dal kernel 2.6.38).\\ + \const{MADV\_NOHUGEPAGE}& impedisce che la regione indicata venga + collassata in eventuali \textit{huge page} (dal + kernel 2.6.38).\\ + \const{MADV\_HWPOISON} &opzione ad uso di debug per verificare codice + che debba gestire errori nella gestione della + memoria; richiede una apposita opzione di + compilazione del kernel, privilegi amministrativi + (la capacità \const{CAP\_SYS\_ADMIN}) e provoca + l'emissione di un segnale di \const{SIGBUS} dal + programma chiamante e rimozione della mappatura + (dal kernel 2.6.32).\\ + \const{MADV\_SOFT\_OFFLINE}&opzione utilizzata per il debug del + codice di verifica degli errori di gestione + memoria, richiede una apposita opzione di + compilazione (dal kernel 2.6.33).\\ + \const{MADV\_MERGEABLE}& marca la pagina come accorpabile, indicazione principalmente ad uso dei sistemi di - virtualizzazione).\footnotemark\\ - \const{MADV\_UNMERGEABLE}& \\ + virtualizzazione\footnotemark (dal kernel 2.6.32).\\ + \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} se usato su altri tipi di + filesystem causa un errore di \errcode{ENOSYS} + (dal kernel 2.6.16).\\ + \const{MADV\_UNMERGEABLE}& rimuove l'effetto della precedente + \const{MADV\_MERGEABLE} (dal kernel 2.6.32). \\ \hline \end{tabular} \caption{Valori dell'argomento \param{advice} di \func{madvise}.} \label{tab:madvise_advice_values} \end{table} -\footnotetext{.} - \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che identifica pagine di memoria identiche e le accorpa in una unica pagina (soggetta al \textit{copy-on-write} per successive modifiche); per evitare @@ -4663,19 +4701,70 @@ POSIX.1b. la loro occupazione di memoria, ma il meccanismo può essere usato anche in altre applicazioni in cui sian presenti numerosi processi che usano gli stessi dati; per maggiori dettagli si veda - \href{http://kernelnewbies.org/Linux_2_6_32\#head-d3f32e41df508090810388a57efce73f52660ccb}{\texttt{http://kernelnewbies.org/Linux\_2\_6\_32}}.} + \href{http://kernelnewbies.org/Linux_2_6_32\#head-d3f32e41df508090810388a57efce73f52660ccb}{\texttt{http://kernelnewbies.org/Linux\_2\_6\_32}} + e la documentazione nei sorgenti del kernel + (\texttt{Documentation/vm/ksm.txt}).} -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.} -\itindend{memory~mapping} +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; questo comportamento differisce da quanto specificato nello +standard. + +Nello standard POSIX.1-2001 è prevista una ulteriore funzione +\funcd{posix\_madvise} che su Linux viene reimplementata utilizzando +\func{madvise}; il suo prototipo è: + +\begin{funcproto}{ +\fhead{sys/mman.h} +\fdecl{int posix\_madvise(void *start, size\_t lenght, int advice)} +\fdesc{Fornisce indicazioni sull'uso previsto di un segmento di memoria.} +} + +{La funzione ritorna $0$ in caso di successo ed un valore positivo per un + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \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. + \item[\errcode{ENOMEM}] gli indirizzi specificati non sono nello spazio di + indirizzi del processo. + \end{errlist} +} +\end{funcproto} + +Gli argomenti \param{addr} e \param{len} hanno lo stesso significato degli +analoghi di \func{madvise}, mentre \param{advice} può assumere solo i valori +indicati in tab.~\ref{tab:posix_madvise_advice_values}, che riflettono gli +analoghi di \func{madvise}. + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|l|} + \hline + \textbf{Valore} & \textbf{Significato} \\ + \hline + \hline + \const{POSIX\_MADV\_DONTNEED}& analogo a \const{MADV\_DONTNEED}.\\ + \const{POSIX\_MADV\_NORMAL} & identico a \const{MADV\_NORMAL}.\\ + \const{POSIX\_MADV\_RANDOM} & identico a \const{MADV\_RANDOM}.\\ + \const{POSIX\_MADV\_SEQUENTIAL}& identico a \const{MADV\_SEQUENTIAL}.\\ + \const{POSIX\_MADV\_WILLNEED}& identico a \const{MADV\_WILLNEED}.\\ + \hline + \end{tabular} + \caption{Valori dell'argomento \param{advice} di \func{posix\_madvise}.} + \label{tab:posix_madvise_advice_values} +\end{table} + +A differenza di quanto indicato dallo standard su Linux un valore nullo +di \param{len} è consentito. Inoltre a partire dalle \acr{glibc} 2.6 +\const{POSIX\_MADV\_DONTNEED} viene ignorato, in quanto l'uso del +corrispondente \const{MADV\_DONTNEED} di \func{madvise} ha, per la semantica +imperativa, l'effetto immediato di far liberare le pagine da parte del kernel, +che viene considerato distruttivo. + \subsection{I/O vettorizzato: \func{readv} e \func{writev}}