X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=9e6abaf13bd26f79ab8054994b3b46ed1f4de5aa;hp=031892523c6d0ece520d31735e464c8c82bb92c5;hb=be0113897fdc6774f0dcc3f9c91fe5e76c5dd0a5;hpb=99fa5a06cd27160cf673e3483ad552d32efa2c05 diff --git a/system.tex b/system.tex index 0318925..9e6abaf 100644 --- a/system.tex +++ b/system.tex @@ -166,7 +166,7 @@ sez.~\ref{sec:sys_file_limits}. \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per processo in contemporanea.\\ \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una - \itindex{timezone} \textit{timezone} (vedi + \textit{timezone} (vedi sez.~\ref{sec:sys_time_base})).\\ \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per processo (vedi sez.~\ref{sec:proc_access_id}).\\ @@ -204,7 +204,7 @@ file, riportate in tab.~\ref{tab:sys_file_macro}. \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per processo in contemporanea.\\ \const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una - \itindex{timezone} \textit{timezone} + \textit{timezone} (vedi sez.~\ref{sec:sys_date}). \\ \const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali \textit{real-time} (vedi @@ -334,7 +334,7 @@ relative spiegazioni, si può trovare nel manuale delle \acr{glibc}. che specifica la macro {FOPEN\_MAX}.\\ \texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}& La dimensione massima di un nome di una - \itindex{timezone} \texttt{timezone} (vedi + \texttt{timezone} (vedi sez.~\ref{sec:sys_date}).\\ \texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}& Massimo numero di gruppi supplementari che @@ -714,9 +714,9 @@ informazioni degli utenti e dei gruppi per insiemi di macchine e servizi all'interno di una stessa organizzazione, in modo da mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare e memorizzare dette informazioni su supporti diversi dai file citati, introducendo il sistema del -\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (che -tratteremo brevemente in sez.~\ref{sec:sock_resolver}) dato che la sua -applicazione è cruciale nella procedura di risoluzione di nomi di rete. +\textit{Name Service Switch} (che tratteremo brevemente in +sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella +procedura di risoluzione di nomi di rete. In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche per la lettura delle informazioni relative a utenti e gruppi tralasciando @@ -1547,10 +1547,9 @@ dell'esaurimento della propria \textit{time-slice} (in genere a causa di una interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e \var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed -infine \var{ru\_maxrss} indica il valore più alto della -\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal -processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno -dei suoi figli. +infine \var{ru\_maxrss} indica il valore più alto della \textit{Resident Set + Size} raggiunto dal processo stesso o, nel caso sia stato usato +\const{RUSAGE\_CHILDREN}, da uno dei suoi figli. Si tenga conto che per un errore di implementazione nei i kernel precedenti il 2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1, @@ -1700,10 +1699,10 @@ riportati nel seguente elenco: con un errore di \errcode{EFBIG}. \item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di - \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking}) - e di \textit{file lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un - processo poteva effettuare. È un limite presente solo nelle prime versioni - del kernel 2.4, pertanto non deve essere più utilizzato. + \textit{file lock} (vedi sez.~\ref{sec:file_locking}) e di \textit{file + lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un processo poteva + effettuare. È un limite presente solo nelle prime versioni del kernel 2.4, + pertanto non deve essere più utilizzato. \item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare massimo di memoria che può essere bloccata in RAM da un processo (vedi @@ -2047,6 +2046,7 @@ gestione di data e ora. \label{sec:sys_unix_time} \itindbeg{calendar~time} +\itindbeg{process~time} Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi distinti di tempi, caratterizzati da altrettante modalità di misura ed @@ -2062,14 +2062,13 @@ espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar tradizionalmente misurato in secondi a partire dalla mezzanotte del primo gennaio 1970, data che viene chiamata \textit{the Epoch}. -\item[\textit{process time}] \itindex{process~time} detto anche \textsl{tempo - di processore} o \textsl{tempo di CPU}. Si tratta del tempo impiegato da - un processore nell'esecuzione del codice di un programma all'interno di un - processo. Per esprimere questo tempo è stato riservato il tipo - \type{clock\_t}, e viene misurato nei cosiddetti \itindex{clock~tick} - \textit{clock tick}, tradizionalmente corrispondenti al numero di - interruzioni del processore da parte del timer di sistema. A differenza del - precedente indica soltanto un intervallo di durata. +\item[\textit{process time}] detto anche \textsl{tempo di processore} o + \textsl{tempo di CPU}. Si tratta del tempo impiegato da un processore + nell'esecuzione del codice di un programma all'interno di un processo. Per + esprimere questo tempo è stato riservato il tipo \type{clock\_t}, e viene + misurato nei cosiddetti \textit{clock tick}, tradizionalmente corrispondenti + al numero di interruzioni del processore da parte del timer di sistema. A + differenza del precedente indica soltanto un intervallo di durata. \end{basedescript} Il \textit{calendar time} viene sempre mantenuto facendo riferimento @@ -2104,11 +2103,10 @@ in presenza di cambi di fusi orari. \itindend{calendar~time} -Il \itindex{process~time} \textit{process time} invece indica sempre una -misura di un lasso di tempo e viene usato per tenere conto dei tempi di -esecuzione dei processi. Esso viene sempre diviso in \textit{user time} e -\textit{system time}, per misurare la durata di ciascun processo il kernel -infatti calcola tre tempi: +Il \textit{process time} invece indica sempre una misura di un lasso di tempo +e viene usato per tenere conto dei tempi di esecuzione dei processi. Esso +viene sempre diviso in \textit{user time} e \textit{system time}, per misurare +la durata di ciascun processo il kernel infatti calcola tre tempi: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} \item[\textit{clock time}] il tempo \textsl{reale}, viene chiamato anche \textit{wall clock time} o \textit{elapsed time}, passato dall'avvio del @@ -2135,6 +2133,7 @@ processo. Si può ottenere un riassunto dei valori di questi tempi quando si esegue un qualsiasi programma lanciando quest'ultimo come argomento del comando \cmd{time}. +\itindend{process~time} \itindbeg{clock~tick} Come accennato il \textit{process time} viene misurato nei cosiddetti @@ -2156,6 +2155,7 @@ definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere usato. \constbeg{HZ} + In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e facendo i conti in base al numero delle interruzioni generate dello stesso, i @@ -2179,10 +2179,9 @@ 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 -\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}. +\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}. \itindend{clock~tick} @@ -2190,8 +2189,6 @@ sez.~\ref{sec:sig_timer_adv}. \subsection{La gestione del \textit{process time}} \label{sec:sys_cpu_times} -\itindbeg{process~time} - Di norma tutte le operazioni del sistema fanno sempre riferimento al \textit{calendar time}, l'uso del \textit{process time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione di un processo @@ -2324,8 +2321,6 @@ indicando un errore, nei primi secondi dopo il boot (per la precisione nei primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo \type{clock\_t}. -\itindend{process~time} - \subsection{Le funzioni per il \textit{calendar time}} \label{sec:sys_time_base} @@ -2417,15 +2412,19 @@ capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di una condizione generale che continua a valere per qualunque funzione che vada a modificare l'orologio di sistema, comprese tutte quelle che tratteremo in seguito. +\itindbeg{timezone} + Il secondo argomento di entrambe le funzioni è una struttura \struct{timezone}, che storicamente veniva utilizzata per specificare appunto -la \itindex{timezone} \textit{timezone}, cioè l'insieme del fuso orario e -delle convenzioni per l'ora legale che permettevano il passaggio dal tempo +la cosiddetta \textit{timezone}, cioè l'insieme del fuso orario e delle +convenzioni per l'ora legale che permettevano il passaggio dal tempo universale all'ora locale. Questo argomento oggi è obsoleto ed in Linux non è mai stato utilizzato; esso non è supportato né dalle vecchie \textsl{libc5}, né dalle \textsl{glibc}: pertanto quando si chiama questa funzione deve essere sempre impostato a \val{NULL}. +\itindbeg{timezone} + Modificare l'orologio di sistema con queste funzioni è comunque problematico, in quanto esse effettuano un cambiamento immediato. Questo può creare dei buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con @@ -2617,11 +2616,10 @@ 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~(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. +degli \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. @@ -2712,9 +2710,9 @@ Sun Apr 29 19:47:44 2012\n" \end{Example} Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione -di una \itindex{timezone} \textit{timezone} e effettua una chiamata preventiva -a \func{tzset} (che vedremo a breve), in modo che la data espressa tenga conto -del fuso orario. In realtà \func{ctime} è banalmente definita in termini di +di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset} +(che vedremo a breve), in modo che la data espressa tenga conto del fuso +orario. In realtà \func{ctime} è banalmente definita in termini di \func{asctime} come \code{asctime(localtime(t)}. Dato che l'uso di una stringa statica rende le funzioni non rientranti @@ -2790,7 +2788,7 @@ della variabile globale \var{tzname}. \includestruct{listati/time_zone_var.c} \end{minipage} \normalsize - \caption{Le variabili globali usate per la gestione delle \itindex{timezone} + \caption{Le variabili globali usate per la gestione delle \textit{timezone}.} \label{fig:sys_tzname} \end{figure} @@ -2798,12 +2796,12 @@ della variabile globale \var{tzname}. Come accennato l'uso del \textit{broken-down time} permette di tenere conto anche della differenza fra tempo universale e ora locale, compresa l'eventuale ora legale. Questo viene fatto dalle funzioni di conversione grazie alle -informazioni riguardo la propria \itindex{timezone} \textit{timezone} -mantenute nelle tre variabili globali mostrate in fig.~\ref{fig:sys_tzname}, -cui si si può accedere direttamente includendo \headfile{time.h}. Come -illustrato queste variabili vengono impostate internamente da alcune delle -delle precedenti funzioni di conversione, ma lo si può fare esplicitamente -chiamando direttamente la funzione \funcd{tzset}, il cui prototipo è: +informazioni riguardo la propria \textit{timezone} mantenute nelle tre +variabili globali mostrate in fig.~\ref{fig:sys_tzname}, cui si si può +accedere direttamente includendo \headfile{time.h}. Come illustrato queste +variabili vengono impostate internamente da alcune delle delle precedenti +funzioni di conversione, ma lo si può fare esplicitamente chiamando +direttamente la funzione \funcd{tzset}, il cui prototipo è: \begin{funcproto}{ \fhead{time.h} @@ -2818,11 +2816,11 @@ La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è definita verrà usato il file \conffiled{/etc/localtime}. La variabile \var{tzname} contiene due stringhe, che indicano i due nomi standard della -\itindex{timezone} \textit{timezone} corrente. La prima è il nome per l'ora -solare, la seconda per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} -sono indicate come \code{char *} non è il caso di modificare queste -stringhe. La variabile \var{timezone} indica la differenza di fuso orario in -secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale. +\textit{timezone} corrente. La prima è il nome per l'ora solare, la seconda +per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come +\code{char *} non è il caso di modificare queste stringhe. La variabile +\var{timezone} indica la differenza di fuso orario in secondi, mentre +\var{daylight} indica se è attiva o meno l'ora legale. Benché la funzione \func{asctime} fornisca la modalità più immediata per stampare un tempo o una data, la flessibilità non fa parte delle sue @@ -2881,8 +2879,7 @@ lo stato di \param{s} è indefinito. \var{\%X}&\texttt{18:40:50} & L'ora.\\ \var{\%y}&\texttt{02} & Anno nel secolo.\\ \var{\%Y}&\texttt{2002} & Anno.\\ - \var{\%Z}&\texttt{CEST} & Nome della \itindex{timezone} - \textit{timezone}.\\ + \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\ \var{\%\%}&\texttt{\%} & Il carattere \%.\\ \hline \end{tabular} @@ -2949,7 +2946,7 @@ un errore nell'esecuzione di una funzione, ma di norma questo viene riportato semplicemente usando un opportuno valore di ritorno della funzione invocata. Inoltre il sistema di classificazione degli errori è stato progettato sull'architettura a processi, e presenta una serie di problemi nel caso lo si -debba usare con i \itindex{thread} \textit{thread}. +debba usare con i \textit{thread}. \subsection{La variabile \var{errno}} @@ -2967,11 +2964,11 @@ che c'è stato un errore, e non il tipo di errore. Per riportare il tipo di errore il sistema usa la variabile globale \var{errno}, definita nell'header \headfile{errno.h}. Come accennato l'uso di -una variabile globale può comportare problemi nel caso dei \itindex{thread} -\textit{thread}, ma lo standard ISO C consente anche di definire \var{errno} -come un cosiddetto ``\textit{modifiable lvalue}'', cosa che consente di usare -anche una macro, e questo è infatti il metodo usato da Linux per renderla -locale ai singoli \itindex{thread} \textit{thread}. +una variabile globale può comportare problemi nel caso dei \textit{thread}, ma +lo standard ISO C consente anche di definire \var{errno} come un cosiddetto +``\textit{modifiable lvalue}'', cosa che consente di usare anche una macro, e +questo è infatti il metodo usato da Linux per renderla locale ai singoli +\textit{thread}. La variabile è in genere definita come \dirct{volatile} dato che può essere cambiata in modo asincrono da un segnale, per un esempio si veda @@ -3044,9 +3041,9 @@ La funzione \func{strerror} utilizza una stringa statica che non deve essere modificata dal programma; essa è utilizzabile solo fino ad una chiamata successiva a \func{strerror} o \func{perror} e nessun'altra funzione di libreria tocca questa stringa. In ogni caso l'uso di una stringa statica rende -la funzione non rientrante, per cui nel caso si usino i \itindex{thread} -\textit{thread} la \acr{glibc} fornisce una apposita versione rientrante -\funcd{strerror\_r}, il cui prototipo è: +la funzione non rientrante, per cui nel caso si usino i \textit{thread} la +\acr{glibc} fornisce una apposita versione rientrante \funcd{strerror\_r}, il +cui prototipo è: \begin{funcproto}{ \fhead{string.h} @@ -3073,10 +3070,10 @@ restituita a \param{size}, a cui si accede definendo le opportune macro (per le quali si rimanda alla lettura della pagina di manuale). La funzione è analoga a \func{strerror} ma restituisce la stringa di errore -nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve -allocare autonomamente per evitare i problemi connessi alla condivisione del -buffer statico. Il messaggio è copiato fino alla dimensione massima del -buffer, specificata dall'argomento \param{size}, che deve comprendere pure il +nel buffer \param{buf} che il singolo \textit{thread} deve allocare +autonomamente per evitare i problemi connessi alla condivisione del buffer +statico. Il messaggio è copiato fino alla dimensione massima del buffer, +specificata dall'argomento \param{size}, che deve comprendere pure il carattere di terminazione; altrimenti la stringa risulterà troncata. Una seconda funzione usata per riportare i codici di errore in maniera