Continua la conversione delle figure con i listati
[gapil.git] / prochand.tex
index 97eeb50e4e061a3021c1a5359b6c54a750fd832f..d38c843b8c52e2ca132a68b088ca2991c7efca67 100644 (file)
@@ -126,13 +126,14 @@ struttura, alla cui base c'
 processi.
 
 Il kernel mantiene una tabella dei processi attivi, la cosiddetta
 processi.
 
 Il kernel mantiene una tabella dei processi attivi, la cosiddetta
-\textit{process table}; per ciascun processo viene mantenuta una voce nella
-tabella dei processi costituita da una struttura \struct{task\_struct}, che
-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 \struct{task\_struct} (che in seguito incontreremo a più
-riprese), è mostrato in \figref{fig:proc_task_struct}.
+\textit{process table}; per ciascun processo viene mantenuta una voce,
+costituita da una struttura \struct{task\_struct}, nella tabella dei processi
+che 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 \struct{task\_struct} (che in
+seguito incontreremo a più riprese), è mostrato in
+\figref{fig:proc_task_struct}.
 
 \begin{figure}[htb]
   \centering
 
 \begin{figure}[htb]
   \centering
@@ -263,7 +264,7 @@ prototipi sono:
 \bodydesc{Entrambe le funzioni non riportano condizioni di errore.}
 \end{functions}
 \noindent esempi dell'uso di queste funzioni sono riportati in
 \bodydesc{Entrambe le funzioni non riportano condizioni di errore.}
 \end{functions}
 \noindent esempi dell'uso di queste funzioni sono riportati in
-\figref{fig:proc_fork_code}, nel programma di esempio \file{ForkTest.c}.
+\figref{fig:proc_fork_code}, nel programma \file{ForkTest.c}.
 
 Il fatto che il \acr{pid} sia un numero univoco per il sistema lo rende un
 candidato per generare ulteriori indicatori associati al processo di cui
 
 Il fatto che il \acr{pid} sia un numero univoco per il sistema lo rende un
 candidato per generare ulteriori indicatori associati al processo di cui
