From 897cce4642115b8d50f173b51c45c1f32851c77b Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 15 Apr 2012 13:28:15 +0000 Subject: [PATCH] Prime modifiche peri tempi. --- system.tex | 153 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 67 deletions(-) diff --git a/system.tex b/system.tex index 313aceb..40d4874 100644 --- a/system.tex +++ b/system.tex @@ -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 -- 2.30.2