Risistemata flock, aggiunta figura sulla struttura del sistema
[gapil.git] / prochand.tex
index 181b1bdde014c4d46dd39bd38341c7955ec58930..3f093759180ae0c364bfd34bbe6e39df922b76f5 100644 (file)
@@ -109,9 +109,10 @@ Dato che tutti i processi attivi nel sistema sono comunque generati da
 possono classificare i processi con la relazione padre/figlio in
 un'organizzazione gerarchica ad albero, in maniera analoga a come i file sono
 organizzati in un albero di directory (si veda
-\secref{sec:file_organization}); in \curfig\ si è mostrato il risultato del
-comando \cmd{pstree} che permette di visualizzare questa struttura, alla cui
-base c'è \cmd{init} che è progenitore di tutti gli altri processi.
+\secref{sec:file_organization}); in \figref{fig:proc_tree} si è mostrato il
+risultato del comando \cmd{pstree} che permette di visualizzare questa
+struttura, alla cui base c'è \cmd{init} che è progenitore di tutti gli altri
+processi.
 
 Il kernel mantiene una tabella dei processi attivi, la cosiddetta
 \textit{process table}; per ciascun processo viene mantenuta una voce nella
@@ -120,7 +121,7 @@ contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture
 usate a questo scopo sono dichiarate nell'header file \file{linux/sched.h}, ed
 uno schema semplificato, che riporta la struttura delle principali informazioni
 contenute nella \type{task\_struct} (che in seguito incontreremo a più
-riprese), è mostrato in \nfig.
+riprese), è mostrato in \figref{fig:proc_task_struct}.
 
 \begin{figure}[htb]
   \centering
@@ -219,12 +220,14 @@ Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo
 processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero
 positivo memorizzato in un intero a 16 bit, arriva ad un massimo di 32767.
 Oltre questo valore l'assegnazione riparte dal numero più basso disponibile a
-partire da un minimo di 300,\footnote{questi valori sono definiti dalla macro
-  \macro{PID\_MAX} in \file{threads.h} e direttamente in \file{fork.c} nei
-  sorgenti del kernel.} che serve a riservare i \acr{pid} più bassi ai processi
-eseguiti dal direttamente dal kernel.  Per questo motivo, come visto in
-\secref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il
-\acr{pid} uguale a uno.
+partire da un minimo di 300,\footnote{questi valori, fino al kernel 2.4.x,
+  sono definiti dalla macro \macro{PID\_MAX} in \file{threads.h} e
+  direttamente in \file{fork.c}, con il kernel 2.5.x e la nuova interfaccia
+  per i thread creata da Ingo Molnar anche il meccanismo di allocazione dei
+  \acr{pid} è stato modificato.} che serve a riservare i \acr{pid} più bassi
+ai processi eseguiti dal direttamente dal kernel.  Per questo motivo, come
+visto in \secref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha
+sempre il \acr{pid} uguale a uno.
 
 Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui
 sono stati creati, questo viene chiamato in genere \acr{ppid} (da
@@ -256,8 +259,8 @@ un processo e le varie relazioni fra processi utilizzate per definire una
 sessione.
 
 Oltre al \acr{pid} e al \acr{ppid}, (e a quelli che vedremo in
-\secref{sec:sess_xxx}, relativi al controllo di sessione), ad ogni processo
-vengono associati degli altri identificatori che vengono usati per il
+\secref{sec:sess_proc_group}, relativi al controllo di sessione), ad ogni
+processo vengono associati degli altri identificatori che vengono usati per il
 controllo di accesso.  Questi servono per determinare se un processo può
 eseguire o meno le operazioni richieste, a seconda dei privilegi e
 dell'identità di chi lo ha posto in esecuzione; l'argomento è complesso e sarà
