X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=c005bbd5918d8a28fc0670c7e7ea1989288862f8;hp=d4b7de25d080ae3667520c12cce3e7ef3947ded4;hb=a727c2850d3ac092f165081059cbf1c5d9d9849e;hpb=ce9e7bc52908e92783f1b88faf090e93b06fd320 diff --git a/prochand.tex b/prochand.tex index d4b7de2..c005bbd 100644 --- a/prochand.tex +++ b/prochand.tex @@ -211,7 +211,7 @@ Come accennato nell'introduzione, ogni processo viene identificato dal sistema da un numero identificativo unico, il \textit{process id} o \acr{pid}; quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un intero con segno (nel caso di Linux e delle \acr{glibc} il tipo usato è -\type{int}). +\ctyp{int}). Il \acr{pid} viene assegnato in forma progressiva ogni volta che un nuovo processo viene creato, fino ad un limite che, essendo il \acr{pid} un numero @@ -996,7 +996,7 @@ Lo standard POSIX.1 definisce una serie di macro di preprocessore da usare per analizzare lo stato di uscita. Esse sono definite sempre in \file{} ed elencate in \tabref{tab:proc_status_macro} (si tenga presente che queste macro prendono come parametro la variabile di tipo -\type{int} puntata da \var{status}). +\ctyp{int} puntata da \var{status}). Si tenga conto che nel caso di conclusione anomala il valore restituito da \macro{WTERMSIG} può essere confrontato con le costanti definite in @@ -1982,15 +1982,15 @@ valore di \var{counter} del processo corrente viene diminuito, questo assicura che anche i processi con priorità più bassa verranno messi in esecuzione. La priorità di un processo è così controllata attraverso il valore di -\var{nice}, che stabilisce la durata della \textit{time-slice}; un valore più -lungo infatti assicura una maggiore attribuzione di CPU. L'origine di questo -parametro sta nel fatto che in genere esso viene generalmente usato come per -diminuire la priorità di un processo, come termine di cortesia (da cui il -nome) nei confronti degli altri. +\var{nice}, che stabilisce la durata della \textit{time-slice}; per il +meccanismo appena descritto infatti un valore più lungo infatti assicura una +maggiore attribuzione di CPU. L'origine del nome di questo parametro sta nel +fatto che in genere esso viene generalmente usato per diminuire la priorità di +un processo, come misura di cortesia nei confronti degli altri. I processi infatti vengono creati dal sistema con lo stesso valore di -\var{nice} (nullo) e nessuno è privilegiato; il valore può essere modificato -solo attraverso la funzione \func{nice}, il cui prototipo è: +\var{nice} (nullo) e nessuno è privilegiato rispetto agli altri; il valore può +essere modificato solo attraverso la funzione \func{nice}, il cui prototipo è: \begin{prototype}{unistd.h} {int nice(int inc)} Aumenta il valore di \var{nice} per il processo corrente. @@ -1998,23 +1998,23 @@ solo attraverso la funzione \func{nice}, il cui prototipo \bodydesc{La funzione ritorna zero in caso di successo e -1 in caso di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} - \item[\macro{EPERM}] un utente normale ha specificato un valore di - \param{inc} negativo. + \item[\macro{EPERM}] un processo senza i privilegi di amministratore ha + specificato un valore di \param{inc} negativo. \end{errlist}} \end{prototype} L'argomento \param{inc} indica l'incremento del valore di \var{nice}: quest'ultimo può assumere valori compresi fra \macro{PRIO\_MIN} e -\macro{PRIO\_MAX} (che nel caso di Linux sono $-19$ e $20$) , ma per +\macro{PRIO\_MAX} (che nel caso di Linux sono $-19$ e $20$), ma per \param{inc} si può specificare un valore qualunque, positivo o negativo, ed il sistema provvederà a troncare il risultato nell'intervallo consentito. Valori positivi comportano maggiore \textit{cortesia} e cioè una diminuzione della -priorità. Solo l'amministratore può specificare valori negativi che permettono -di aumentare la priorità di un processo. - +priorità, ogni utente può solo innalzare il valore di un suo processo. Solo +l'amministratore può specificare valori negativi che permettono di aumentare +la priorità di un processo. In SUSv2 la funzione ritorna il nuovo valore di \var{nice}; Linux non segue -questa convenzione, per leggere il nuovo valore di occorre invece usare la +questa convenzione, e per leggere il nuovo valore occorre invece usare la funzione \func{getpriority}, derivata da BSD, il cui prototipo è: \begin{prototype}{sys/resource.h} {int getpriority(int which, int who)} @@ -2026,27 +2026,88 @@ funzione \func{getpriority}, derivata da BSD, il cui prototipo \begin{errlist} \item[\macro{ESRCH}] non c'è nessun processo che corrisponda ai valori di \param{which} e \param{who}. - \item[\macro{ESRCH}] il valore di \param{which} non è valido. + \item[\macro{EINVAL}] il valore di \param{which} non è valido. \end{errlist}} \end{prototype} +\noindent (in vecchie versioni può essere necessario includere anche +\file{}, questo non è più necessario con versioni recenti delle +librerie, ma è comunque utile per portabilità). +La funzione permette di leggere la priorità di un processo, di un gruppo di +processi (vedi \secref{sec:sess_proc_group}) o di un utente, a seconda del +valore di \param{which}, secondo la legenda di \tabref{tab:proc_getpriority}, +specificando un corrispondente valore per \param{who}; un valore nullo di +quest'ultimo indica il processo, il gruppo di processi o l'utente correnti. +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|c|c|l|} + \hline + \param{which} & \param{who} & \textbf{Significato} \\ + \hline + \hline + \macro{PRIO\_PROCESS} & \type{pid\_t} & processo \\ + \macro{PRIO\_PRGR} & \type{pid\_t} & process group \\ + \macro{PRIO\_USER} & \type{uid\_t} & utente \\ + \hline + \end{tabular} + \caption{Legenda del valore dell'argomento \param{which} e del tipo + dell'argomento \param{who} delle funzioni \func{getpriority} e + \func{setpriority} per le tre possibili scelte.} + \label{tab:proc_getpriority} +\end{table} + +La funzione restituisce la priorità più alta (cioè il valore più basso) fra +quelle dei processi specificati; dato che -1 è un valore possibile, per poter +rilevare una condizione di errore è necessario cancellare sempre \var{errno} +prima della chiamata alla funzione, per verificare che essa resti uguale a +zero. + +Analoga a \func{getpriority} la funzione \func{setpriority} permette di +settare la priorità di uno o più processi; il suo prototipo è: +\begin{prototype}{sys/resource.h} +{int setpriority(int which, int who, int prio)} + Setta la priorità per l'insieme dei processi specificati. + + \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di + errore, nel qual caso \var{errno} può assumere i valori: + \begin{errlist} + \item[\macro{ESRCH}] non c'è nessun processo che corrisponda ai valori di + \param{which} e \param{who}. + \item[\macro{EINVAL}] il valore di \param{which} non è valido. + \item[\macro{EPERM}] un processo senza i privilegi di amministratore ha + specificato un valore di \param{inc} negativo. + \item[\macro{EACCESS}] un processo senza i privilegi di amministratore ha + cercato di modificare la priorità di un processo di un altro utente. + \end{errlist}} +\end{prototype} + +La funzione setta la priorità al valore specificato da \param{prio} per tutti +i processi indicati dagli argomenti \parm{which} e \param{who}. La gestione +dei permessi dipende dalle varie implementazioni; in Linux, secondo le +specifiche dello standard SUSv3, e come avviene per tutti i sistemi che +derivano da SYSV, è richiesto che il real o l'effective user id del processo +chiamante corrispondano al real user id (e solo quello) del processo di cui si +vuole cambiare la prorità; per i sistemi derivati da BSD invece (SunOS, +Ultrix, *BSD) la corrispondenza può essere anche con l'effective user id. \subsection{Il meccanismo di \textit{scheduling real-time}} \label{sec:proc_real_time} -Per settare le - -\footnote{a meno che non si siano installate le patch di RTLinux o RTAI, con i - quali è possibile ottenere un sistema effettivamente hard real-time.} +Come spiegato in \secref{sec:proc_sched} lo standard POSIX.1b ha introdotto le +priorità assolute per permettere la gestione di processi real-time; benché +Linux non sia un sistema operativo real-time,\footnote{a meno che non si siano + installate le patch di RTLinux o RTAI, con i quali è possibile ottenere un + sistema effettivamente hard real-time.} è stata comunque implementata anche +una politica di scheduling corrispondente a questo meccanismo. -in realtà non si tratta di un vero hard real-time, in quanto - la presenza di eventuali interrupt o di page fault può sempre interrompere - l'esecuzione di un processo, a meno di non installare le estensioni di - RTLinux o RTAI, il normale kernel non è real-time. +In realtà non si tratta di un vero hard real-time, in quanto la presenza di +eventuali interrupt o di page fault può sempre interrompere l'esecuzione di un +processo, in questo modo comunque si potrà dare . @@ -2104,11 +2165,11 @@ operazioni atomiche (torneremo su questi aspetti in In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t}, il cui accesso è assicurato essere atomico. In pratica comunque si può assumere che, in ogni piattaforma su cui è implementato Linux, il tipo -\type{int}, gli altri interi di dimensione inferiore ed i puntatori sono +\ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono atomici. Non è affatto detto che lo stesso valga per interi di dimensioni maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per le strutture. In tutti questi casi è anche opportuno marcare come -\type{volatile} le variabili che possono essere interessate ad accesso +\ctyp{volatile} le variabili che possono essere interessate ad accesso condiviso, onde evitare problemi con le ottimizzazioni del codice.