@@ -349,53 +350,11 @@ sempre un solo padre (il cui \acr{pid} pu
 che non è il \acr{pid} di nessun processo.
 
 \begin{figure}[!htb]
 che non è il \acr{pid} di nessun processo.
 
 \begin{figure}[!htb]
-  \footnotesize
-  \begin{lstlisting}{}
-#include <errno.h>       /* error definitions and routines */ 
-#include <stdlib.h>      /* C standard library */
-#include <unistd.h>      /* unix standard library */
-#include <stdio.h>       /* standard I/O library */
-#include <string.h>      /* string functions */
-
-/* Help printing routine */
-void usage(void);
-
-int main(int argc, char *argv[])
-{
-/* 
- * Variables definition  
- */
-    int nchild, i;
-    pid_t pid;
-    int wait_child  = 0;
-    int wait_parent = 0;
-    int wait_end    = 0;
-    ...        /* handling options */
-    nchild = atoi(argv[optind]);
-    printf("Test for forking %d child\n", nchild);
-    /* loop to fork children */
-    for (i=0; i<nchild; i++) {
-        if ( (pid = fork()) < 0) { 
-            /* on error exit */ 
-            printf("Error on %d child creation, %s\n", i+1, strerror(errno));
-            exit(-1); 
-        }
-        if (pid == 0) {   /* child */
-            printf("Child %d successfully executing\n", ++i);
-            if (wait_child) sleep(wait_child);
-            printf("Child %d, parent %d, exiting\n", i, getppid());
-            exit(0);
-        } else {          /* parent */
-            printf("Spawned %d child, pid %d \n", i+1, pid);
-            if (wait_parent) sleep(wait_parent);
-            printf("Go to next child \n");
-        }
-    }
-    /* normal exit */
-    if (wait_end) sleep(wait_end);
-    return 0;
-}
-  \end{lstlisting}
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+  \includecodesample{listati/ForkTest.c}
+  \end{minipage}
+  \normalsize
   \caption{Esempio di codice per la creazione di nuovi processi.}
   \label{fig:proc_fork_code}
 \end{figure}
   \caption{Esempio di codice per la creazione di nuovi processi.}
   \label{fig:proc_fork_code}
 \end{figure}
@@ -1010,9 +969,7 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a
     \val{WIFSIGNALED} ha restituito un valore non nullo.\\
     \macro{WCOREDUMP(s)}   & Vera se il processo terminato ha generato un
     file si \textit{core dump}. Può essere valutata solo se
     \val{WIFSIGNALED} ha restituito un valore non nullo.\\
     \macro{WCOREDUMP(s)}   & Vera se il processo terminato ha generato un
     file si \textit{core dump}. Può essere valutata solo se
-    \val{WIFSIGNALED} ha restituito un valore non nullo.\footnote{questa
-    macro non è definita dallo standard POSIX.1, ma è presente come estensione
-    sia in Linux che in altri Unix.}\\
+    \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\
     \macro{WIFSTOPPED(s)}  & Vera se il processo che ha causato il ritorno di
     \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato
     l'opzione \const{WUNTRACED}. \\
     \macro{WIFSTOPPED(s)}  & Vera se il processo che ha causato il ritorno di
     \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato
     l'opzione \const{WUNTRACED}. \\
@@ -1026,6 +983,9 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a
   \label{tab:proc_status_macro}
 \end{table}
 
   \label{tab:proc_status_macro}
 \end{table}
 
+\footnotetext{questa macro non è definita dallo standard POSIX.1, ma è
+    presente come estensione sia in Linux che in altri Unix.}
+
 Entrambe le funzioni di attesa restituiscono lo stato di terminazione del
 processo tramite il puntatore \param{status} (se non interessa memorizzare lo
 stato si può passare un puntatore nullo). Il valore restituito da entrambe le
 Entrambe le funzioni di attesa restituiscono lo stato di terminazione del
 processo tramite il puntatore \param{status} (se non interessa memorizzare lo
 stato si può passare un puntatore nullo). Il valore restituito da entrambe le
@@ -1170,9 +1130,7 @@ questo vettore \emph{deve} essere terminato da un puntatore nullo.
 
 Nel secondo caso le stringhe degli argomenti sono passate alla funzione come
 lista di puntatori, nella forma:
 
 Nel secondo caso le stringhe degli argomenti sono passate alla funzione come
 lista di puntatori, nella forma:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-  char *arg0, char *arg1,  ..., char *argn, NULL
-\end{lstlisting}
+\includecodesnip{listati/char_list.c}
 che deve essere terminata da un puntatore nullo.  In entrambi i casi vale la
 convenzione che il primo argomento (\var{arg0} o \var{argv[0]}) viene usato
 per indicare il nome del file che contiene il programma che verrà eseguito.
 che deve essere terminata da un puntatore nullo.  In entrambi i casi vale la
 convenzione che il primo argomento (\var{arg0} o \var{argv[0]}) viene usato
 per indicare il nome del file che contiene il programma che verrà eseguito.
@@ -2041,13 +1999,13 @@ che viene assegnato ad un altro campo della struttura (\var{counter}) quando
 il processo viene eseguito per la prima volta e diminuito progressivamente ad
 ogni interruzione del timer.
 
 il processo viene eseguito per la prima volta e diminuito progressivamente ad
 ogni interruzione del timer.
 
-Quando lo scheduler\index{scheduler} viene eseguito scandisce la coda dei
-processi in stato \textit{runnable} associando, sulla base del valore di
-\var{counter}, un peso a ciascun processo in attesa di esecuzione,\footnote{il
+Durante la sua esecuzione lo scheduler\index{scheduler} scandisce la coda dei
+processi in stato \textit{runnable} associando, in base al valore di
+\var{counter}, un peso ad ogni processo in attesa di esecuzione,\footnote{il
   calcolo del peso in realtà è un po' più complicato, ad esempio nei sistemi
   calcolo del peso in realtà è un po' più complicato, ad esempio nei sistemi
-  multiprocessore viene favorito un processo che è eseguito sulla stessa CPU,
-  e a parità del valore di \var{counter} viene favorito chi ha una priorità
-  più elevata.} chi ha il peso più alto verrà posto in esecuzione, ed il
+  multiprocessore viene favorito un processo eseguito sulla stessa CPU, e a
+  parità del valore di \var{counter} viene favorito chi ha una priorità più
+  elevata.} chi ha il peso più alto verrà posto in esecuzione, ed il
 precedente processo sarà spostato in fondo alla coda.  Dato che ad ogni
 interruzione del timer il valore di \var{counter} del processo corrente viene
 diminuito, questo assicura che anche i processi con priorità più bassa
 precedente processo sarà spostato in fondo alla coda.  Dato che ad ogni
 interruzione del timer il valore di \var{counter} del processo corrente viene
 diminuito, questo assicura che anche i processi con priorità più bassa
@@ -2100,15 +2058,15 @@ Restituisce il valore di \var{nice} per l'insieme dei processi specificati.
   \item[\errcode{EINVAL}] il valore di \param{which} non è valido.
   \end{errlist}}
 \end{prototype}
   \item[\errcode{EINVAL}] il valore di \param{which} non è valido.
   \end{errlist}}
 \end{prototype}
