Poche cose sui timer
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 26 May 2012 23:33:48 +0000 (23:33 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 26 May 2012 23:33:48 +0000 (23:33 +0000)
signal.tex
system.tex

index 7af26cfd12520ec5fd30acc061098c0a32880872..d1a744ad981da31aa5d374e82b542fb9d3247817 100644 (file)
@@ -1469,7 +1469,7 @@ in cui un timer scade prima che il segnale di una precedente scadenza sia
 stato consegnato. In questo caso, per il comportamento dei segnali descritto
 in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo
 oggi l'uso di questa funzione è deprecato a favore degli
-\index{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
+\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
 cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo
 in sez.~\ref{sec:sig_timer_adv}.
 
@@ -2937,15 +2937,15 @@ riceverlo fra due chiamate successive.
 
 % TODO: indicizzare i termini \itindex{POSIX~Timer~API} e HRT
 
-
 Sia le funzioni per la gestione dei tempi viste in
 sez.~\ref{sec:sys_cpu_times} che quelle per la gestione dei timer di
 sez.~\ref{sec:sig_alarm_abort} sono state a lungo limitate dalla risoluzione
 massima dei tempi dell'orologio interno del kernel, che era quella ottenibile
 dal timer di sistema che governa lo \textit{scheduler}, e quindi limitate
 dalla frequenza dello stesso che si ricordi, come già illustrato in
-sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. I
-contatori usati per il calcolo dei tempi infatti erano basati sul numero di
+sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}. 
+
+I contatori usati per il calcolo dei tempi infatti erano basati sul numero di
 \itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni
 \textit{clock tick} del timer di sistema, il che comportava anche, come
 accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per
@@ -2953,43 +2953,46 @@ il massimo periodo di tempo copribile da alcuni di questi orologi, come quelli
 associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16,
 non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}.
 
+\itindbeg{POSIX~Timer~API}
+
 Nelle architetture moderne però tutti i computer sono dotati di temporizzatori
 hardware che possono supportare risoluzioni molto elevate, ed in maniera del
 tutto indipendente dalla frequenza scelta per il timer di sistema che governa
 lo \textit{scheduler}, normalmente si possono ottenere precisioni fino al
-microsecondo, andando molto oltre in caso di hardware dedicato. Per questo lo
-standard POSIX.1-2001 ha previsto una serie di nuove funzioni relative a
-quelli che vengono chiamati ``\textsl{orologi} \textit{real-time}'', in grado
-di supportare risoluzioni fino al nanosecondo. Inoltre le CPU più moderne sono
-dotate a loro volta di contatori ad alta definizione che consentono una grande
-accuratezza nella misura del tempo da esse dedicato all'esecuzione di un
-processo.
+microsecondo, andando molto oltre in caso di hardware dedicato. 
+
+Per questo lo standard POSIX.1-2001 ha previsto una serie di nuove funzioni
+relative a quelli che vengono chiamati ``\textsl{orologi}
+\textit{real-time}'', in grado di supportare risoluzioni fino al
+nanosecondo. Inoltre le CPU più moderne sono dotate a loro volta di contatori
+ad alta definizione che consentono una grande accuratezza nella misura del
+tempo da esse dedicato all'esecuzione di un processo.
 
 Per usare queste funzionalità ed ottenere risoluzioni temporali più accurate,
 occorre però un opportuno supporto da parte del kernel, ed i cosiddetti
 \itindex{High~Resolution~Timer~(HRT)} \textit{high resolution timer} che
 consentono di fare ciò sono stati introdotti nel kernel ufficiale solo a
