\begin{figure}[htb]
\centering
-
+ \includegraphics[width=8cm]{img/memory_layout.eps}
\caption{Disposizione tipica dei segmenti di memoria di un processo}
\label{fig:proc_mem_layout}
\end{figure}
voluta copiandoci automaticamente il contenuto, lo spazio in più non viene
inizializzato.
-Il fatto che il blocco di memoria restituito da \texttt{realloc} possa
-camabiare comporta che si deve sempre riassegnare al puntatore passato per il
+Il fatto che il blocco di memoria restituito da \func{realloc} possa
+cambiare comporta che si deve sempre riassegnare al puntatore passato per il
ridimensionamento il valore di ritorno della funzione, e che non ci devono
essere altri puntatori che puntino all'interno di un'area che si vuole
ridimensionare.
permettono di sostituire alle funzioni di libreria una propria versione (che
può essere più o meno specializzata per il debugging).
+
\subsection{La funzione \texttt{alloca}}
\label{sec:proc_mem_alloca}
Come è evidente questa funzione ha molti vantaggi, e permette di evitare i
problemi di memory leak non essendo più necessaria la deallocazione esplicita;
una delle ragioni principali per usarla è però che funziona anche quando si
-usa \texttt{longjump} per uscire con un salto non locale da una funzione (vedi
-\secref{sec:proc_longjmp}),
+usa \func{longjump} per uscire con un salto non locale da una funzione (vedi
+\secref{sec:proc_longjmp}),
Un altro vantaggio e che in Linux la funzione è molto veloce e non viene
sprecato spazio, infatti non è necessario gestire un pool di memoria da
segnale di \textit{segmentation violation} analogo a quello che si avrebbe da
una ricorsione infinita.
+Inoltre non è chiaramente possibile usare questa funzione per allocare memoria
+che deve poi essere usata anche al di fuori della funzione in cui questa viene
+chiamata, in quanto all'uscita dalla funzione lo spazio allocato diventerebbe
+libero, e potrebbe essere sovrascritto all'invocazione di nuove funzioni con
+conseguenze imprevedibili.
+
+Questo è lo stesso problema potenziale che si può avere con le variabili
+automatiche; un errore comune infatti è quello di restituire al chiamante un
+puntatore ad una di queste variabili, che sarà automaticamente distrutta
+all'uscita della funzione, con gli stessi problemi appena citati per
+\func{alloca}.
\subsection{Le funzioni \texttt{brk} e \texttt{sbrk}}
\label{sec:proc_mem_sbrk}
Il controllo del flusso di un programma in genere viene effettuato con le
varie istruzioni del linguaggio C, la più bistrattata delle quali è il
-\texttt{goto} ampiamente deprecato in favore di costrutti più puliti; esiste
+\texttt{goto}, ampiamente deprecato in favore di costrutti più puliti; esiste
però un caso in l'uso di questa istruzione porta all'implementazione più
efficiente, quello dell'uscita in caso di errore.
Oltre ai parametri passati da linea di comando ogni processo riceve dal
sistema un \textsl{ambiente}, nella forma di una lista di variabili
(\textit{environment list}) messa a disposizione dal processo costruita nella
-chiamata ad \finc{exec} che lo ha lanciato.
+chiamata ad \func{exec} che lo ha lanciato.
Come per la lista dei parametri anche questa lista è un array di puntatori a
caratteri, ciascuno dei quali punta ad una stringa (terminata da un null). A