X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=process.tex;h=c3a801c623fac9ed041d83225c8a023b82824082;hb=db19b7f83b55cfd8add75de54130661a0baeacd3;hp=45363c591eb6a225a0df92e6c41d4d717f15ad26;hpb=b68aa96c16958fda51be7ce0fc43ff51b1171342;p=gapil.git diff --git a/process.tex b/process.tex index 45363c5..c3a801c 100644 --- a/process.tex +++ b/process.tex @@ -559,14 +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 in Linux -la funzione è molto veloce ed occupa poco spazio, essendo codificata -direttamente dentro il compilatore, inoltre +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}), + +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} @@ -577,7 +614,7 @@ direttamente dentro il compilatore, inoltre \section{Il controllo di flusso non locale} -\label{sec:proc_flux} +\label{sec:proc_longjmp} \section{La gestione di parametri e opzioni}