Prime modifiche peri tempi.
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 15 Apr 2012 13:28:15 +0000 (13:28 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 15 Apr 2012 13:28:15 +0000 (13:28 +0000)
system.tex

index 313aceb9d83dabc013867276f8214210b95dc32a..40d487467f6e02bb33eee414284b76cbb891cc39 100644 (file)
@@ -1866,7 +1866,7 @@ a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti.
 
 
 
-\subsection{Le risorse di memoria e processore}
+\subsection{Le informazioni sulle risorse di memoria e processore}
 \label{sec:sys_memory_res}
 
 La gestione della memoria è già stata affrontata in dettaglio in
@@ -1886,14 +1886,17 @@ costante che bastava utilizzare in fase di compilazione. Oggi invece molte
 architetture permettono di variare questa dimensione (ad esempio sui PC
 recenti si possono usare pagine di 4kb e di 4 Mb) per cui per non dover
 ricompilare i programmi per ogni possibile caso e relativa scelta di
-dimensioni, è necessario poter utilizzare una funzione.
-
-Dato che si tratta di una caratteristica generale del sistema, questa
-dimensione può essere ottenuta come tutte le altre attraverso una chiamata a
-\func{sysconf} (nel caso specifico si dovrebbe utilizzare il parametro
-\const{\_SC\_PAGESIZE}) ma in BSD 4.2 è stata introdotta una apposita funzione
-di sistema \funcd{getpagesize} che restituisce la dimensione delle pagine di
-memoria. La funzione è disponibile anche su Linux ed il suo prototipo è:
+dimensioni, è necessario poter utilizzare una funzione che restituisca questi
+valori quando il programma viene eseguito.
+
+Dato che si tratta di una caratteristica general del sistemae come abbiamo
+visto in sez.~\ref{sec:sys_characteristics} questa dimensione può essere
+ottenuta come tutte le altre attraverso una chiamata a \func{sysconf}, nel
+caso specifico si dovrebbe utilizzare il parametro \const{\_SC\_PAGESIZE}. Ma
+in BSD 4.2 è stata introdotta una apposita funzione di sistema
+\funcd{getpagesize} che restituisce la dimensione delle pagine di memoria. La
+funzione è disponibile anche su Linux (ma richiede che sia definita la macro
+\macro{\_BSD\_SOURCE}) ed il suo prototipo è:
 
 \begin{funcproto}{
 \fhead{unistd.h}
@@ -1905,41 +1908,34 @@ memoria. La funzione è disponibile anche su Linux ed il suo prototipo è:
   errori.}
 \end{funcproto}
 
-
-\begin{prototype}{unistd.h}
-{int getpagesize(void)}
-  Legge le dimensioni delle pagine di memoria.
-  
-  \bodydesc{La funzione ritorna la dimensione di una pagina in byte, e non
-    sono previsti errori.}
-\end{prototype}
-
 La funzione è prevista in SVr4, BSD 4.4 e SUSv2, anche se questo ultimo
 standard la etichetta come obsoleta, mentre lo standard POSIX 1003.1-2001 la
-ha eliminata. In Linux è implementata come una \textit{system call} nelle
-architetture in cui essa è necessaria, ed in genere restituisce il valore del
-simbolo \const{PAGE\_SIZE} del kernel, che dipende dalla architettura
-hardware, anche se le versioni delle librerie del C precedenti le \acr{glibc}
-2.1 implementavano questa funzione restituendo sempre un valore statico.
+ha eliminata, ed i programmi che intendono essere portabili devono ricorrere
+alla chiamata a \func{sysconf}. 
+
+In Linux è implementata come una \textit{system call} nelle architetture in
+cui essa è necessaria, ed in genere restituisce il valore del simbolo
+\const{PAGE\_SIZE} del kernel, che dipende dalla architettura hardware, anche
+se le versioni delle librerie del C precedenti le \acr{glibc} 2.1
+implementavano questa funzione restituendo sempre un valore statico.
 
 % TODO verificare meglio la faccenda di const{PAGE\_SIZE} 
 
 Le \textsl{glibc} forniscono, come specifica estensione GNU, altre due
 funzioni, \funcd{get\_phys\_pages} e \funcd{get\_avphys\_pages} che permettono
-di ottenere informazioni riguardo la memoria; i loro prototipi sono:
-\begin{functions}
-  \headdecl{sys/sysinfo.h} 
-  
-  \funcdecl{long int get\_phys\_pages(void)} 
+di ottenere informazioni riguardo le pagine di memoria; i loro prototipi sono:
 
-  Legge il numero totale di pagine di memoria disponibili per il sistema.
-  
-  \funcdecl{long int get\_avphys\_pages(void)} 
-  
-  Legge il numero di pagine di memoria disponibili nel sistema. 
-  
-  \bodydesc{Le funzioni restituiscono un numero di pagine.}
-\end{functions}
+\begin{funcproto}{
+\fhead{sys/sysinfo.h} 
+\fdecl{long int get\_phys\_pages(void)}
+\fdesc{Legge il numero totale di pagine di memoria.} 
+\fdecl{long int get\_avphys\_pages(void)} 
+\fdesc{Legge il numero di pagine di memoria disponibili nel sistema.} 
+}
+
+{La funzioni ritornano il numero di pagine, e non sono previsti
+  errori.}  
+\end{funcproto}
 
 Queste funzioni sono equivalenti all'uso della funzione \func{sysconf}
 rispettivamente con i parametri \const{\_SC\_PHYS\_PAGES} e
@@ -1957,12 +1953,16 @@ Infine le \acr{glibc} riprendono da BSD la funzione \funcd{getloadavg} che
 permette di ottenere il carico di processore della macchina, in questo modo è
 possibile prendere decisioni su quando far partire eventuali nuovi processi.
 Il suo prototipo è:
-\begin{prototype}{stdlib.h}{int getloadavg(double loadavg[], int nelem)}
-  Legge il carico medio della macchina.
-  
-  \bodydesc{La funzione ritorna il numero di elementi scritti o -1 in caso di
-    errore.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{stdlib.h}
+\fdecl{int getloadavg(double loadavg[], int nelem)}
+\fdesc{Legge il carico medio della macchina.} 
+}
+
+{La funzione ritorna il numero di campionamenti restituiti e $-1$ se non
+  riesce ad ottenere il carico medio, \var{errno} non viene modificata.}
+\end{funcproto}
 
 La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
 di processi attivi sulla coda dello \itindex{scheduler} scheduler, calcolato
@@ -1987,12 +1987,16 @@ che viene terminato.
 Linux consente di salvare la contabilità delle informazioni relative alle
 risorse utilizzate dai processi grazie alla funzione \funcd{acct}, il cui
 prototipo è:
-\begin{prototype}{unistd.h}{int acct(const char *filename)}
-  Abilita il \textit{BSD accounting}.
-  
-  \bodydesc{La funzione ritorna 0 in caso di successo o $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei valori:
-    \begin{errlist}
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int acct(const char *filename)}
+\fdesc{Abilita il \textit{BSD accounting}.} 
+}
+
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
+  \begin{errlist}
     \item[\errcode{EACCES}] non si hanno i permessi per accedere a
       \param{pathname}.
     \item[\errcode{EPERM}] il processo non ha privilegi sufficienti ad
