Risistemati un sacco di riferiementi, e la riorganizzazione della parte
[gapil.git] / process.tex
index 9cf5f869df8143e9cfee78d62a87f1e36db58fa1..c19ebe615c73a90b628571ae55c79f4fe18161ba 100644 (file)
@@ -59,9 +59,9 @@ linea di comando, in sostanza un prototipo che va sempre bene 
 
 In realtà nei sistemi unix esiste un'altro modo per definire la funzione
 \texttt{main}, che prevede la presenza di un terzo parametro, \texttt{char
-  *envp[]}, che fornisce l'\textsl{ambiente} (vedi \secref{proc_environ}) del
-programma; questa forma però non è prevista dallo standard POSIX.1 per cui se
-si vogliono scrivere programmi portabili è meglio evitarla.
+  *envp[]}, che fornisce l'\textsl{ambiente} (vedi \secref{sec:proc_environ})
+del programma; questa forma però non è prevista dallo standard POSIX.1 per cui
+se si vogliono scrivere programmi portabili è meglio evitarla.
 
 
 \subsection{Come chiudere un programma}
@@ -77,7 +77,7 @@ che passa il controllo direttamente al kernel.
 Oltre alla conclusione ``normale'' esiste anche la possibilità di una
 conclusione ``anomala'' del programma a causa di segnali o della chiamata alla
 funzione \texttt{abort} (che comunque genera un segnale che termina il
-programma); torneremo su questo in \secref{sec:sig_abort}.
+programma); torneremo su questo in \secref{sec:sig_prog_error}.
 
 Il valore di ritorno della funzione main, o quello usato nelle chiamate ad
 \texttt{exit} e \texttt{\_exit}, viene chiamato \textit{exit status} e passato
@@ -116,7 +116,7 @@ Infine occorre distinguere fra lo stato di uscita di un programma
 possibile un processo possa essere terminato (da un segnale) prima che il
 programma in esecuzione si sia concluso. In caso di conclusione normale del
 programma però lo stato di uscita diventa parte dello stato di conclusione del
-processo (vedi \secref{sec:prochand_XXX}).
+processo (vedi \secref{sec:prochand_xxx}).
 
 
 \subsection{Le funzioni \texttt{exit} e \texttt{\_exit}}
@@ -155,7 +155,7 @@ La funzione chiude tutti i file descriptor appartenenti al processo (sui tenga
 presente che questo non comporta il salvataggio dei dati bufferizzati degli
 stream), fa si che ogni figlio del processo sia ereditato da \texttt{init}
 (vedi \secref{cha:process_handling}), manda un segnale \texttt{SIGCHLD} al
-processo padre (vedi \ref{sec:sig_sigchild}) ed infine ritorna lo stato di
+processo padre (vedi \ref{sec:sig_job_control}) ed infine ritorna lo stato di
 uscita specificato in \texttt{status} che può essere raccolto usando la
 funzione \texttt{wait} (vedi \secref{sec:prochand_wait}).
 
@@ -435,7 +435,7 @@ maniera indiretta attraverso dei puntatori.
 
 Le funzioni previste dallo standard ANSI C per la gestione della memoria sono
 quattro, i prototipi sono i seguenti:
-\begin{prototypes}
+\begin{functions}
 \headdecl{stdlib.h}
 \funcdecl{void *calloc(size\_t size)}
   Alloca \texttt{size} bytes nello heap. La memoria viene inizializzata a 0.
@@ -460,36 +460,7 @@ quattro, i prototipi sono i seguenti:
   Disalloca lo spazio di memoria puntato da \texttt{ptr}.
 
   La funzione non ritorna nulla.
-
-\end{prototypes}
-\begin{prototype}{stdlib.h}{void *calloc(size\_t size)}
-  Alloca \texttt{size} bytes nello heap. La memoria viene inizializzata a 0.
-  
-  La funzione restituisce il puntatore alla 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}
-\begin{prototype}{stdlib.h}{void *malloc(size\_t size)}
-  Alloca \texttt{size} bytes nello heap. La memoria non viene inizializzata.
-
-  La funzione restituisce il puntatore alla 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}
-\begin{prototype}{stdlib.h}{void free(void *ptr)}
-  Disalloca lo spazio di memoria puntato da \texttt{ptr}.
-
-  La funzione non ritorna nulla.
-\end{prototype}
-\begin{prototype}{stdlib.h}{void *realloc(void *ptr, size\_t size)}
-  Cambia la dimensione del blocco allocato all'indirizzo \texttt{ptr}
-  portandola a \texttt{size}.
-
-  La funzione restituisce il puntatore alla 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}
-
+\end{functions}
 Il puntatore che le funzioni di allocazione ritornano è garantito essere
 sempre correttamente allineato per tutti i tipi di dati; ad esempio sulle
 macchine a 32 bit in genere è allineato a multipli di 4 bytes e sulle macchine
@@ -562,7 +533,7 @@ l'errore.
 
 Per questo motivo l'implementazione delle routine di allocazione delle glibc
 mette a disposizione una serie di funzionalità (su cui torneremo in
-\secref{sec:proc_mem_advanced}) che permettono di tracciare le allocazioni e
+\secref{sec:xxx_advanced}) che permettono di tracciare le allocazioni e
 le disallocazione, e definisce anche una serie di possibili agganci che
 permettono di sostituire alle funzioni di libreria una propria versione (che
 può essere più o meno specializzata per il debugging).
@@ -637,7 +608,7 @@ del segmento dati.
 
 
 \subsection{Il controllo della memoria virtuale}  
-\label{sec:proc_mem_mlock}
+\label{sec:proc_mem_lock}
 
 Come spiegato in \secref{sec:proc_mem_gen} il kernel gestisce la memoria in
 maniera trasparente ai processi, decidendo quando rimuovere pagine dalla
@@ -672,6 +643,33 @@ si possono avere queste necessit
   richiedono il blocco di alcune pagine di memoria.
 \end{itemize}
 
+Il meccanismo che previene la paginazione di parte della memoria virtuale di
+un processo è chiamato \textit{memory locking} (blocco della memoria), il
+blocco è sempre associato alle pagine della memoria virtuale del processo, non
+con il segmento reale di ram su cui essa viene mantenuta.
+
+La regola è che se un segmento di ram fa da supporto ad almeno una pagina
+bloccata allora esso viene escluso dal meccanismo della paginazione. I blocchi
+non si accumulano, se si blocca due volte la stessa pagina non è necessario
+sbloccarla due volte, una pagina o è bloccata o no.
+
+Il blocco di memoria persiste fintanto che il processo che lo detiene la
+memoria bloccata non la sblocca. Chiaramente la terminazione del processo
+comporta anche la fine dell'uso della sua memoria virtuale, e quindi anche di
+tutti i blocchi di memoria.
+
+I memory lock non sono ereditati dai processi figli\footnote{ma siccome Linux
+  usa il copy on write gli indirizzi virtuali del figlio sono mantenuti sullo
+  stesso segmento di ram del padre, quindi usufruiscono dei memory lock di
+  questo}. Siccome la presenza di memory lock ha un impatto sugli altri
+processi solo root ha la capacità di bloccare una pagina, ogni processo può
+però sbloccare le sue pagine. Il sistema pone dei limiti all'ammontare di
+memoria di un processo che può essere bloccata e al totale di memoria fisica
+che può dedicare a questo.
+
+
+
+
 \section{Il controllo di flusso non locale}
 \label{sec:proc_longjmp}
 
@@ -682,8 +680,8 @@ per
 efficiente, quello dell'uscita in caso di errore.
 
 Il C però non consente di effettuare un salto ad una label definita in
-un'altra funzione, per cui se  l'errore avviene in funzioni profondamente
-annidate
+un'altra funzione, per cui se l'errore avviene in funzioni profondamente
+annidate occorre usare la funzione \func{longjump}. 
 
 
 \section{La gestione di parametri e opzioni}
@@ -820,5 +818,5 @@ versione estesa di \texttt{getopt}.
 
 
 \subsection{Le variabili di ambiente}
-\label{sec:proc_env_var}
+\label{sec:proc_environ}