X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=b2a7b3c3975329c95643dc8925619dab8de8adbf;hp=067dd5988013c51e770c2c6ae49ef273209ededf;hb=41c735da3ff09f0e2c516660320491fc54cf505e;hpb=56a7803a5e9f18850548c186b7aa9813b071107d diff --git a/system.tex b/system.tex index 067dd59..b2a7b3c 100644 --- a/system.tex +++ b/system.tex @@ -49,7 +49,7 @@ La prima funzionalit contengono le costanti necessarie definite come macro di preprocessore, per la seconda invece sono ovviamente necessarie delle funzioni. La situazione è complicata dal fatto che ci sono molti casi in cui alcuni di questi limiti -sono fissi in una implementazione mentre possono variare in un altra. Tutto +sono fissi in un'implementazione mentre possono variare in un altra. Tutto questo crea una ambiguità che non è sempre possibile risolvere in maniera chiara; in generale quello che succede è che quando i limiti del sistema sono fissi essi vengono definiti come macro di preprocessore nel file @@ -168,7 +168,7 @@ file, riportate in \tabref{tab:sys_file_macro}). \hline \hline \end{tabular} - \caption{Macro .} + \caption{Costanti per i limiti del sistema.} \label{tab:sys_generic_macro} \end{table} @@ -476,7 +476,7 @@ suo prototipo \subsection{La funzione \func{uname}} \label{sec:sys_uname} -Una altra funzione che si può utilizzare per raccogliere informazioni sia +Un'altra funzione che si può utilizzare per raccogliere informazioni sia riguardo al sistema che al computer su cui esso sta girando è \func{uname}, il suo prototipo è: \begin{prototype}{sys/utsname.h}{int uname(struct utsname *info)} @@ -636,7 +636,7 @@ Come accennato in \secref{sec:file_organization} per poter accedere ai file occorre prima rendere disponibile al sistema il filesystem su cui essi sono memorizzati; l'operazione di attivazione del filesystem è chiamata \textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica - di Linux e non è portabile} si usa la funzione \func{mount} il cui prototipo + di Linux e non è portabile.} si usa la funzione \func{mount} il cui prototipo è: \begin{prototype}{sys/mount.h} {mount(const char *source, const char *target, const char *filesystemtype, @@ -780,13 +780,13 @@ Una volta che non si voglia pi \macro{ENAMETOOLONG}, \macro{ENOENT} o \macro{ELOOP}.} \end{prototype} \noindent la funzione prende il nome della directory su cui il filesystem è -montato e non il file o il dispositivo che è stato montato\footnote{questo è +montato e non il file o il dispositivo che è stato montato,\footnote{questo è vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate separate e la funzione poteva essere usata anche specificando il file di - dispositivo.}, in quanto con il kernel 2.4.x è possibile montare lo stesso + dispositivo.} in quanto con il kernel 2.4.x è possibile montare lo stesso dispositivo in più punti. Nel caso più di un filesystem sia stato montato sullo stesso \textit{mount point} viene smontato quello che è stato montato -per ultimo. +per ultimo. Si tenga presente che la funzione fallisce quando il filesystem è \textsl{occupato}, questo avviene quando ci sono ancora file aperti sul @@ -811,8 +811,8 @@ seconda del tipo di filesystem alcune (o tutte) possono essere superate, evitando l'errore di \macro{EBUSY}. In tutti i casi prima dello smontaggio viene eseguita una sincronizzazione dei dati. -Altre due funzioni specifiche di Linux\footnote{esse si trovano anche su BSD, - ma con una struttura diversa}, utili per ottenere in maniera diretta +Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD, + ma con una struttura diversa.} utili per ottenere in maniera diretta informazioni riguardo al filesystem su cui si trova un certo file, sono \func{statfs} e \func{fstatfs}, i cui prototipi sono: \begin{functions} @@ -868,7 +868,7 @@ relative a \file{/etc/mtab}), quando si debba scrivere un programma che effettua il montaggio di un filesystem; in realtà in questi casi è molto più semplice invocare direttamente il programma \cmd{mount}, per cui ne tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} -\cite{libc} per la documentazione completa. +\cite{glibc} per la documentazione completa. \subsection{La gestione di utenti e gruppi} @@ -964,13 +964,13 @@ date e del tempo in un sistema unix-like, e quelle per convertire i vari tempi nelle differenti rappresentazioni che vengono utilizzate. -\subsection{La misura del tempo in unix} +\subsection{La misura del tempo in Unix} \label{sec:sys_unix_time} -Storicamente i sistemi unix-like hanno sempre mantenuto due distinti -valori per i tempi all'interno del sistema, essi sono rispettivamente -chiamati \textit{calendar time} e \textit{process time}, secondo le -definizioni: +Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di +dati per la misure dei tempi all'interno del sistema: essi sono +rispettivamente chiamati \textit{calendar time} e \textit{process time}, +secondo le definizioni: \begin{itemize} \item \textit{calendar time}: è il numero di secondi dalla mezzanotte del primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene @@ -980,11 +980,11 @@ definizioni: viene mantenuto l'orologio del calcolatore, e viene usato ad esempio per indicare le date di modifica dei file o quelle di avvio dei processi. Per memorizzare questo tempo è stato riservato il tipo primitivo \type{time\_t}. -\item \textit{process time}: talvolta anche detto tempo di CPU. Viene misurato +\item \textit{process time}: detto anche tempo di processore. Viene misurato in \textit{clock tick}, corrispondenti al numero di interruzioni effettuate dal timer di sistema, e che per Linux avvengono ogni centesimo di - secondo\footnote{eccetto per la piattaforma alpha dove avvengono ogni - millesimo di secondo}. Il dato primitivo usato per questo tempo è + secondo.\footnote{eccetto per la piattaforma alpha dove avvengono ogni + millesimo di secondo.} Il dato primitivo usato per questo tempo è \type{clock\_t}, inoltre la costante \macro{HZ} restituisce la frequenza di operazione del timer, e corrisponde dunque al numero di tick al secondo. Lo standard POSIX definisce allo stesso modo la costante \macro{CLK\_TCK}); @@ -992,32 +992,35 @@ definizioni: \secref{sec:sys_limits}). \end{itemize} -In genere si usa il \textit{calendar time} per tenere le date dei file e le -informazioni analoghe che riguardano i tempi di ``orologio'', usati ad esempio -per i demoni che compiono lavori amministrativi ad ore definite, come -\cmd{cron}. Di solito questo vene convertito automaticamente dal valore in UTC -al tempo locale, utilizzando le opportune informazioni di localizzazione +In genere si usa il \textit{calendar time} per esprimere le date dei file e le +informazioni analoghe che riguardano i cosiddetti \textsl{tempi di orologio}, +che vengono usati ad esempio per i demoni che compiono lavori amministrativi +ad ore definite, come \cmd{cron}. + +Di solito questo tempo viene convertito automaticamente dal valore in UTC al +tempo locale, utilizzando le opportune informazioni di localizzazione (specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è -mantenuto dal sistema e non corrisponde all'orologio hardware del calcolatore. +mantenuto dal sistema e non è detto che corrisponda al tempo tenuto +dall'orologio hardware del calcolatore. -Il \textit{process time} di solito si esprime in secondi e viene usato appunto -per tenere conto dei tempi di esecuzione dei processi. Per ciascun processo il -kernel tiene tre di questi tempi: -\begin{itemize*} -\item \textit{clock time} -\item \textit{user time} -\item \textit{system time} -\end{itemize*} -il primo è il tempo ``reale'' (viene anche chiamato \textit{wall clock time}) -dall'avvio del processo, e misura il tempo trascorso fino alla sua -conclusione; chiaramente un tale tempo dipende anche dal carico del sistema e -da quanti altri processi stavano girando nello stesso periodo. Il secondo -tempo è quello che la CPU ha speso nell'esecuzione delle istruzioni del -processo in user space. Il terzo è il tempo impiegato dal kernel per eseguire -delle system call per conto del processo medesimo (tipo quello usato per -eseguire una \func{write} su un file). In genere la somma di user e system -time viene chiamato \textit{CPU time}. +Anche il \textit{process time} di solito si esprime in secondi, ma provvede una +precisione ovviamente superiore al \textit{calendar time} (la cui granularità +minima è il secondo) e viene usato per tenere conto dei tempi di esecuzione +dei processi. Per ciascun processo il kernel calcola tre tempi diversi: +\begin{description*} +\item[\textit{clock time}]: il tempo \textsl{reale} (viene chiamato anche + \textit{wall clock time}) passato dall'avvio del processo. Chiaramente tale + tempo dipende anche dal carico del sistema e da quanti altri processi + stavano girando nello stesso periodo. +\item[\textit{user time}]: il tempo che la CPU ha impiegato nell'esecuzione + delle istruzioni del processo in user space. +\item[\textit{system time}]: il tempo che la CPU ha impiegato nel kernel per + eseguire delle system call per conto del processo. +\end{description*} +In genere la somma di \textit{user time} e \textit{system time} indica il +tempo di processore totale in cui il sistema è stato effettivamente impegnato +nell'eseguire un certo processo e viene chiamato \textit{CPU time}. @@ -1044,16 +1047,17 @@ costante \macro{EOF} (a seconda della funzione); ma questo valore segnala solo che c'è stato un errore, non il tipo di errore. Per riportare il tipo di errore il sistema usa la variabile globale -\var{errno}\footnote{L'uso di una variabile globale può comportare alcuni +\var{errno},\footnote{L'uso di una variabile globale può comportare alcuni problemi (ad esempio nel caso dei thread) ma lo standard ISO C consente anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si può anche usare una macro, e questo è infatti il modo usato da Linux per - renderla locale ai singoli thread.}, definita nell'header \file{errno.h}; la + renderla locale ai singoli thread.} definita nell'header \file{errno.h}; la variabile è in genere definita come \type{volatile} dato che può essere -cambiata in modo asincrono da un segnale (per una descrizione dei segnali si -veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto -bene salva e ripristina il valore della variabile, di questo non è necessario -preoccuparsi nella programmazione normale. +cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un +esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che +un manipolatore di segnale scritto bene salva e ripristina il valore della +variabile, di questo non è necessario preoccuparsi nella programmazione +normale. I valori che può assumere \var{errno} sono riportati in \capref{cha:errors}, nell'header \file{errno.h} sono anche definiti i nomi simbolici per le @@ -1095,7 +1099,7 @@ errore sconosciuto. La funzione utilizza una stringa statica che non deve essere modificata dal programma e che è utilizzabile solo fino ad una chiamata successiva a \func{strerror}; nel caso si usino i thread è provvista\footnote{questa funzione è una estensione GNU, non fa parte dello - standard POSIX} una versione apposita: + standard POSIX.} una versione apposita: \begin{prototype}{string.h} {char *strerror\_r(int errnum, char *buff, size\_t size)} Analoga a \func{strerror} ma ritorna il messaggio in un buffer @@ -1106,7 +1110,7 @@ provvista\footnote{questa funzione che utilizza un buffer che il singolo thread deve allocare, per evitare i problemi connessi alla condivisione del buffer statico. Infine, per completare la caratterizzazione dell'errore, si può usare anche la variabile -globale\footnote{anche questa è una estensione GNU} +globale\footnote{anche questa è un'estensione GNU.} \var{program\_invocation\_short\_name} che riporta il nome del programma attualmente in esecuzione.