@@ -2003,8 +2007,8 @@ prototipo è:
     \end{errlist}
     ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
     \errval{ENAMETOOLONG}, \errval{ENFILE}, \errval{ENOENT}, \errval{ENOMEM},
-    \errval{ENOTDIR}, \errval{EROFS}.}
-\end{prototype}
+    \errval{ENOTDIR}, \errval{EROFS} nel loro significato generico.}
+\end{funcproto}
 
 La funzione attiva il salvataggio dei dati sul file indicato dal
 \textit{pathname} contenuti nella stringa puntata da \param{filename}; la
@@ -2016,21 +2020,24 @@ semplice esempio per l'uso di questa funzione è riportato nel programma
 \texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
 
 Quando si attiva la contabilità, il file che si indica deve esistere; esso
-verrà aperto in sola scrittura; le informazioni verranno registrate in
+verrà aperto in sola scrittura e le informazioni verranno registrate in
 \itindex{append~mode} \textit{append} in coda al file tutte le volte che un
 processo termina. Le informazioni vengono salvate in formato binario, e
 corrispondono al contenuto della apposita struttura dati definita all'interno
 del kernel.
 
 Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
-parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct}
-(o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi,
-il primo indica la percentuale di spazio disco libero sopra il quale viene
+parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct} (o
+tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi, il
+primo indica la percentuale di spazio disco libero sopra il quale viene
 ripresa una registrazione che era stata sospesa per essere scesi sotto il
 minimo indicato dal secondo valore (sempre in percentuale di spazio disco
 libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
 essere controllata detta percentuale.
 
+% TODO: bassa priorità, trattare la lettura del file di accounting, da
+% programma, vedi man 5 acct
+
 
 \section{La gestione dei tempi del sistema}
 \label{sec:sys_time}
@@ -2134,12 +2141,17 @@ di una operazione di I/O.
 La funzione più semplice per leggere il \textit{process time} di un processo è
 \funcd{clock}, che da una valutazione approssimativa del tempo di CPU
 utilizzato dallo stesso; il suo prototipo è:
-\begin{prototype}{time.h}{clock\_t clock(void)}
-  Legge il valore corrente del tempo di CPU.
-  
-  \bodydesc{La funzione ritorna il tempo di CPU usato dal programma e -1 in
-    caso di errore.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{clock\_t clock(void)}
+\fdesc{Legge il valore corrente del tempo di CPU.} 
+}
+
+{La funzione ritorna il tempo di CPU in caso di successo e $-1$ se questo non
+  è ottenibile o rappresentabile in un valore di tipo \type{clock\_t},
+  \var{errno} non viene usata.}  
+\end{funcproto}
 
 La funzione restituisce il tempo in \itindex{clock~tick} \texttt{clock tick},
 quindi se si vuole il tempo in secondi occorre dividere il risultato per la
@@ -2156,13 +2168,20 @@ Come accennato in sez.~\ref{sec:sys_unix_time} il tempo di CPU è la somma di
 altri due tempi, l'\textit{user time} ed il \textit{system time} che sono
 quelli effettivamente mantenuti dal kernel per ciascun processo. Questi
 possono essere letti attraverso la funzione \funcd{times}, il cui prototipo è:
-\begin{prototype}{sys/times.h}{clock\_t times(struct tms *buf)}
-  Legge in \param{buf} il valore corrente dei tempi di processore.
-  
-  \bodydesc{La funzione ritorna il numero di \itindex{clock~tick}
-    \textit{clock tick} dall'avvio del sistema in caso di successo e -1 in
-    caso di errore.}
-\end{prototype}
+
+\begin{funcproto}{
+\fhead{sys/times.h
+\fdecl{clock\_t times(struct tms *buf)}
+\fdesc{Legge il valore corrente dei tempi di processore.} 
+}
+
+{La funzione ritorna il numero di \textit{clock ticks} in caso di successo e
+  $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \end{errlist}
+  ed inoltre 
+nel loro significato generico.}  
+\end{funcproto} 
 
 La funzione restituisce i valori di \textit{process time} del processo
 corrente in una struttura di tipo \struct{tms}, la cui definizione è riportata