@@ -607,14 +610,14 @@ comune dopo l'esecuzione di una \func{fork} 
   \secref{sec:proc_access_id}).
 \item gli identificatori per il controllo di sessione: il \textit{process
     groupid} e il \textit{session id} ed il terminale di controllo (vedi
-  \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
+  \secref{sec:sess_proc_group}).
 \item la directory di lavoro e la directory radice (vedi
   \secref{sec:file_work_dir} e \secref{sec:file_chroot}).
 \item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
 \item la maschera dei segnali bloccati (vedi \secref{sec:sig_sigmask}) e le
   azioni installate (vedi \secref{sec:sig_gen_beha}).
 \item i segmenti di memoria condivisa agganciati al processo (vedi
-\secref{sec:ipc_shar_mem}). 
+  \secref{sec:ipc_sysv_shm}).
 \item i limiti sulle risorse (vedi \secref{sec:sys_resource_limit}).
 \item le variabili di ambiente (vedi \secref{sec:proc_environ}).
 \end{itemize*}
@@ -689,13 +692,14 @@ eseguite alla chiusura di un processo 
   \cmd{init}).
 \item viene inviato il segnale \macro{SIGCHLD} al processo padre (vedi
   \secref{sec:sig_sigchld}).
-\item se il processo è un leader di sessione viene mandato un segnale di
-  \macro{SIGHUP} a tutti i processi in background e il terminale di
-  controllo viene disconnesso (vedi \secref{sec:sess_xxx}).
+\item se il processo è un leader di sessione ed il suo terminale di controllo
+  è quello della sessione viene mandato un segnale di \macro{SIGHUP} a tutti i
+  processi del gruppo di foreground e il terminale di controllo viene
+  disconnesso (vedi \secref{sec:sess_ctrl_term}).
 \item se la conclusione di un processo rende orfano un \textit{process
     group} ciascun membro del gruppo viene bloccato, e poi gli vengono
   inviati in successione i segnali \macro{SIGHUP} e \macro{SIGCONT}
-  (vedi \secref{sec:sess_xxx}).
+  (vedi ancora \secref{sec:sess_ctrl_term}).
 \end{itemize*}
 
 Oltre queste operazioni è però necessario poter disporre di un meccanismo
@@ -767,15 +771,15 @@ informazioni riguardo ai processi che sta terminando.
 
 Questo viene fatto mantenendo attiva la voce nella tabella dei processi, e
 memorizzando alcuni dati essenziali, come il \acr{pid}, i tempi di CPU usati
-dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di
-terminazione\footnote{NdA verificare esattamente cosa c'è!}, mentre la memoria
-in uso ed i file aperti vengono rilasciati immediatamente. I processi che sono
-terminati, ma il cui stato di terminazione non è stato ancora ricevuto dal
-padre sono chiamati \textit{zombie}, essi restano presenti nella tabella dei
-processi ed in genere possono essere identificati dall'output di \cmd{ps} per
-la presenza di una \texttt{Z} nella colonna che ne indica lo stato. Quando il
-padre effettuerà la lettura dello stato di uscita anche questa informazione,
-non più necessaria, verrà scartata e la terminazione potrà dirsi completamente
+dal processo (vedi \secref{sec:sys_unix_time}) e lo stato di terminazione,
+mentre la memoria in uso ed i file aperti vengono rilasciati immediatamente. I
+processi che sono terminati, ma il cui stato di terminazione non è stato
+ancora ricevuto dal padre sono chiamati \textit{zombie}, essi restano presenti
+nella tabella dei processi ed in genere possono essere identificati
+dall'output di \cmd{ps} per la presenza di una \texttt{Z} nella colonna che ne
+indica lo stato (vedi \tabref{tab:proc_proc_states}). Quando il padre
+effettuerà la lettura dello stato di uscita anche questa informazione, non più
+necessaria, verrà scartata e la terminazione potrà dirsi completamente
 conclusa.
 
 Possiamo utilizzare il nostro programma di prova per analizzare anche questa
@@ -871,9 +875,10 @@ cercato sia ancora attivo.
 
 Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid}
 che effettua lo stesso servizio, ma dispone di una serie di funzionalità più
