X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=127095d603400be6e07b647da4ee324d274337a9;hp=22f0eb152e054fc8de196c0adb3687404ffa7b3e;hb=3f50b8e3fd683f710e34a88436109157d328e1b6;hpb=6760429dc70f868716393c4413c5450b0649869b diff --git a/system.tex b/system.tex index 22f0eb1..127095d 100644 --- a/system.tex +++ b/system.tex @@ -344,11 +344,9 @@ relative spiegazioni, si può trovare nel manuale delle \acr{glibc}. Valore massimo del tipo di dato \type{ssize\_t}.\\ \texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} & - Il numero di \itindex{clock~tick} - \textit{clock tick} al secondo, + Il numero di \textit{clock tick} al secondo, cioè l'unità di misura del - \itindex{process~time} \textit{process - time} (vedi + \textit{process time} (vedi sez.~\ref{sec:sys_unix_time}).\\ \texttt{\_SC\_JOB\_CONTROL}&\macro{\_POSIX\_JOB\_CONTROL}& Indica se è supportato il \textit{job @@ -409,7 +407,7 @@ riportate in tab.~\ref{tab:sys_file_macro}. \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ - \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe + \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una \textit{pipe} (vedi sez.~\ref{sec:ipc_pipes}).\\ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico (vedi sez.~\ref{sec:term_io_design}).\\ @@ -441,7 +439,7 @@ analoghe di tab.~\ref{tab:sys_posix1_general}. \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una - pipe.\\ + \textit{pipe}.\\ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di terminale in modo canonico.\\ \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input @@ -1594,8 +1592,7 @@ specifico segnale o il fallimento della \textit{system call} che lo ha provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU} in cui si ha in comportamento diverso per il superamento dei due limiti e \const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale -creazione dei file di \itindex{core~dump} \textit{core dump} (vedi -sez.~\ref{sec:sig_standard}). +creazione dei file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}). Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit} @@ -1667,19 +1664,18 @@ riportati nel seguente elenco: \textit{Address Space}, (vedi sez.~\ref{sec:proc_mem_gen}). Se il limite viene superato dall'uso di funzioni come \func{brk}, \func{mremap} o \func{mmap} esse falliranno con un errore di \errcode{ENOMEM}, mentre se il - superamento viene causato dalla crescita dello \itindex{stack} - \textit{stack} il processo riceverà un segnale di \signal{SIGSEGV}. Dato che - il valore usato è un intero di tipo \ctyp{long} nelle macchine a 32 bit - questo può assumere un valore massimo di 2Gb (anche se la memoria - disponibile può essere maggiore), in tal caso il limite massimo indicabile - resta 2Gb, altrimenti la risorsa si dà per non limitata. + superamento viene causato dalla crescita dello \textit{stack} il processo + riceverà un segnale di \signal{SIGSEGV}. Dato che il valore usato è un + intero di tipo \ctyp{long} nelle macchine a 32 bit questo può assumere un + valore massimo di 2Gb (anche se la memoria disponibile può essere maggiore), + in tal caso il limite massimo indicabile resta 2Gb, altrimenti la risorsa si + dà per non limitata. \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima - dimensione per un file di \itindex{core~dump} \textit{core dump} (vedi + dimensione per un file di \textit{core dump} (vedi sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File di dimensioni maggiori verranno troncati a questo valore, mentre con un - valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core - dump}. + valore nullo si bloccherà la creazione dei \textit{core dump}. \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il @@ -1804,9 +1800,9 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa introdotto con il kernel 2.6.8. \item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima - dimensione dello \itindex{stack} \textit{stack} del processo. Se il processo - esegue operazioni che estendano lo \textit{stack} oltre questa dimensione - riceverà un segnale di \signal{SIGSEGV}. + dimensione dello \textit{stack} del processo. Se il processo esegue + operazioni che estendano lo \textit{stack} oltre questa dimensione riceverà + un segnale di \signal{SIGSEGV}. A partire dal kernel 2.6.23 questo stesso limite viene applicato per la gran parte delle architetture anche ai dati che possono essere passati come @@ -2058,19 +2054,21 @@ gestione di data e ora. \subsection{La misura del tempo in Unix} \label{sec:sys_unix_time} +\itindbeg{calendar~time} + Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi distinti di tempi, caratterizzati da altrettante modalità di misura ed espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar time} e \textit{process time}, secondo le seguenti definizioni: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} -\item[\textit{calendar time}] \itindex{calendar~time} detto anche - \textsl{tempo di calendario}, \textsl{tempo d'orologio} o \textit{tempo - reale}. Si tratta di un tempo assoluto o di un intervallo di tempo come lo - intende normalmente per le misure fatte con un orologio. Per esprimere +\item[\textit{calendar time}] detto anche \textsl{tempo di calendario}, + \textsl{tempo d'orologio} o \textit{tempo reale}. Si tratta di un + tempo assoluto o di un intervallo di tempo come lo intende + normalmente per le misure fatte con un orologio. Per esprimere questo tempo è stato riservato il tipo \type{time\_t}, e viene - tradizionalmente misurato in secondi a partire dalla mezzanotte del primo - gennaio 1970, data che viene chiamata \textit{the Epoch}. + 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 @@ -2082,14 +2080,15 @@ espressi con diversi tipi di dati, chiamati rispettivamente \textit{calendar precedente indica soltanto un intervallo di durata. \end{basedescript} -Il \itindex{calendar~time} \textit{calendar time} viene sempre mantenuto -facendo riferimento al cosiddetto \textit{tempo universale coordinato} UTC, -anche se talvolta viene usato il cosiddetto GMT (\textit{Greenwich Mean Time}) -dato che l'UTC corrisponde all'ora locale di Greenwich. Si tratta del tempo su -cui viene mantenuto il cosiddetto \textsl{orologio di sistema}, e viene usato -per indicare i tempi dei file (quelli di sez.~\ref{sec:file_file_times}) o le -date di avvio dei processi, ed è il tempo che viene usato dai demoni che -compiono lavori amministrativi ad orari definito, come \cmd{cron}. +Il \textit{calendar time} viene sempre mantenuto facendo riferimento +al cosiddetto \textit{tempo universale coordinato} UTC, anche se +talvolta viene usato il cosiddetto GMT (\textit{Greenwich Mean Time}) +dato che l'UTC corrisponde all'ora locale di Greenwich. Si tratta del +tempo su cui viene mantenuto il cosiddetto \textsl{orologio di + sistema}, e viene usato per indicare i tempi dei file (quelli di +sez.~\ref{sec:file_file_times}) o le date di avvio dei processi, ed è +il tempo che viene usato dai demoni che compiono lavori amministrativi +ad orari definito, come \cmd{cron}. Si tenga presente che questo tempo è mantenuto dal kernel e non è detto che corrisponda al tempo misurato dall'orologio hardware presente su praticamente @@ -2111,6 +2110,8 @@ opportune informazioni di localizzazione (specificate in di sistema misuri sempre un tempo monotono crescente come nella realtà, anche 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 @@ -2119,7 +2120,7 @@ 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 - processo. Questo tempo fa riferimento al \itindex{calendar~time} + processo. Questo tempo fa riferimento al \textit{calendar time} e dice la durata effettiva dell'esecuzione del processo, ma chiaramente dipende dal carico del sistema e da quanti altri processi stanno girando nello stesso momento. @@ -2136,29 +2137,31 @@ infatti calcola tre tempi: \end{basedescript} La somma di \textit{user time} e \textit{system time} indica il -\itindex{process~time} \textit{process time}, vale a dire il tempo di -processore totale che il sistema ha effettivamente utilizzato per eseguire il -programma di un certo 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}. - -Come accennato il \itindex{process~time} \textit{process time} viene misurato -nei cosiddetti \itindex{clock~tick} \textit{clock tick}. Un tempo questo -corrispondeva al numero di interruzioni effettuate dal timer di sistema, oggi -lo standard POSIX richiede che esso sia espresso come multiplo della costante -\const{CLOCKS\_PER\_SEC} che deve essere definita come 1000000, qualunque sia -la risoluzione reale dell'orologio di sistema e la frequenza delle -interruzioni del timer che, come accennato in sez.~\ref{sec:proc_hierarchy} e -come vedremo a breve, è invece data dalla costante \const{HZ}. +\textit{process time}, vale a dire il tempo di processore totale che il +sistema ha effettivamente utilizzato per eseguire il programma di un certo +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}. + +\itindbeg{clock~tick} + +Come accennato il \textit{process time} viene misurato nei cosiddetti +\textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni +effettuate dal timer di sistema, oggi lo standard POSIX richiede che esso sia +espresso come multiplo della costante \const{CLOCKS\_PER\_SEC} che deve essere +definita come 1000000, qualunque sia la risoluzione reale dell'orologio di +sistema e la frequenza delle interruzioni del timer che, come accennato in +sez.~\ref{sec:proc_hierarchy} e come vedremo a breve, è invece data dalla +costante \const{HZ}. Il tipo di dato usato per questo tempo, \type{clock\_t}, con questa convenzione ha una risoluzione del microsecondo. Ma non tutte le funzioni di sistema come vedremo seguono questa convenzione, in tal caso il numero di -\itindex{clock~tick} \textit{clock tick} al secondo può essere ricavato anche -attraverso \func{sysconf} richiedendo il valore della costante -\const{\_SC\_CLK\_TCK} (vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo -\const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato obsoleto e -non deve essere usato. +\textit{clock tick} al secondo può essere ricavato anche attraverso +\func{sysconf} richiedendo il valore della costante \const{\_SC\_CLK\_TCK} +(vedi sez.~\ref{sec:sys_limits}). Il vecchio simbolo \const{CLK\_TCK} +definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere +usato. In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e @@ -2174,9 +2177,9 @@ le architetture, ma dal 2.6.13 il valore è diventato una opzione di compilazione del kernel, con un default di 250 e valori possibili di 100, 250, 1000. Dal 2.6.20 è stato aggiunto anche il valore 300 che è divisibile per le frequenze di refresh della televisione (50 o 60 Hz). Si può pensare che questi -valori determinino anche la corrispondente durata dei \itindex{clock~tick} -\textit{clock tick}, ma in realtà questa granularità viene calcolata in -maniera indipendente usando la costante del kernel \const{USER\_HZ}. +valori determinino anche la corrispondente durata dei \textit{clock tick}, ma +in realtà questa granularità viene calcolata in 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 @@ -2186,6 +2189,7 @@ 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} \subsection{La gestione del \textit{process time}} @@ -2194,12 +2198,12 @@ sez.~\ref{sec:sig_timer_adv}. \itindbeg{process~time} Di norma tutte le operazioni del sistema fanno sempre riferimento al -\itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process - time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione -di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti -fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere -trascorso mentre un altro processo era in esecuzione o in attesa del risultato -di una operazione di I/O. +\textit{calendar time}, l'uso del \textit{process time} è riservato a +quei casi in cui serve conoscere i tempi di esecuzione di un processo +(ad esempio per valutarne l'efficienza). In tal caso infatti fare +ricorso al \textit{calendar time} è inutile in quanto il tempo può +essere trascorso mentre un altro processo era in esecuzione o in +attesa del risultato 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 @@ -2216,12 +2220,12 @@ utilizzato dallo stesso; il suo prototipo è: \var{errno} non viene usata.} \end{funcproto} -La funzione restituisce il tempo in \itindex{clock~tick} \textit{clock tick} -ma la \acr{glibc} segue lo standard POSIX e quindi se si vuole il tempo in -secondi occorre dividere il risultato per la costante -\const{CLOCKS\_PER\_SEC}. In genere \type{clock\_t} viene rappresentato come -intero a 32 bit, il che comporta un valore massimo corrispondente a circa 72 -minuti, dopo i quali il contatore riprenderà lo stesso valore iniziale. +La funzione restituisce il tempo in \textit{clock tick} ma la \acr{glibc} +segue lo standard POSIX e quindi se si vuole il tempo in secondi occorre +dividere il risultato per la costante \const{CLOCKS\_PER\_SEC}. In genere +\type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un +valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore +riprenderà lo stesso valore iniziale. La funzione è presente anche nello standard ANSI C, ma in tal caso non è previsto che il valore ritornato indichi un intervallo di tempo ma solo un @@ -2298,7 +2302,7 @@ il comportamento è stato adeguato allo standard a partire dalla versione 2.6.9. A differenza di quanto avviene per \func{clock} i valori restituiti nei campi -di una struttura \struct{tms} sono misurati in numero di \itindex{clock~tick} +di una struttura \struct{tms} sono misurati in numero di \textit{clock tick} effettivi e non in multipli di \const{CLOCKS\_PER\_SEC}, pertanto per ottenere il valore effettivo in secondi occorrerà dividere per il risultato di \code{sysconf(\_SC\_CLK\_TCK)}. @@ -2310,12 +2314,12 @@ versioni del kernel. Fino al kernel 2.4 si faceva infatti riferimento al momento dell'avvio del kernel. Con il kernel 2.6 si fa riferimento a $2^{32}/\mathtt{HZ}-300$ secondi prima dell'avvio. -Considerato che il numero dei \itindex{clock~tick} \textit{clock tick} per un -kernel che è attivo da molto tempo può eccedere le dimensioni per il tipo -\type{clock\_t} il comportamento più opportuno per i programmi è di ignorare -comunque il valore di ritorno della funzione e ricorrere alle funzioni per il -tempo di calendario del prossimo paragrafo qualora si voglia calcolare il -tempo effettivamente trascorso dall'inizio del programma. +Considerato che il numero dei \textit{clock tick} per un kernel che è attivo +da molto tempo può eccedere le dimensioni per il tipo \type{clock\_t} il +comportamento più opportuno per i programmi è di ignorare comunque il valore +di ritorno della funzione e ricorrere alle funzioni per il tempo di calendario +del prossimo paragrafo qualora si voglia calcolare il tempo effettivamente +trascorso dall'inizio del programma. Infine si tenga presente che per dei limiti nelle convenzioni per il ritorno dei valori delle \textit{system call} su alcune architetture hardware (ed in @@ -2588,7 +2592,7 @@ riportate in tab.~\ref{tab:sys_timex_mode}. specificato nel campo \var{constant} di \struct{timex}.\\ \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick} - \itindex{clock~tick} del timer in + del timer in microsecondi, espresso nel campo \var{tick} di \struct{timex}.\\ \const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Chiede uno spostamento una tantum