X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=1c71789bde591f672d9261c6e9f8e74d5f0e36cc;hp=da8710e51a6220e6a7dedab88aed3d427513140a;hb=29b7512f9179b716d031c978cd39dc96cd84b8b7;hpb=cfe0f2e451e5966f524a75de8b26ba18f83dafe5 diff --git a/process.tex b/process.tex index da8710e..1c71789 100644 --- a/process.tex +++ b/process.tex @@ -41,7 +41,7 @@ tutti gli altri.\footnote{questo non \subsection{La funzione \func{main}} \label{sec:proc_main} -Quando un programma viene lanciato il kernel esegue un'opportuna routine di +Quando un programma viene lanciato il kernel esegue un opportuno codice di avvio, usando il programma \cmd{ld-linux.so}. Questo programma prima carica le librerie condivise che servono al programma, poi effettua il collegamento dinamico del codice e alla fine lo esegue. Infatti, a meno di non aver @@ -77,7 +77,7 @@ modalit direttamente la funzione \func{exit} (che viene comunque chiamata automaticamente quando \func{main} ritorna). Una forma alternativa è quella di chiamare direttamente la system call \func{\_exit}, che restituisce il -controllo direttamente alla routine di conclusione dei processi del kernel. +controllo direttamente alla funzione di conclusione dei processi del kernel. Oltre alla conclusione ``\textsl{normale}'' esiste anche la possibilità di una conclusione ``\textsl{anomala}'' del programma a causa della ricezione di un @@ -555,7 +555,7 @@ assegnare sempre a \val{NULL} ogni puntatore liberato con \func{free}, dato che, quando l'argomento è un puntatore nullo, \func{free} non esegue nessuna operazione. -Le \acr{glibc} hanno un'implementazione delle routine di allocazione che è +Le \acr{glibc} hanno un'implementazione delle funzioni di allocazione che è controllabile dall'utente attraverso alcune variabili di ambiente, in particolare diventa possibile tracciare questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_} che quando viene definita mette in @@ -571,7 +571,7 @@ tollerante nei confronti di piccoli errori come quello di chiamate doppie a \end{itemize} Il problema più comune e più difficile da risolvere che si incontra con le -routine di allocazione è quando non viene opportunamente liberata la memoria +funzioni di allocazione è quando non viene opportunamente liberata la memoria non più utilizzata, quello che in inglese viene chiamato \textit{memory leak}\itindex{memory~leak}, cioè una \textsl{perdita di memoria}. @@ -616,13 +616,13 @@ genere va a scapito delle prestazioni dell'applicazione in esecuzione. % allocata da un oggetto. Per limitare l'impatto di questi problemi, e semplificare la ricerca di -eventuali errori, l'implementazione delle routine di allocazione delle +eventuali errori, l'implementazione delle funzioni di allocazione delle \acr{glibc} mette a disposizione una serie di funzionalità che permettono di tracciare le allocazioni e le disallocazioni, e definisce anche una serie di possibili \textit{hook} (\textsl{ganci}) che permettono di sostituire alle funzioni di libreria una propria versione (che può essere più o meno specializzata per il debugging). Esistono varie librerie che forniscono dei -sostituti opportuni delle routine di allocazione in grado, senza neanche +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 @@ -694,7 +694,7 @@ Le due funzioni seguenti\footnote{le due funzioni sono state definite con BSD esplicitamente escluse dallo standard POSIX.} vengono utilizzate soltanto quando è necessario effettuare direttamente la gestione della memoria associata allo spazio dati di un processo, ad esempio qualora si debba -implementare la propria versione delle routine di allocazione della memoria +implementare la propria versione delle funzioni di allocazione della memoria viste in sez.~\ref{sec:proc_mem_malloc}. La prima funzione è \funcd{brk}, ed il suo prototipo è: \begin{prototype}{unistd.h}{int brk(void *end\_data\_segment)} @@ -1328,7 +1328,7 @@ del passaggio pu Il passaggio di una variabile \textit{by value} significa che in realtà quello che viene passato alla subroutine è una copia del valore attuale di quella variabile, copia che la subroutine potrà modificare a piacere, senza che il -valore originale nella routine chiamante venga toccato. In questo modo non +valore originale nella funzione chiamante venga toccato. In questo modo non occorre preoccuparsi di eventuali effetti delle operazioni della subroutine sulla variabile passata come argomento. @@ -1337,13 +1337,13 @@ vale per qualunque variabile, puntatori compresi; quando per subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e -le eventuali modifiche avranno effetto e saranno visibili anche nella routine +le eventuali modifiche avranno effetto e saranno visibili anche nella funzione chiamante. Nella maggior parte delle funzioni di libreria e delle system call i puntatori vengono usati per scambiare dati (attraverso buffer o strutture) e le variabili semplici vengono usate per specificare argomenti; in genere le -informazioni a riguardo dei risultati vengono passate alla routine chiamante +informazioni a riguardo dei risultati vengono passate alla funzione chiamante attraverso il valore di ritorno. È buona norma seguire questa pratica anche nella programmazione normale. @@ -1598,9 +1598,10 @@ Quando viene eseguita direttamente la funzione ritorna sempre zero, un valore diverso da zero viene restituito solo quando il ritorno è dovuto ad una chiamata di \func{longjmp} in un'altra parte del programma che ripristina lo \itindex{stack} stack effettuando il salto non-locale. Si tenga conto che il -contesto salvato in \param{env} viene invalidato se la routine che ha chiamato -\func{setjmp} ritorna, nel qual caso un successivo uso di \func{longjmp} può -comportare conseguenze imprevedibili (e di norma fatali) per il processo. +contesto salvato in \param{env} viene invalidato se la funzione che ha +chiamato \func{setjmp} ritorna, nel qual caso un successivo uso di +\func{longjmp} può comportare conseguenze imprevedibili (e di norma fatali) +per il processo. Come accennato per effettuare un salto non-locale ad un punto precedentemente stabilito con \func{setjmp} si usa la funzione