-ampie, legate anche al controllo di sessione.  Dato che è possibile ottenere
-lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre
-questa funzione, il cui prototipo è:
+ampie, legate anche al controllo di sessione (si veda
+\ref{sec:sess_job_control}).  Dato che è possibile ottenere lo stesso
+comportamento di \func{wait} si consiglia di utilizzare sempre questa
+funzione, il cui prototipo è:
 \begin{functions}
 \headdecl{sys/types.h}
 \headdecl{sys/wait.h}
@@ -896,7 +901,7 @@ sempre fino a che un processo figlio non termina, mentre \func{waitpid} ha la
 possibilità si specificare un'opzione \macro{WNOHANG} che ne previene il
 blocco; inoltre \func{waitpid} può specificare quale processo attendere sulla
 base del valore fornito dall'argomento \param{pid}, secondo lo
-specchietto riportato in \ntab:
+specchietto riportato in \tabref{tab:proc_waidpid_pid}:
 \begin{table}[!htb]
   \centering
   \footnotesize
@@ -905,7 +910,8 @@ specchietto riportato in \ntab:
     \textbf{Valore} & \textbf{Macro} &\textbf{Significato}\\
     \hline
     \hline
-    $<-1$& -- & attende per un figlio il cui \textit{process group} è uguale al
+    $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi
+    \secref{sec:sess_proc_group}) è uguale al
     valore assoluto di \var{pid}. \\
     $-1$ & \macro{WAIT\_ANY} & attende per un figlio qualsiasi, usata in
     questa maniera è equivalente a \func{wait}.\\ 
@@ -923,12 +929,16 @@ specchietto riportato in \ntab:
 Il comportamento di \func{waitpid} può inoltre essere modificato passando
 delle opportune opzioni tramite l'argomento \param{option}. I valori possibili
 sono il già citato \macro{WNOHANG}, che previene il blocco della funzione
-quando il processo figlio non è terminato, e \macro{WUNTRACED} (usata per il
-controllo di sessione, trattato in \capref{cha:session}) che fa ritornare la
-funzione anche per i processi figli che sono bloccati ed il cui stato non è
-stato ancora riportato al padre. Il valore dell'opzione deve essere
-specificato come maschera binaria ottenuta con l'OR delle suddette costanti
-con zero.
+quando il processo figlio non è terminato, e \macro{WUNTRACED}. Quest'ultimo
+viene generalmente usato per il controllo di sessione, (trattato in
+\secref{sec:sess_job_control}) in quanto permette di identificare i processi
+bloccati. La funzione infatti in tal caso ritorna, restituendone il \acr{pid},
+se c'è un processo figlio che è entrato in stato di sleep (vedi
+\tabref{tab:proc_proc_states}) di cui non si è ancora letto lo stato (con
+questa stessa opzione). Il valore dell'opzione deve essere specificato come
+maschera binaria ottenuta con l'OR delle suddette costanti con zero. In Linux
+sono previste altre opzioni non standard relative al comportamento con i
+thread, che saranno trattate in \secref{sec:thread_xxx}.
 
 La terminazione di un processo figlio è chiaramente un evento asincrono
 rispetto all'esecuzione di un programma e può avvenire in un qualunque
@@ -1109,16 +1119,17 @@ Sostituiscono l'immagine corrente del processo con quella indicata nel primo
 argomento. I parametri successivi consentono di specificare gli argomenti a
 linea di comando e l'ambiente ricevuti dal nuovo processo.
 
-\bodydesc{Queste funzioni ritornano solo in caso di errore, restituendo
-  -1; nel qual caso \var{errno} andrà ad assumere i valori visti in
-  precedenza per \func{execve}.}
+\bodydesc{Queste funzioni ritornano solo in caso di errore, restituendo -1;
+  nel qual caso \var{errno} assumerà i valori visti in precedenza per
+  \func{execve}.}
 \end{functions}
 
 Per capire meglio le differenze fra le funzioni della famiglia si può fare
