b5a6ae14f0bde8edb9d3c5a76d0076b757e0283f
[gapil.git] / system.tex
1 \chapter{La gestione del sistema, delle risorse, e degli errori}
2 \label{cha:system}
3
4 In questo capitolo tratteremo varie interfacce che attengono agli aspetti più
5 generali del sistema, come quelle per la gestione di parametri e
6 configurazione, quelle per la lettura dei limiti e delle carattistiche dello
7 stesso, quelle per il controllo dell'uso delle risorse da parte dei processi,
8 quelle per la gestione dei tempi e degli errori.
9
10
11 \section{La configurazione del sistema}
12 \label{sec:sys_config}
13
14 In questa sezione esamineremo le macro e le funzioni che permettono di
15 conoscere e settare i parametri di configurazione del sistema, di ricavarme
16 limiti e caratteristiche, e di controllare i filesystem disponibili, montarli
17 e rimuoverli da programma.
18
19
20 \subsection{Limiti e parametri di sistema}
21 \label{sec:sys_sys_limits}
22
23 In qualunque sistema sono presenti un gran numero di parametri e costanti il
24 cui valore può essere definito dall'architettura dell'hardware,
25 dall'implementazione del sistema, dalle opzioni con cui si sono compilati il
26 kernel e le librerie o anche configurabili dall'amministratore all'avvio del
27 sistema o durente le sue attività.
28
29 Chiaramente per scrivere programmi portabili occorre poter determinare opzioni
30 disponibili e caratteristiche del sistema (come i valori massimi e minimi dei
31 vari tipi di variabili, o la presenza del supporto del supporto per
32 l'operazione che interessa). Inoltre alcuni di questi limiti devono poter
33 essere determinabili anche in corso di esecuzione del programma, per non dover
34 ricompilare tutti i programmi quando si usa una nuova versione del kernel o si
35 cambia una delle configurazioni del sistema. Per tutto questo sono necessari
36 due tipi di funzionalità:
37 \begin{itemize*}
38 \item la possibilità di determinare limiti ed opzioni al momento della
39   compilazione.
40 \item la possibilità di determinare limiti ed opzioni durante l'esecuzione.
41 \end{itemize*}
42
43 La prima funzionalità si può ottenere includendo gli opportuni header file,
44 mentre per la seconda sono ovviamante necessarie delle funzioni; ci sono molti
45 casi però in cui alcuni di questi limiti sono fissi in una implementazione
46 mentre possono variare in un altra.
47
48 Lo standard ANSI C definisce dei limiti solo sulle dimensioni dei tipi dei
49 dati, che sono ovviamente fissi, gli standard POSIX.1 e POSIX.2 ne definiscono
50 molti altri attinenti alle caratteristiche del sistema (come il numero massimo
51 di figli, la lunghezza di un pathname, ecc.) che possono essere fissi o meno:
52 quando sono fissi vengono definiti come macro nel file \file{limits.h}, se
53 invece possono variare la macro corrispondente deve essere indefinita, ed il
54 loro valore sarà ottenibile tramite la funzione \func{sysconf}, il cui
55 prototipo è:
56 \begin{prototype}{unistd.h}{long sysconf(int name)}  
57   Restituisce il valore del parametro di sistema \param{name}.
58   
59   \bodydesc{La funzione restituisce indietro il valore del parametro
60     richiesto, o 1 se si tratta di un'opzione disponibile, 0 se l'opzione non
61     è disponibile e -1 in caso di errore (ma \var{errno} non viene settata).}
62 \end{prototype}
63 \noindent ed i valori possibili disponibili in Linux per \param{name} sono
64 definiti in \ntab.
65
66 \begin{table}[htb]
67   \centering
68   \footnotesize
69     \begin{tabular}[c]{|l|l|p{9cm}|}
70       \hline
71       \textbf{Parametro}&\textbf{macro sostituita} &\textbf{Significato}\\
72       \hline
73       \hline
74       \texttt{\_SC\_ARG\_MAX} &\macro{ARG\_MAX}&
75               The  maximum  length of the arguments to the exec()
76               family of functions;  the  corresponding  macro  is
77               . \\
78        \texttt{\_SC\_CHILD\_MAX}&\macro{\_POSIX\_CHILD\_MAX}&
79               The  number  of simultaneous processes per user id,
80               the corresponding macro is .\\
81        \texttt{\_SC\_CLK\_TCK}& \macro{CLK\_TCK} &
82               The number of clock ticks per  second;  the  corre­
83               sponding macro is.\\
84        \texttt{\_SC\_STREAM\_MAX}& \macro{STREAM\_MAX}&
85               The  maximum  number  of streams that a process can
86               have open at any  time.    the corresponding standard C
87               macro is \macro{FOPEN\_MAX}.\\
88        \texttt{\_SC\_TZNAME\_MAX}&\macro{TZNAME\_MAX}&
89               The maximum number of bytes in a timezone name, the
90               corresponding macro is .\\
91        \texttt{\_SC\_OPEN\_MAX}&\macro{\_POSIX\_OPEN\_MAX}&
92               The maximum number of files that a process can have
93               open  at  any  time,  the  corresponding  macro  is
94               .\\
95        \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}&
96               This indicates whether POSIX - style job control is
97               supported,    the    corresponding     macro     is
98               .\\
99        \texttt{\_SC\_SAVED\_IDS}&\macro{\_POSIX\_SAVED\_IDS}&
100               This  indicates  whether a process has a saved set-
101               user-ID and a saved set-group-ID; the corresponding
102               macro is\\
103        \texttt{\_SC\_VERSION}& nessuna &
104               indicates  the  year and month the POSIX.1 standard
105               was  approved  in  the  format  YYYYMML;the   value
106               199009L indicates the most recent revision, 1990.\\
107      \hline
108     \end{tabular}
109   \caption{Parametri del sistema leggibili dalla funzione \func{sysconf}.}
110   \label{tab:sys_sysconf_par}
111 \end{table}
112
113
114
115 \subsection{Opzioni e configurazione del sistema}
116 \label{sec:sys_sys_config}
117
118 La funzione \func{sysctl} ...
119
120
121
122 \subsection{La configurazione dei filesystem}
123 \label{sec:sys_file_config}
124
125 La funzione \func{statfs} ...
126
127 La funzione \func{pathconf} ...
128
129
130
131
132 \section{Limitazione ed uso delle risorse}
133 \label{sec:sys_limits}
134
135 In questa sezione esamimeremo le funzioni che permettono di esaminare e
136 controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
137 utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
138 sul loro utilizzo.
139
140
141
142 \subsection{L'uso delle risorse}
143 \label{sec:sys_resource_use}
144
145
146 \subsection{Limiti sulle risorse}
147 \label{sec:sys_resource_limit}
148
149
150 \subsection{Le risorse di memoria}
151 \label{sec:sys_memory_res}
152
153
154 \subsection{Le risorse di processore}
155 \label{sec:sys_cpu_load}
156
157
158
159 \begin{figure}[!htb]
160   \footnotesize
161   \centering
162   \begin{minipage}[c]{15cm}
163     \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
164 struct rusage {
165      struct timeval ru_utime; /* user time used */
166      struct timeval ru_stime; /* system time used */
167      long ru_maxrss;          /* maximum resident set size */
168      long ru_ixrss;           /* integral shared memory size */
169      long ru_idrss;           /* integral unshared data size */
170      long ru_isrss;           /* integral unshared stack size */
171      long ru_minflt;          /* page reclaims */
172      long ru_majflt;          /* page faults */
173      long ru_nswap;           /* swaps */
174      long ru_inblock;         /* block input operations */
175      long ru_oublock;         /* block output operations */
176      long ru_msgsnd;          /* messages sent */
177      long ru_msgrcv;          /* messages received */
178      long ru_nsignals;   ;    /* signals received */
179      long ru_nvcsw;           /* voluntary context switches */
180      long ru_nivcsw;          /* involuntary context switches */
181 };
182     \end{lstlisting}
183   \end{minipage} 
184   \normalsize 
185   \caption{La struttura \var{rusage} per la lettura delle informazioni dei 
186     delle risorse usate da un processo.}
187   \label{fig:sys_rusage_struct}
188 \end{figure}
189
190
191
192
193 \var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_uetime}
194
195
196
197 \section{La gestione dei tempi del sistema}
198 \label{sec:sys_time}
199
200 In questa sezione tratteremo le varie funzioni per la gestione delle
201 date e del tempo in un sistema unix-like, e quelle per convertire i vari
202 tempi nelle differenti rappresentazioni che vengono utilizzate.
203
204
205 \subsection{La misura del tempo in unix}
206 \label{sec:sys_unix_time}
207
208 Storicamente i sistemi unix-like hanno sempre mantenuto due distinti
209 valori per i tempi all'interno del sistema, essi sono rispettivamente
210 chiamati \textit{calendar time} e \textit{process time}, secondo le
211 definizioni:
212 \begin{itemize}
213 \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del
214   primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
215   usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
216     Epoch}. Questo tempo viene anche chiamato anche GMT (Greenwich Mean Time)
217   dato che l'UTC corrisponde all'ora locale di Greenwich.  È il tempo su cui
218   viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per
219   indicare le date di modifica dei file o quelle di avvio dei processi. Per
220   memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}.
221 \item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato
222   in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate
223   dal timer di sistema, e che per Linux avvengono ogni centesimo di
224   secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni
225     millesimo di secondo}. Il dato primitivo usato per questo tempo è
226   \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di
227   operazione del timer, e corrisponde dunque al numero di tick al secondo.  Lo
228   standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK});
229   questo valore può comunque essere ottenuto con \func{sysconf} (vedi
230   \secref{sec:sys_limits}).
231 \end{itemize}
232
233 In genere si usa il \textit{calendar time} per tenere le date dei file e le
234 informazioni analoghe che riguardano i tempi di ``orologio'', usati ad esempio
235 per i demoni che compiono lavori amministrativi ad ore definite, come
236 \cmd{cron}. Di solito questo vene convertito automaticamente dal valore in UTC
237 al tempo locale, utilizzando le opportune informazioni di localizzazione
238 (specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
239 mantenuto dal sistema e non corrisponde all'orologio hardware del calcolatore.
240
241 Il \textit{process time} di solito si esprime in secondi e viene usato appunto
242 per tenere conto dei tempi di esecuzione dei processi. Per ciascun processo il
243 kernel tiene tre di questi tempi: 
244 \begin{itemize*}
245 \item \textit{clock time}
246 \item \textit{user time}
247 \item \textit{system time}
248 \end{itemize*}
249 il primo è il tempo ``reale'' (viene anche chiamato \textit{wall clock time})
250 dall'avvio del processo, e misura il tempo trascorso fino alla sua
251 conclusione; chiaramente un tale tempo dipende anche dal carico del sistema e
252 da quanti altri processi stavano girando nello stesso periodo. Il secondo
253 tempo è quello che la CPU ha speso nell'esecuzione delle istruzioni del
254 processo in user space. Il terzo è il tempo impiegato dal kernel per eseguire
255 delle system call per conto del processo medesimo (tipo quello usato per
256 eseguire una \func{write} su un file). In genere la somma di user e system
257 time viene chiamato \textit{CPU time}. 
258
259
260
261
262
263 \section{La gestione degli errori}
264 \label{sec:sys_errors}
265
266 La gestione degli errori è in genere una materia complessa. Inoltre il modello
267 utilizzato dai sistema unix-like è basato sull'architettura a processi, e
268 presenta una serie di problemi nel caso lo si debba usare con i thread.
269 Esamineremo in questa sezione le sue caratteristiche principali.
270
271
272 \subsection{La variabile \var{errno}}
273 \label{sec:sys_errno}
274
275 Quasi tutte le funzioni delle librerie del C sono in grado di individuare e
276 riportare condizioni di errore, ed è una buona norma di programmazione
277 controllare sempre che le funzioni chiamate si siano concluse correttamente.
278
279 In genere le funzioni di libreria usano un valore speciale per indicare che
280 c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la
281 costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo
282 che c'è stato un errore, non il tipo di errore. 
283
284 Per riportare il tipo di errore il sistema usa la variabile globale
285 \var{errno}\footnote{L'uso di una variabile globale può comportare alcuni
286   problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente
287   anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si
288   può anche usare una macro, e questo è infatti il modo usato da Linux per
289   renderla locale ai singoli thread.}, definita nell'header \file{errno.h}; la
290 variabile è in genere definita come \type{volatile} dato che può essere
291 cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
292 veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
293 bene salva e ripristina il valore della variabile, di questo non è necessario
294 preoccuparsi nella programmazione normale.
295
296 I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
297 nell'header \file{errno.h} sono anche definiti i nomi simbolici per le
298 costanti numeriche che identificano i vari errori; essi iniziano tutti per
299 \macro{E} e si possono considerare come nomi riservati. In seguito faremo
300 sempre rifermento a tali valori, quando descriveremo i possibili errori
301 restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il
302 codice relativo ad un valore numerico con l'opzione \cmd{-l}.
303
304 Il valore di \var{errno} viene sempre settato a zero all'avvio di un
305 programma, gran parte delle funzioni di libreria settano \var{errno} ad un
306 valore diverso da zero in caso di errore. Il valore è invece indefinito in
307 caso di successo, perché anche se una funzione ha successo, può chiamarne
308 altre al suo interno che falliscono, modificando così \var{errno}.
309
310 Pertanto un valore non nullo di \var{errno} non è sintomo di errore (potrebbe
311 essere il risultato di un errore precedente) e non lo si può usare per
312 determinare quando o se una chiamata a funzione è fallita.  La procedura da
313 seguire è sempre quella di controllare \var{errno} immediatamente dopo aver
314 verificato il fallimento della funzione attraverso il suo codice di ritorno.
315
316
317 \subsection{Le funzioni \func{strerror} e \func{perror}}
318 \label{sec:sys_strerror}
319
320 Benché gli errori siano identificati univocamente dal valore numerico di
321 \var{errno} le librerie provvedono alcune funzioni e variabili utili per
322 riportare in opportuni messaggi le condizioni di errore verificatesi.  La
323 prima funzione che si può usare per ricavare i messaggi di errore è
324 \func{strerror}, il cui prototipo è:
325 \begin{prototype}{string.h}{char * strerror(int errnum)} 
326   Ritorna una stringa (statica) che descrive l'errore il cui codice è passato
327   come parametro.
328 \end{prototype}
329
330 In generale \func{strerror} viene usata passando \var{errno} come parametro;
331 nel caso si specifichi un codice sbagliato verrà restituito un messaggio di
332 errore sconosciuto. La funzione utilizza una stringa statica che non deve
333 essere modificata dal programma e che è utilizzabile solo fino ad una chiamata
334 successiva a \func{strerror}; nel caso si usino i thread è
335 provvista\footnote{questa funzione è una estensione GNU, non fa parte dello
336   standard POSIX} una versione apposita:
337 \begin{prototype}{string.h}
338 {char * strerror\_r(int errnum, char * buff, size\_t size)} 
339   Analoga a \func{strerror} ma ritorna il messaggio in un buffer
340   specificato da \param{buff} di lunghezza massima (compreso il terminatore)
341   \param{size}.
342 \end{prototype}
343 \noindent
344 che utilizza un buffer che il singolo thread deve allocare, per evitare i
345 problemi connessi alla condivisione del buffer statico. Infine, per completare
346 la caratterizzazione dell'errore, si può usare anche la variabile
347 globale\footnote{anche questa è una estensione GNU}
348 \var{program\_invocation\_short\_name} che riporta il nome del programma
349 attualmente in esecuzione.
350
351 Una seconda funzione usata per riportare i codici di errore in maniera
352 automatizzata sullo standard error (vedi \secref{sec:file_std_descr}) è
353 \func{perror}, il cui prototipo è:
354 \begin{prototype}{stdio.h}{void perror (const char *message)} 
355   Stampa il messaggio di errore relativo al valore corrente di \var{errno}
356   sullo standard error; preceduto dalla stringa \var{message}.
357 \end{prototype}
358 i messaggi di errore stampati sono gli stessi di \func{strerror}, (riportati
359 in \capref{cha:errors}), e, usando il valore corrente di \var{errno}, si
360 riferiscono all'ultimo errore avvenuto. La stringa specificata con
361 \var{message} viene stampato prime del messaggio d'errore, seguita dai due
362 punti e da uno spazio, il messaggio è terminato con un a capo.
363
364 Il messaggio può essere riportato anche usando altre variabili globali
365 dichiarate in \file{errno.h}:
366 \begin{verbatim}
367    const char *sys_errlist[];
368    int sys_nerr;
369 \end{verbatim}
370 la prima contiene i puntatori alle stringhe di errore indicizzati da
371 \var{errno}; la seconda esprime il valore più alto per un codice di errore,
372 l'utilizzo di questa stringa è sostanzialmente equivalente a quello di
373 \func{strerror}.
374
375 In \nfig\ è riportata la sezione attinente del codice del programma
376 \cmd{errcode}, che può essere usato per stampare i messaggi di errore e le
377 costanti usate per identificare i singoli errori; il sorgente completo del
378 programma è allegato nel file \file{ErrCode.c} e contiene pure la gestione
379 delle opzioni e tutte le definizioni necessarie ad associare il valore
380 numerico alla costante simbolica. In particolare si è riportata la sezione che
381 converte la stringa passata come parametro in un intero (\texttt{\small
382   1--2}), controllando con i valori di ritorno di \func{strtol} che la
383 conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi stampa,
384 a seconda dell'opzione scelta il messaggio di errore (\texttt{\small 11--14})
385 o la macro (\texttt{\small 15--17}) associate a quel codice.
386
387 \begin{figure}[!htb]
388   \footnotesize
389   \begin{lstlisting}{}
390     /* convert string to number */
391     err = strtol(argv[optind], NULL, 10);
392     /* testing error condition on conversion */
393     if (err==LONG_MIN) {
394         perror("Underflow on error code");
395         return 1;
396     } else if (err==LONG_MIN) {
397         perror("Overflow on error code");
398         return 1;
399     }
400     /* conversion is fine */
401     if (message) {
402         printf("Error message for %d is %s\n", err, strerror(err));
403     }
404     if (label) {
405         printf("Error label for %d is %s\n", err, err_code[err]);
406     }
407   \end{lstlisting}
408   \caption{Codice per la stampa del messaggio di errore standard.}
409   \label{fig:sys_err_mess}
410 \end{figure}
411
412
413 \section{La gestione di utenti e gruppi}
414 \label{sec:sys_user_group}
415
416
417 %%% Local Variables: 
418 %%% mode: latex
419 %%% TeX-master: "gapil"
420 %%% End: