From f2e24e170e8ad0d5d1194f492e5cb1349ebe5622 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 14 Sep 2015 06:31:27 +0000 Subject: [PATCH] Finita madvise, trattata posix_madvise --- fileadv.tex | 155 ++++++++++++++++++++++++++++++++++++++++----------- ipc.tex | 2 +- prochand.tex | 30 +++++----- signal.tex | 38 ++++++------- system.tex | 8 +-- 5 files changed, 158 insertions(+), 75 deletions(-) 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}} diff --git a/ipc.tex b/ipc.tex index f6065cd..abe229a 100644 --- a/ipc.tex +++ b/ipc.tex @@ -5083,10 +5083,10 @@ testo alla terminazione di quest'ultimo. % LocalWords: SysV capability short RESOURCE INFO UNDEFINED EFBIG semtimedop % LocalWords: scan HUGETLB huge page NORESERVE copy RLIMIT MEMLOCK REMAP UTC % LocalWords: readmon Hierarchy defaults queues MSGQUEUE effective fstat +% LocalWords: fchown fchmod Epoch January %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: -% LocalWords: fchown fchmod Epoch January diff --git a/prochand.tex b/prochand.tex index 3ba60c6..c5e1c0f 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1124,11 +1124,10 @@ restituito da entrambe le funzioni dipende dall'implementazione, ma tradizionalmente gli 8 bit meno significativi sono riservati per memorizzare lo \itindex{exit~status} stato di uscita del processo, e gli altri per indicare il segnale che ha causato la terminazione (in caso di conclusione -anomala), uno per indicare se è stato generato un \itindex{core~dump} -\textit{core dump} (vedi sez.~\ref{sec:sig_standard}), ecc.\footnote{le - definizioni esatte si possono trovare in \file{} ma - questo file non deve mai essere usato direttamente, esso viene incluso - attraverso \file{}.} +anomala), uno per indicare se è stato generato un \textit{core dump} (vedi +sez.~\ref{sec:sig_standard}), ecc.\footnote{le definizioni esatte si possono + trovare in \file{} ma questo file non deve mai essere + usato direttamente, esso viene incluso attraverso \file{}.} \begin{table}[!htb] \centering @@ -1158,7 +1157,7 @@ anomala), uno per indicare se è stato generato un \itindex{core~dump} \val{WIFSIGNALED} ha restituito un valore non nullo.\\ \macro{WCOREDUMP}\texttt{(s)} & Vera se il processo terminato ha - generato un file di \itindex{core~dump} + generato un file di \textit{core dump}; può essere valutata solo se \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\ @@ -1318,7 +1317,7 @@ campi: \const{CLD\_DUMPED} a indicare la ragione del ritorno della funzione, il cui significato è, nell'ordine: uscita normale, terminazione da segnale, processo fermato, processo riavviato, processo terminato in - \itindex{core~dump} \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). + \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). \end{basedescript} Infine Linux, seguendo un'estensione di BSD, supporta altre due funzioni per @@ -3645,29 +3644,28 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} \item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la terminazione di un processo a causa di un segnale per il quale è prevista la - generazione di un file di \itindex{core~dump} \textit{core dump} (vedi + generazione di un file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag viene attivato automaticamente, ma per evitare problemi di sicurezza (la generazione di un file da parte di processi privilegiati può essere usata per sovrascriverne altri) viene cancellato quando si mette in esecuzione un programma con i bit \acr{suid} e \acr{sgid} attivi (vedi sez.~\ref{sec:file_special_perm}) o con l'uso delle funzioni per la modifica - degli \ids{UID} dei processi (vedi sez.~\ref{sec:proc_setuid}). + degli \ids{UID} dei processi (vedi sez.~\ref{sec:proc_setuid}). L'operazione è stata introdotta a partire dal kernel 2.3.20, fino al kernel 2.6.12 e per i kernel successivi al 2.6.17 era possibile usare solo un valore 0 di \param{arg2} per disattivare il flag ed un valore 1 per attivarlo. Nei kernel dal 2.6.13 al 2.6.17 è stato supportato anche il - valore 2, che causava la generazione di un \itindex{core~dump} \textit{core - dump} leggibile solo dall'amministratore, ma questa funzionalità è stata - rimossa per motivi di sicurezza, in quanto consentiva ad un utente normale - di creare un file di \textit{core dump} appartenente all'amministratore in - directory dove l'utente avrebbe avuto permessi di accesso. + valore 2, che causava la generazione di un \textit{core dump} leggibile solo + dall'amministratore, ma questa funzionalità è stata rimossa per motivi di + sicurezza, in quanto consentiva ad un utente normale di creare un file di + \textit{core dump} appartenente all'amministratore in directory dove + l'utente avrebbe avuto permessi di accesso. \item[\const{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione lo stato corrente del flag che controlla la effettiva generazione dei - \itindex{core~dump} \textit{core dump}. Introdotta a partire dal kernel - 2.3.20. + \textit{core dump}. Introdotta a partire dal kernel 2.3.20. \item[\const{PR\_SET\_ENDIAN}] Imposta la \itindex{endianness} \textit{endianness} del processo chiamante secondo il valore fornito diff --git a/signal.tex b/signal.tex index cc2a06b..159ba62 100644 --- a/signal.tex +++ b/signal.tex @@ -286,12 +286,12 @@ l'immagine della memoria del processo. Questo file costituisce il cosiddetto \textit{core dump}, e contenendo l'immagine della memoria del processo, consente di risalire allo stato dello -\itindex{stack} \textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}) prima -della terminazione. Questo permette di esaminare il contenuto del file un -secondo tempo con un apposito programma (un \textit{debugger} come \cmd{gdb}) -per investigare sulla causa dell'errore, ed in particolare, grazie appunto ai -dati dello \itindex{stack} \textit{stack}, consente di identificare quale -funzione ha causato l'errore. +\textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}) prima della +terminazione. Questo permette di esaminare il contenuto del file un secondo +tempo con un apposito programma (un \textit{debugger} come \cmd{gdb}) per +investigare sulla causa dell'errore, ed in particolare, grazie appunto ai dati +dello \textit{stack}, consente di identificare quale funzione ha causato +l'errore. Si tenga presente che il \textit{core dump} viene creato non solo in caso di errore effettivo, ma anche se il segnale per cui la sua creazione è prevista @@ -446,7 +446,7 @@ tab.~\ref{tab:sig_action_leg}). \hline T & L'azione predefinita è terminare il processo.\\ C & L'azione predefinita è terminare il processo e scrivere un - \itindex{core~dump} \textit{core dump}.\\ + \textit{core dump}.\\ I & L'azione predefinita è ignorare il segnale.\\ S & L'azione predefinita è fermare il processo.\\ \hline @@ -494,9 +494,9 @@ gestore non ci fosse stato. L'azione predefinita per tutti questi segnali è causare la terminazione del processo che li ha causati. In genere oltre a questo il segnale provoca pure -la registrazione su disco di un file di \itindex{core~dump} \textit{core - dump}, che un debugger può usare per ricostruire lo stato del programma al -momento della terminazione. Questi segnali sono: +la registrazione su disco di un file di \textit{core dump}, che un debugger +può usare per ricostruire lo stato del programma al momento della +terminazione. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\signal{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome derivi da \textit{floating point exception} si applica a tutti gli errori @@ -590,13 +590,12 @@ processo, questi segnali sono: controllato da un altro carattere di controllo, ``\textit{QUIT}'', corrispondente alla sequenza \texttt{C-\bslash} sulla tastiera. A differenza del precedente l'azione predefinita, oltre alla terminazione del processo, - comporta anche la creazione di un \itindex{core~dump} \textit{core dump}. - In genere lo si può pensare come corrispondente ad una condizione di errore - del programma rilevata dall'utente. Per questo motivo non è opportuno fare - eseguire al gestore di questo segnale le operazioni di pulizia normalmente - previste (tipo la cancellazione di file temporanei), dato che in certi casi - esse possono eliminare informazioni utili nell'esame dei \itindex{core~dump} - \textit{core dump}. + comporta anche la creazione di un \textit{core dump}. In genere lo si può + pensare come corrispondente ad una condizione di errore del programma + rilevata dall'utente. Per questo motivo non è opportuno fare eseguire al + gestore di questo segnale le operazioni di pulizia normalmente previste + (tipo la cancellazione di file temporanei), dato che in certi casi esse + possono eliminare informazioni utili nell'esame dei \textit{core dump}. \item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata qualunque programma. Questo segnale non può essere né intercettato, né @@ -756,15 +755,14 @@ quella di terminare il processo, questi segnali sono: tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. Fino al kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni dello standard POSIX.1-2001 viene anche generato un - \itindex{core~dump} \textit{core dump}. + \textit{core dump}. \item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo segnale è generato quando un processo tenta di estendere un file oltre le dimensioni specificate dal limite impostato per le dimensioni massime di un file, vedi sez.~\ref{sec:sys_resource_limit}. Fino al kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni - dello standard POSIX.1-2001 viene anche generato un \itindex{core~dump} - \textit{core dump}. + dello standard POSIX.1-2001 viene anche generato un \textit{core dump}. \item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il segnale che viene generato quando si perde un advisory lock su un file su diff --git a/system.tex b/system.tex index 68848c1..4ef44d3 100644 --- a/system.tex +++ b/system.tex @@ -1594,8 +1594,7 @@ specifico segnale o il fallimento della \textit{system call} che lo ha provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU} in cui si ha in comportamento diverso per il superamento dei due limiti e \const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale -creazione dei file di \itindex{core~dump} \textit{core dump} (vedi -sez.~\ref{sec:sig_standard}). +creazione dei file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit} @@ -1675,11 +1674,10 @@ riportati nel seguente elenco: resta 2Gb, altrimenti la risorsa si dà per non limitata. \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima - dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi + dimensione per un file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File di dimensioni maggiori verranno troncati a questo valore, mentre con un - valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core - dump}. + valore nullo si bloccherà la creazione dei \textit{core dump}. \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il -- 2.30.2