X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=process.tex;h=4db223d20432394227cf26a2c7af5c9649993b59;hb=6e257bf71f9acd5839dbae72de3dc9523cfb47c9;hp=2cca5986b9c0f08ed8f83f3d296e492e77119ef9;hpb=c49e97bdcba8e4da8578d5a048a5764a622aff1e;p=gapil.git diff --git a/process.tex b/process.tex index 2cca598..4db223d 100644 --- a/process.tex +++ b/process.tex @@ -467,10 +467,6 @@ attraverso i puntatori alla memoria loro riservata che si sono ottenuti dalle funzioni di allocazione. -\subsection{Le funzioni \func{malloc}, \func{calloc}, \func{realloc} e - \func{free}} -\label{sec:proc_mem_malloc} - Le funzioni previste dallo standard ANSI C per la gestione della memoria sono quattro: \funcd{malloc}, \funcd{calloc}, \funcd{realloc} e \funcd{free}, i loro prototipi sono i seguenti: @@ -562,13 +558,13 @@ variabile di ambiente \val{MALLOC\_CHECK\_} che quando viene definita mette in uso una versione meno efficiente delle funzioni suddette, che però è più tollerante nei confronti di piccoli errori come quello di chiamate doppie a \func{free}. In particolare: -\begin{itemize} +\begin{itemize*} \item se la variabile è posta a zero gli errori vengono ignorati; \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error} (vedi sez.~\ref{sec:file_std_stream}); \item se è posta a 2 viene chiamata \func{abort}, che in genere causa l'immediata conclusione del programma. -\end{itemize} +\end{itemize*} Il problema più comune e più difficile da risolvere che si incontra con le funzioni di allocazione è quando non viene opportunamente liberata la memoria @@ -629,9 +625,6 @@ ricompilare il programma,\footnote{esempi sono \textit{Dmalloc} molto complesse riguardo l'allocazione della memoria. -\subsection{Le funzioni \func{alloca}, \func{brk} e \func{sbrk}} -\label{sec:proc_mem_sbrk_alloca} - Una possibile alternativa all'uso di \func{malloc}, che non soffre dei problemi di \textit{memory leak}\itindex{memory~leak} descritti in precedenza, è la funzione \funcd{alloca}, che invece di allocare la memoria nello @@ -694,9 +687,8 @@ 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 funzioni di allocazione della memoria -viste in sez.~\ref{sec:proc_mem_malloc}. La prima funzione è \funcd{brk}, ed -il suo prototipo è: +implementare la propria versione delle funzioni di allocazione della memoria. +La prima funzione è \funcd{brk}, ed il suo prototipo è: \begin{prototype}{unistd.h}{int brk(void *end\_data\_segment)} Sposta la fine del segmento dei dati. @@ -705,7 +697,7 @@ il suo prototipo \end{prototype} La funzione è un'interfaccia diretta all'omonima system call ed imposta -l'indirizzo finale del \index{segmento!dati}segmento dati di un processo +l'indirizzo finale del \index{segmento!dati} segmento dati di un processo all'indirizzo specificato da \param{end\_data\_segment}. Quest'ultimo deve essere un valore ragionevole, ed inoltre la dimensione totale del segmento non deve comunque eccedere un eventuale limite (si veda @@ -733,12 +725,6 @@ per i programmi normali standard descritte in precedenza, che sono costruite su di esse. -% \subsection{La personalizzazione delle funzioni di allocazione} -% \label{sec:proc_mem_malloc_custom} - -% TODO documentare \func{madvise} -% TODO documentare \func{mincore} - \subsection{Il controllo della memoria virtuale} \label{sec:proc_mem_lock} @@ -820,7 +806,7 @@ in byte.\footnote{con Linux questo non avviene e si deve ricorrere alla funzione \func{getpagesize}, vedi sez.~\ref{sec:sys_memory_res}.} -Con il kernel 2.6.9 anche un processo normale può bloccare la propria +A partire dal kernel 2.6.9 anche un processo normale può bloccare la propria memoria\footnote{la funzionalità è stata introdotta per non essere costretti a dare privilegi eccessivi a programmi di crittografia, che necessitano di questa funzionalità, ma che devono essere usati da utenti normali.} ma @@ -831,7 +817,7 @@ poi ogni processo pu però diversi processi bloccano la stessa pagina questa resterà bloccata fintanto che ci sarà almeno un processo che la blocca. -Le funzioni per bloccare e sbloccare la paginazione\index{paginazione} di +Le funzioni per bloccare e sbloccare la paginazione \index{paginazione} di singole sezioni di memoria sono \funcd{mlock} e \funcd{munlock}; i loro prototipi sono: \begin{functions} @@ -842,7 +828,6 @@ prototipi sono: \funcdecl{int munlock(const void *addr, size\_t len)} Rimuove il blocco della paginazione su un intervallo di memoria. - \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei @@ -920,12 +905,18 @@ che esse vengano mappate in RAM dallo \itindex{stack} stack, dopo di che, per essere sicuri che esse siano state effettivamente portate in memoria, ci si scrive sopra. -% TODO: trattare \func{madvise} +\itindend{memory~locking} + +% TODO documentare \func{madvise} +% TODO documentare \func{mincore} \index{memoria~virtuale|)} -\itindend{memory~locking} + +% \subsection{Gestione avanzata dell'allocazione della memoria} +% \label{sec:proc_mem_malloc_custom} +% TODO: trattare le funzionalità avanzate di \func{malloc} @@ -949,6 +940,7 @@ manipolare ed utilizzare le variabili di ambiente. \subsection{Il formato degli argomenti} \label{sec:proc_par_format} + In genere il passaggio degli argomenti al programma viene effettuato dalla shell, che si incarica di leggere la linea di comando e di effettuarne la scansione (il cosiddetto \textit{parsing}) per individuare le parole che la @@ -1082,7 +1074,7 @@ la gestione di queste ultime versione estesa di \func{getopt}. (NdA: questa parte verrà inserita in seguito). - +% TODO opzioni in formato esteso \subsection{Le variabili di ambiente} \label{sec:proc_environ} @@ -1707,4 +1699,4 @@ dichiarandole tutte come \direct{volatile}\footnote{la direttiva % LocalWords: clearenv libc value overwrite string reference result argument % LocalWords: socket variadic ellipsis header stdarg execl self promoting last % LocalWords: float double short register type dest src extern setjmp jmp buf -% LocalWords: env return if while +% LocalWords: env return if while sottoprocesso Di