-partire dalla versione 2.6.21.\footnote{deve essere stata abilitata l'opzione
-  di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, erano però disponibili
-  anche in precedenza come patch facenti parte dello sviluppo delle estensioni
-  \textit{real-time} del kernel, per cui alcune distribuzioni possono avere
-  questo supporto anche con versioni precedenti del kernel.} Le funzioni
-definite dallo standard POSIX per gestire orologi ad alta definizione però
-erano già presenti, essendo stata introdotte insieme ad altre funzioni per il
-supporto delle estensioni \textit{real-time} con il rilascio del kernel 2.6,
-ma la risoluzione effettiva era nominale.
+partire dalla versione 2.6.21.\footnote{per il supporto deve essere stata
+  abilitata l'opzione di compilazione \texttt{CONFIG\_HIGH\_RES\_TIMERS}, il
+  supporto era però disponibile anche in precedenza nei patch facenti parte
+  dello sviluppo delle estensioni \textit{real-time} del kernel, per cui
+  alcune distribuzioni possono averlo anche con versioni precedenti del
+  kernel.} Le funzioni definite dallo standard POSIX per gestire orologi ad
+alta definizione però erano già presenti, essendo stata introdotte insieme ad
+altre funzioni per il supporto delle estensioni \textit{real-time} con il
+rilascio del kernel 2.6, ma la risoluzione effettiva era nominale.
 
 A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
 disporre di una versione \textit{real-time} almeno per l'orologio generale di
 sistema, quello che mantiene il \textit{calendar time} (vedi
 sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
 secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
-  Epoch}).\footnote{si ricordi che l'orologio ordinario usato dal
-  \textit{calendar time} riporta solo un numero di secondi, e che la
-  risoluzione effettiva normalmente non raggiunge il nanosecondo (a meno di
-  hardware specializzato).}  Oltre all'orologio generale di sistema possono
-essere presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali
-viene identificato da un opportuno valore di una variabile di tipo
+  Epoch}). Si ricordi infatti che l'orologio ordinario usato dal
+\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione
+effettiva normalmente non raggiunge il nanosecondo (a meno di hardware
+specializzato).  Oltre all'orologio generale di sistema possono essere
+presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene
+identificato da un opportuno valore di una variabile di tipo
 \type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
 tab.~\ref{tab:sig_timer_clockid_types}.
 
@@ -3012,7 +3015,9 @@ tab.~\ref{tab:sig_timer_clockid_types}.
     \const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
                                   aggiustamenti dovuti all'uso di NTP (viene
                                   usato per fare riferimento ad una fonte
-                                  hardware).\footnotemark\\
+                                  hardware). Questo orologio è specifico di
+                                  Linux, ed è disponibile a partire dal kernel
+                                  2.6.28.\\
     \const{CLOCK\_PROCESS\_CPUTIME\_ID}& contatore del tempo di CPU usato 
                                   da un processo (il \textit{process time} di
                                   sez.~\ref{sec:sys_cpu_times}, nel totale di
@@ -3024,6 +3029,23 @@ tab.~\ref{tab:sig_timer_clockid_types}.
                                   (\textit{user time} e \textit{system time})
                                   usato da un singolo \itindex{thread}
                                   \textit{thread}.\\
+    \const{CLOCK\_BOOTTIME}     & Identico a \const{CLOCK\_MONOTONIC} ma tiene
+                                  conto anche del tempo durante il quale il
+                                  sistema è stato sospeso (nel caso di
+                                  sospenzione in RAM o \textsl{ibernazione} su
+                                  disco. Questo orologio è specifico di Linux,
+                                  ed è disponibile a partire dal kernel
+                                  2.6.39.\\
+    \const{CLOCK\_REALTIME\_ALARM}&Identico a \const{CLOCK\_REALTIME}, ma se
+                                  usato per un timer il sistema sarà riattivato 
+                                  anche se è in sospensione. Questo orologio è
+                                  specifico di Linux, ed è disponibile a
+                                  partire dal kernel 3.0.\\
+    \const{CLOCK\_BOOTTIME\_ALARM}&Identico a \const{CLOCK\_BOOTTIME}, ma se
+                                  usato per un timer il sistema sarà riattivato 
+                                  anche se è in sospensione. Questo orologio è
+                                  specifico di Linux, ed è disponibile a
+                                  partire dal kernel 3.0.\\
 %    \const{}   & .\\
     \hline
   \end{tabular}
@@ -3032,13 +3054,10 @@ tab.~\ref{tab:sig_timer_clockid_types}.
   \label{tab:sig_timer_clockid_types}
 \end{table}
 
-\footnotetext{specifico di Linux, introdotto a partire dal kernel 2.6.28, non
-  previsto da POSIX e non presente in altri sistemi unix-like.}
 
 % TODO: aggiungere le estensioni introdotte con il 2.6.38, verificandone il
 % funzionamento, vedi http://lwn.net/Articles/429595/
-% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME, vedi
-% http://lwn.net/Articles/429925/
+% TODO: dal 2.6.39 anche CLOCK_BOOTTIME_ALARM e CLOCK_BOOTTIME
 % TODO: dal 3.0 anche i cosiddetti Posix Alarm Timers, con
 % CLOCK_REALTIME_ALARM vedi http://lwn.net/Articles/429925/
 
@@ -3047,31 +3066,34 @@ macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale
 di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i
 programmi che le usano devono essere collegati con la libreria delle
 estensioni \textit{real-time} usando esplicitamente l'opzione
-\texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste
-funzionalità avanzate può essere controllato dalla definizione della macro
-\macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro
+\texttt{-lrt}. 
+
+Si tenga presente inoltre che la disponibilità di queste funzionalità avanzate
+può essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS}
+ad un valore maggiore di 0, e che le ulteriori macro
 \macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e
 \macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi
 di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
-\const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite
-  in \headfile{unistd.h}, che pertanto deve essere incluso per poterle
-  controllarle.} Infine se il kernel ha il supporto per gli \textit{high
+\const{CLOCK\_PROCESS\_CPUTIME\_ID}; tutte queste macro sono definite in
+\headfile{unistd.h}, che pertanto deve essere incluso per poterle
+controllarle. Infine se il kernel ha il supporto per gli \textit{high
   resolution timer} un elenco degli orologi e dei timer può essere ottenuto
 tramite il file \procfile{/proc/timer\_list}.
 
 Le due funzioni che ci consentono rispettivamente di modificare o leggere il
 valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e
 \funcd{clock\_gettime}; i rispettivi prototipi sono:
-\begin{functions}
-  \headdecl{time.h}
 
-  \funcdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
-  \funcdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
-  
-  Imposta o legge un orologio \textit{real-time}.
-  
-  \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
-    errore, nel qual caso \var{errno} assumerà uno dei seguenti valori:
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{int clock\_settime(clockid\_t clockid, const struct timespec *tp)}
+\fdesc{Imposta un orologio \textit{real-time}.} 
+\fdecl{int clock\_gettime(clockid\_t clockid, struct timespec *tp)}
+\fdesc{Legge un orologio \textit{real-time}.} 
+}
+
+{Le funzioni ritornano $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
   \item[\errcode{EFAULT}] l'indirizzo \param{tp} non è valido.
   \item[\errcode{EINVAL}] il valore specificato per \param{clockid} non è
@@ -3081,7 +3103,7 @@ valore per uno degli orologi \textit{real-time} sono \funcd{clock\_settime} e
     indicato (solo per \func{clock\_settime}).
   \end{errlist}
 }
