X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=process.tex;h=15dea095766b37b273fb868dc0683e40feed4412;hb=d16e4abd256d9deb88b430e8b4637bb642becf8a;hp=c332e5c0a12a2b094dfab9848a51b16abda01c4f;hpb=b34e359f722d553bc8e9a6808e0f3a48b57f052a;p=gapil.git diff --git a/process.tex b/process.tex index c332e5c..15dea09 100644 --- a/process.tex +++ b/process.tex @@ -645,7 +645,7 @@ causando a lungo andare un esaurimento della memoria disponibile (e la probabile impossibilità di proseguire l'esecuzione del programma). Il problema è che l'esaurimento della memoria può avvenire in qualunque -momento, in corrispondenza ad una qualunque chiamata di \func{malloc}, che può +momento, in corrispondenza ad una qualunque chiamata di \func{malloc} che può essere in una sezione del codice che non ha alcuna relazione con la subroutine che contiene l'errore. Per questo motivo è sempre molto difficile trovare un \itindex{memory~leak} \textit{memory leak}. @@ -688,7 +688,9 @@ sostituti opportuni delle funzioni di allocazione in grado, senza neanche ricompilare il programma,\footnote{esempi sono \textit{Dmalloc} \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche -molto complesse riguardo l'allocazione della memoria. +molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle +funzionalità di ausilio presenti nelle \acr{glibc} in +sez.~\ref{sec:proc_memory_adv_management}. Una possibile alternativa all'uso di \func{malloc}, che non soffre dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in @@ -1035,7 +1037,8 @@ Le funzioni restituiscono il puntatore al buffer di memoria allocata, che per \func{memalign} sarà un multiplo di \param{boundary} mentre per \func{valloc} un multiplo della dimensione di una pagina di memoria. Nel caso della versione fornita dalle \acr{glibc} la memoria allocata con queste funzioni deve essere -liberata con \func{free}. +liberata con \func{free}, cosa che non è detto accada con altre +implementazioni. Nessuna delle due funzioni ha una chiara standardizzazione (nessuna delle due compare in POSIX.1), ed inoltre ci sono indicazione discordi sui file che ne @@ -1046,14 +1049,62 @@ contengono la definizione;\footnote{secondo SUSv2 \func{valloc} per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo prototipo è: +\begin{prototype}{stdlib.h}{posix\_memalign(void **memptr, size\_t alignment, + size\_t size) } + Alloca un buffer di memoria allineato ad un multiplo di \param{alignment}. + + \bodydesc{La funzione restituisce 0 in caso di successo e \val{NULL} in caso + di fallimento, o uno dei due codici di errore \errcode{ENOMEM} o + \errcode{EINVAL}; \var{errno} non viene impostata.} +\end{prototype} + +La funzione restituisce il puntatore al buffer allocato all'indirizzo indicato +da \param{memptr}. La funzione fallisce nelle stesse condizioni delle due +funzioni precedenti, ma a differenza di \func{memalign} restituisce un codice +di errore \errcode{EINVAL} anche se \param{alignment} non è un multiplo della +la dimensione di \code{sizeof(void *)}. Come per le precedenti la memoria +allocata con \func{posix\_memalign} può essere disallocata con +\func{free}.\footnote{che in caso questo caso è quanto richiesto dallo + standard.} + +Un secondo caso in cui risulta estremamente utile poter avere un maggior +controllo delle modalità di allocazione della memoria è quello in cui cercano +errori di programmazione. Esempi di questi errori sono chiamate doppie alla +funzione \func{free} con lo stesso puntatore, o i cosiddetti +\itindex{buffer~overrun} \textit{buffer overrun}, cioè le scritture su un buffer +oltre le dimensioni della sua allocazione,\footnote{entrambe queste operazioni + causano in genere la corruzione dei dati di controllo delle funzioni di + allocazione, che vengono anch'essi mantenuti nello \itindex{heap} + \textit{heap} per tenere traccia delle zone di memoria allocata.} o i +classici \itindex{memory~leak} \textit{memory leak}. + +Una prima funzionalità di ausilio nella ricerca di questi errori viene fornita +dalla \acr{glibc} tramite l'uso della variabile di ambiente (vedi +sez.~\ref{sec:proc_environ}) \var{MALLOC\_CHECK\_}. Quando questa viene +definita al posto della versione ordinaria delle funzioni di allocazione +(\func{malloc}, \func{calloc}, \func{realloc}, e \func{free}) viene usata una +versione meno efficiente ma in grado di rilevare (e tollerare) alcuni degli +errori più semplici, come le doppie chiamate a \func{free} o i +\itindex{buffer~overrun} \textit{buffer overrun} di un byte.\footnote{uno + degli errori più comuni, causato ad esempio dalla scrittura di una stringa + di dimensione pari a quella del buffer, in cui ci si dimentica dello zero di + terminazione finale.} + +In questo caso a seconda del valore assegnato a \var{MALLOC\_CHECK\_} si +avranno diversi comportamenti: con 0 l'errore sarà ignorato, con 1 verrà +stampato un messaggio sullo \textit{standard error} (vedi +sez.~\ref{sec:file_std_stream}), con 2 verrà invocata la funzione \func{abort} +(vedi sez.~\ref{sec:sig_alarm_abort}) che termina il programma, con 3 viene +sia stampato il messaggio d'errore che abortito il programma. In genere è +opportuno definire la variabile ad un valore diverso da zero che consente di +rilevare un errore nel momento in cui avviene. + +% TODO: trattare le funzionalità avanzate di \func{malloc} + % TODO documentare \func{madvise} % TODO documentare \func{mincore} -% TODO: trattare le funzionalità avanzate di \func{malloc} -% TODO: trattare \func{memalign} -% TODO: trattare \func{valloc} -% TODO: trattare \func{posix\_memalign}