From ea887edc424e278e36332f18ba8afb5f1ed84b11 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 26 May 2012 23:33:48 +0000 Subject: [PATCH] Poche cose sui timer --- signal.tex | 120 ++++++++++++++++++++++++++++++++--------------------- system.tex | 8 ++-- 2 files changed, 77 insertions(+), 51 deletions(-) diff --git a/signal.tex b/signal.tex index 7af26cf..d1a744a 100644 --- a/signal.tex +++ b/signal.tex @@ -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} diff --git a/system.tex b/system.tex index 00dd60b..9d53ac8 100644 --- a/system.tex +++ b/system.tex @@ -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. -- 2.30.2