Finito (forse) con lo scheduling standard.
[gapil.git] / prochand.tex
index d4b7de25d080ae3667520c12cce3e7ef3947ded4..5daea9ee0b54c3c567d19fc27cfe403b8dc00da4 100644 (file)
@@ -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{<sys/wait.h>} 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,18 +2026,81 @@ 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{<sys/time.h>}, 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 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 
+
+Come spiegato al paragrafo precedente di norma 
+
+Per settare le
 
 
 \footnote{a meno che non si siano installate le patch di RTLinux o RTAI, con i
@@ -2104,11 +2167,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.