From: Simone Piccardi Date: Thu, 21 Jun 2001 11:46:32 +0000 (+0000) Subject: Finita alloca, iniziato brk e sbrk. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=db19b7f83b55cfd8add75de54130661a0baeacd3;p=gapil.git Finita alloca, iniziato brk e sbrk. --- diff --git a/process.tex b/process.tex index 52da830..c3a801c 100644 --- a/process.tex +++ b/process.tex @@ -559,18 +559,51 @@ segmento di stack della funzione corrente. La sintassi ma in questo caso non è più necessario liberare la memoria in quanto questa viene rilasciata automaticamente al ritorno della funzione. -Come è evidente questa funzione ha molti vantaggi, in particolare il fatto che -la memoria venga rilasciata automaticamente -in particolare in Linux -la funzione è molto veloce e non viene sprecato spazio, non dovendo gestire un -pool di zone di memoria da riservare; si evita così anche la frammentazione. +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}), -Gli svantaggi sono che quando +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 +riservare e si evitano anche problemi di frammentazione. + +Gli svantaggi sono che la funzione non è disponibile su tutti gli unix quando +non è possibile aumentare le dimensioni dello stack una volta chiamata una +funzione e quindi l'uso limita la portabilità dei programmi, inoltre se si +cerca di allocare troppa memoria non si ottiene un messaggio di errore, ma un +segnale di \textit{segmentation violation} analogo a quello che si avrebbe da +una ricorsione infinita. \subsection{Le funzioni \texttt{brk} e \texttt{sbrk}} \label{sec:proc_mem_sbrk} +L'uso di queste funzioni è necessario solo quando si voglia accedere alle +analoghe system call a cui fanno da interfaccia (ad esempio per implementare +una propria versione di \texttt{malloc}. Le funzione sono: +\begin{prototype}{unistd.h}{int *brk(void end_data_segment)} + Sposta la fine del segmento dei dati all'indirizzo specificato da + \texttt{end_data_segment}. + + La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, + nel qual caso \texttt{errno} viene settata a \texttt{ENOMEM}. +\end{prototype} +\begin{prototype}{unistd.h}{int *sbrk(ptrdiff\_t increment)} + Incrementa lo spazio dati di un programma di \texttt{increment}. + + La funzione restituisce il puntatore all'inzio della nuova zona di memoria + allocata in caso di successo e \texttt{NULL} in caso di fallimento, nel qual + caso \texttt{errno} viene settata a \texttt{ENOMEM}. +\end{prototype} + +Queste funzioni sono state deliberatamente escluse dallo standard POSIX.1 e +per i programmi normali è opportuno usare le funzioni di allocazione standard +descritte in precedenza, che sono costruite su di esse. In genere si usa +\texttt{sbrk} con un valore zero per ottenere l'attuale posizione della fine +del segmento dati. + \subsection{La personalizzazione delle funzioni di allocazione} \label{sec:proc_mem_malloc_custom} @@ -581,7 +614,7 @@ Gli svantaggi sono che quando \section{Il controllo di flusso non locale} -\label{sec:proc_flux} +\label{sec:proc_longjmp} \section{La gestione di parametri e opzioni}