-riferimento allo specchietto riportato in \ntab. La prima differenza riguarda
-le modalità di passaggio dei parametri che poi andranno a costituire gli
-argomenti a linea di comando (cioè i valori di \var{argv} e \var{argc} visti
-dalla funzione \func{main} del programma chiamato). 
+riferimento allo specchietto riportato in \tabref{tab:proc_exec_scheme}. La
+prima differenza riguarda le modalità di passaggio dei parametri che poi
+andranno a costituire gli argomenti a linea di comando (cioè i valori di
+\var{argv} e \var{argc} visti dalla funzione \func{main} del programma
+chiamato).
 
 Queste modalità sono due e sono riassunte dagli mnemonici \code{v} e \code{l}
 che stanno rispettivamente per \textit{vector} e \textit{list}. Nel primo caso
@@ -1182,7 +1193,7 @@ indicato dal parametro \var{path}, che viene interpretato come il
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=13cm]{img/exec_rel}
+  \includegraphics[width=15cm]{img/exec_rel}
   \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
   \label{fig:proc_exec_relat}
 \end{figure}
@@ -1202,9 +1213,9 @@ la lista completa 
   (\acr{ppid}).
 \item l'\textsl{userid reale}, il \textit{groupid reale} ed i \textsl{groupid
     supplementari} (vedi \secref{sec:proc_access_id}).
-\item il \textit{session id} ed il \textit{process groupid} (vedi
-  \secref{sec:sess_xxx}).
-\item il terminale di controllo (vedi \secref{sec:sess_xxx}).
+\item il \textit{session id} (\acr{sid}) ed il \textit{process groupid}
+  (\acr{pgid}), vedi \secref{sec:sess_proc_group}.
+\item il terminale di controllo (vedi \secref{sec:sess_ctrl_term}).
 \item il tempo restante ad un allarme (vedi \secref{sec:sig_alarm_abort}).
 \item la directory radice e la directory di lavoro corrente (vedi
   \secref{sec:file_work_dir}).
@@ -1285,8 +1296,12 @@ problematiche connesse ad una gestione accorta dei privilegi.
 Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
   realtà già esistono estensioni di questo modello base, che lo rendono più
   flessibile e controllabile, come le \textit{capabilities}, le ACL per i file
-  o il \textit{Mandatory Access Control} di SELinux.} di sicurezza di un
-sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
+  o il \textit{Mandatory Access Control} di SELinux; inoltre basandosi sul
+  lavoro effettuato con SELinux, a partire dal kernel 2.5.x, è iniziato lo
+  sviluppo di una infrastruttura di sicurezza, il \textit{Linux Security
+    Modules}, ol LSM, in grado di fornire diversi agganci a livello del kernel
+  per modularizzare tutti i possibili controlli di accesso.} di sicurezza di
+un sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
 separazione fra l'amministratore (\textsl{root}, detto spesso anche
 \textit{superuser}) che non è sottoposto a restrizioni, ed il resto degli
 utenti, per i quali invece vengono effettuati i vari controlli di accesso.
@@ -1741,8 +1756,8 @@ questa funzione 
   \param{size}.
   
   \bodydesc{La funzione restituisce il numero di gruppi letti in caso di
-    successo e -1 in caso di fallimento, nel qual caso \var{errno} viene
-    impostata a
+    successo e -1 in caso di fallimento, nel qual caso \var{errno} assumerà
+    i valori
     \begin{errlist}
     \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
     \item[\macro{EINVAL}] il valore di \param{size} è diverso da zero ma
@@ -1783,7 +1798,7 @@ delle due 
   supplementari del processo ai valori specificati in \param{list}.
 
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    fallimento, nel qual caso \var{errno} viene impostata a:
+    fallimento, nel qual caso \var{errno} assumerà i valori:
     \begin{errlist}
     \item[\macro{EFAULT}] \param{list} non ha un indirizzo valido.
     \item[\macro{EPERM}] il processo non ha i privilegi di amministratore.
@@ -1803,7 +1818,7 @@ un utente specifico, si pu
   aggiungendo il gruppo addizionale \param{group}.
   
   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
-    fallimento, nel qual caso \var{errno} viene impostata agli stessi valori di
+    fallimento, nel qual caso \var{errno} assumerà gli stessi valori di
     \func{setgroups} più \macro{ENOMEM} quando non c'è memoria sufficiente per
     allocare lo spazio per informazioni dei gruppi.}
 \end{functions}