-\noindent (in vecchie versioni può essere necessario includere anche
+\noindent nelle vecchie versioni può essere necessario includere anche
 \file{<sys/time.h>}, questo non è più necessario con versioni recenti delle
 \file{<sys/time.h>}, questo non è più necessario con versioni recenti delle
-librerie, ma è comunque utile per portabilità).
+librerie, ma è comunque utile per portabilità.
 
 
-La funzione permette di leggere la priorità di un processo, di un gruppo di
-processi (vedi \secref{sec:sess_proc_group}) o di un utente, a seconda del
-valore di \param{which}, secondo la legenda di \tabref{tab:proc_getpriority},
-specificando un corrispondente valore per \param{who}; un valore nullo di
-quest'ultimo indica il processo, il gruppo di processi o l'utente correnti.
+La funzione permette, a seconda del valore di \param{which}, di leggere la
+priorità di un processo, di un gruppo di processi (vedi
+\secref{sec:sess_proc_group}) o di un utente, specificando un corrispondente
+valore per \param{who}; un valore nullo di quest'ultimo indica il processo, il
+gruppo di processi o l'utente correnti.
 
 \begin{table}[htb]
   \centering
 
 \begin{table}[htb]
   \centering
@@ -2176,7 +2134,7 @@ processo qualsiasi sia la sua priorit
   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 (o nel caso di
   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 (o nel caso di
-  Adeos gestiti dalle code del nano-kernel), in modo da poterlo controllare
+  Adeos gestiti dalle code del nano-kernel), in modo da poterli 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
   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
@@ -2185,24 +2143,23 @@ controllo della memoria virtuale (vedi \secref{sec:proc_mem_lock}), il primo
 non è superabile e può comportare ritardi non prevedibili riguardo ai tempi di
 esecuzione di qualunque processo.
 
 non è superabile e può comportare ritardi non prevedibili riguardo ai tempi di
 esecuzione di qualunque processo.
 
-In ogni caso occorre usare le priorità assolute con molta attenzione: se si dà
-ad un processo una priorità assoluta e questo finisce in un loop infinito,
-nessun altro processo potrà essere eseguito, ed esso sarà mantenuto in
-esecuzione permanentemente assorbendo tutta la CPU e senza nessuna possibilità
-di riottenere l'accesso al sistema. Per questo motivo è sempre opportuno,
-quando si lavora con processi che usano priorità assolute, tenere attiva una
-shell cui si sia assegnata la massima priorità assoluta, in modo da poter
-essere comunque in grado di rientrare nel sistema.
+Occorre usare le priorità assolute con molta attenzione: se si dà ad un
+processo una priorità assoluta e questo finisce in un loop infinito, nessun
+altro processo potrà essere eseguito, ed esso sarà mantenuto in esecuzione
+permanentemente assorbendo tutta la CPU e senza nessuna possibilità di
+riottenere l'accesso al sistema. Per questo motivo è sempre opportuno, quando
+si lavora con processi che usano priorità assolute, tenere attiva una shell
+cui si sia assegnata la massima priorità assoluta, in modo da poter essere
+comunque in grado di rientrare nel sistema.
 
 Quando c'è un processo con priorità assoluta lo scheduler\index{scheduler} lo
 metterà in esecuzione prima di ogni processo normale. In caso di più processi
 sarà eseguito per primo quello con priorità assoluta più alta. Quando ci sono
 più processi con la stessa priorità assoluta questi vengono tenuti in una coda
 e tocca al kernel decidere quale deve essere eseguito.
 
 Quando c'è un processo con priorità assoluta lo scheduler\index{scheduler} lo
 metterà in esecuzione prima di ogni processo normale. In caso di più processi
 sarà eseguito per primo quello con priorità assoluta più alta. Quando ci sono
 più processi con la stessa priorità assoluta questi vengono tenuti in una coda
 e 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:
 Il meccanismo con cui vengono gestiti questi processi dipende dalla politica
 di scheduling che si è scelto; lo standard ne prevede due:
-\begin{basedescript}{\desclabelwidth{2cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.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{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.
@@ -2268,11 +2225,7 @@ zero 
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
-struct sched_param {
-    int sched_priority;
-};
-    \end{lstlisting}
+    \includestruct{listati/sched_param.c}
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{sched\_param}.} 
   \end{minipage} 
   \normalsize 
   \caption{La struttura \structd{sched\_param}.}