-\end{functions}
+\end{funcproto}
 
 Entrambe le funzioni richiedono che si specifichi come primo argomento il tipo
 di orologio su cui si vuole operare con uno dei valori di
@@ -3555,6 +3577,10 @@ questo era stato attivato. Nel caso, poco probabile ma comunque possibile, che
 un timer venga cancellato prima della ricezione del segnale pendente per la
 notifica di una scadenza, il comportamento del sistema è indefinito.
 
+\itindend{POSIX~Timer~API}
+
+
+
 \subsection{Ulteriori funzioni di gestione}
 \label{sec:sig_specific_features}
 
index 00dd60bf2feb1669f5cc03ad3858a14493faeeb7..9d53ac849e35c7c7c4faddb6075c361c4d1b1b7c 100644 (file)
@@ -2176,7 +2176,7 @@ maniera indipendente usando la costante del kernel \const{USER\_HZ}.
 Fino al kernel 2.6.21 la durata di un \textit{jiffy} costituiva la risoluzione
 massima ottenibile nella misura dei tempi impiegabile in una \textit{system
   call} (ad esempio per i timeout). Con il 2.6.21 e l'introduzione degli
-\index{High~Resolution~Timer~(HRT)} \textit{high-resolution timers} (HRT) è
+\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timers} (HRT) è
 divenuto possibile ottenere, per le funzioni di attesa ed i timer, la massima
 risoluzione possibile fornita dall'hardware. Torneremo su questo in
 sez.~\ref{sec:sig_timer_adv}.
@@ -2614,9 +2614,9 @@ sintassi specificata per la forma equivalente di questa funzione definita come
 \code{ADJ}.
 
 Si tenga presente infine che con l'introduzione a partire dal kernel 2.6.21
-degli \itindex{high~resolution~timer} \textit{high resolution timer} ed il
-supporto per i cosiddetti POSIX \textit{real-time clock}, si può ottenere il
-\textit{calendar time} direttamente da questi, come vedremo in
+degli \itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} ed
+il supporto per i cosiddetti POSIX \textit{real-time clock}, si può ottenere
+il \textit{calendar time} direttamente da questi, come vedremo in
 sez.~\ref{sec:sig_timer_adv}, con la massima risoluzione possibile per
 l'hardware della macchina.