@@ -1872,6 +1887,7 @@ sia la sua priorit
 fintanto che esso si trova in uno qualunque degli altri stati.
 
 \begin{table}[htb]
+  \footnotesize
   \centering
   \begin{tabular}[c]{|p{2.8cm}|c|p{10cm}|}
     \hline
@@ -2101,9 +2117,10 @@ priorit
 nel caso di Linux non si tratta di un vero hard real-time, in quanto in
 presenza di eventuali interrupt il kernel interrompe l'esecuzione di un
 processo qualsiasi sia la sua priorità,\footnote{questo a meno che non si
-  siano installate le patch di RTLinux o RTAI, con i quali è possibile
+  siano installate le patch di RTLinux, RTAI o Adeos, con i quali è possibile
   ottenere un sistema effettivamente hard real-time. In tal caso infatti gli
-  interrupt vengono intercettati dall'interfaccia real-time, e gestiti
+  interrupt vengono intercettati dall'interfaccia real-time (o nel caso di
+  Adeos gestiti dalle code del nano-kernel), in modo da poterlo controllare
   direttamente qualora ci sia la necessità di avere un processo con priorità
   più elevata di un \textit{interrupt handler}.} mentre con l'incorrere in un
 page fault\index{page fault} si possono avere ritardi non previsti. Se
@@ -2127,17 +2144,16 @@ eseguito per primo quello con priorit
 processi con la stessa priorità assoluta questi vengono tenuti in una coda
 tocca al kernel decidere quale deve essere eseguito. 
 
-
-
 Il meccanismo con cui vengono gestiti questi processi dipende dalla politica
 di scheduling che si è scelto; lo standard ne prevede due:
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{FIFO}] il processo viene eseguito fintanto che non cede
-  volontariamente la CPU, si blocca, finisce o viene interrotto da un processo
-  a priorità più alta.
-\item[\textit{Round Robin}] ciascun processo viene eseguito a turno per un
-  certo periodo di tempo (una \textit{time slice}). Solo i processi con la
-  stessa priorità ed in stato \textit{runnable} entrano nel circolo.
+\begin{basedescript}{\desclabelwidth{2cm}\desclabelstyle{\nextlinelabel}}
+\item[\textit{FIFO}] \textit{First In First Out}. Il processo viene eseguito
+  fintanto che non cede volontariamente la CPU, si blocca, finisce o viene
+  interrotto da un processo a priorità più alta.
+\item[\textit{RR}] \textit{Round Robin}. Ciascun processo viene eseguito a
+  turno per un certo periodo di tempo (una \textit{time slice}). Solo i
+  processi con la stessa priorità ed in stato \textit{runnable} entrano nel
+  circolo.
 \end{basedescript}
 
 La funzione per impostare le politiche di scheduling (sia real-time che
@@ -2426,9 +2442,9 @@ file, o nell'accesso a meccanismi di intercomunicazione come la memoria
 condivisa. In questi casi, se non si dispone della possibilità di eseguire
 atomicamente le operazioni necessarie, occorre che quelle parti di codice in
 cui si compiono le operazioni sulle risorse condivise (le cosiddette
-\textsl{sezioni critiche}) del programma, siano opportunamente protette da
-meccanismi di sincronizzazione (torneremo su queste problematiche di questo
-tipo in \secref{sec:ipc_semaph}).
+\textsl{sezioni critiche}\index{sezioni critiche}) del programma, siano
+opportunamente protette da meccanismi di sincronizzazione (torneremo su queste
+problematiche di questo tipo in \capref{cha:IPC}).
 
 Un caso particolare di \textit{race condition} sono poi i cosiddetti
 \textit{deadlock}, particolarmente gravi in quanto comportano spesso il blocco