From: Simone Piccardi Date: Mon, 8 Apr 2002 18:09:53 +0000 (+0000) Subject: Sistemata sched_setscheduler X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=aca08fb6cdffde355008b34b05da022e7c24926d;ds=sidebyside Sistemata sched_setscheduler --- diff --git a/prochand.tex b/prochand.tex index 21c683b..38c09f5 100644 --- a/prochand.tex +++ b/prochand.tex @@ -2113,57 +2113,113 @@ virtuale (vedi \secref{sec:proc_mem_lock}), il primo non comportare ritardi non prevedibili riguardo ai tempi di esecuzione di qualunque processo. -L'interfaccia POSIX.1b comunque permette di assicurare ai processi che ne -hanno necessità una priorità assoluta superiore a quella dei normali processi. -In ogni caso occorre usare questo meccanismo con molta attenzione: se si dà ad -un processo una priorità assoluta e questo finisce in un loop infinito, dato -che fintanto che non esegue dell'I/O o viene messo in attesa nessun altro -processo potrà essere eseguito, esso resterà esecuzione assorbendo tutto il -tempo di esecuzione della CPU e non si avrà nessuna possibilità di riottenere -l'accesso al sistema. Per questo motivo è sempre opportuno, quando si lavora -con processi che usano priorità assolute, tenere attiva una shell cui si sia -assegnata la massima priorità assoluta, in modo da poter essere comunque in -grado di rientrare nel sistema. +In ogni caso occorre usare le priorità assolute con molta attenzione: se si dà +ad un processo una priorità assoluta e questo finisce in un loop infinito, +nessun altro processo potrà essere eseguito, ed esso sarà mantenuto in +esecuzione permanentemente assorbendo tutta la CPU e senza nessuna possibilità +di riottenere l'accesso al sistema. Per questo motivo è sempre opportuno, +quando si lavora con processi che usano priorità assolute, tenere attiva una +shell cui si sia assegnata la massima priorità assoluta, in modo da poter +essere comunque in grado di rientrare nel sistema. Quando c'è un processo con priorità assoluta lo scheduler lo metterà in esecuzione prima di ogni processo normale. In caso di più processi sarà -eseguito per primo quello con priorità assoluta più alta. Quando ci sono due -processi con la stessa priorità assoluta tocca al kernel decidere quale dei -due deve essere eseguito. Questo viene fatto secondo la politica di scheduling -che ciascuno di questi processi ha; lo standard ne prevede due: -\begin{description} -\item[\textit{Round robin}] ciascun processo viene eseguito a turno per un +eseguito per primo quello con priorità assoluta più alta. Quando ci sono più +processi con la stessa priorità assoluta questi vegono tenuti in una coda +tocca al kernel decidere quale deve essere eseguito. + + + +Il meccanismo con cui vengono gestiti questi processi dipende dalla politica +di scheduling che si è scelto; lo standard ne prevede due: +\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}} +\item[\textit{FIFO}] il processo viene eseguito fintanto che non cede + volontariamente la CPU, si blocca, finisce o viene interrotto da un processo + a priorità più alta. +\item[\textit{Round Robin}] ciascun processo viene eseguito a turno per un certo periodo di tempo (una \textit{time slice}). Solo i processi con la stessa priorità ed in stato \textit{runnable} entrano nel circolo. -\item[\textit{FIFO}] il processo che ha atteso di più ha la precedenza e viene - eseguito fintanto che non cede volontariamente la CPU, si blocca, finisce o - viene interrotto da un processo a priorità più alta. -\end{description} +\end{basedescript} -La funzione per settare politica di scheduling ed i relativi parametri è -\func{sched\_setscheduler}; il suo prototipo è: +La funzione per settare le politiche di scheduling (sia real-time che +ordinarie) ed i relativi parametri è \func{sched\_setscheduler}; il suo +prototipo è: \begin{prototype}{sched.h} {int sched\_setscheduler(pid\_t pid, int policy, const struct sched\_param *p)} Setta priorità e politica di scheduling per il processo \param{pid}. \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. + \begin{errlist} + \item[\macro{ESRCH}] il processo \param{pid} non esiste. + \item[\macro{EINVAL}] il valore di \param{policy} non esiste o il relativo + valore di \param{p} non è valido. + \item[\macro{EPERM}] il processo non ha i privilegi per attivare la + politica richiesta (vale solo per \macro{SCHED\_FIFO} e + \macro{SCHED\_RR}). \end{errlist}} \end{prototype} +La funzione esegue il settaggio per il processo specificato; un valore nullo +di \param{pid} esegue il settaggio per il processo corrente, solo un processo +con i privilegi di amministratore può settare delle priorità assolute diverse +da zero. La politica di scheduling è specificata dall'argomento \param{policy} +i cui possibili valori sono riportati in \tabref{tab:proc_sched_policy}. +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}[c]{|c|l|} + \hline + \textbf{Policy} & \textbf{Significato} \\ + \hline + \hline + \macro{SCHED\_FIFO} & Scheduling real-time con politica \textit{FIFO} \\ + \macro{SCHED\_RR} & Scheduling real-time con politica \textit{Round + Robin} \\ + \macro{SCHED\_OTHER}& Scheduling ordinario\\ + \hline + \end{tabular} + \caption{Valori dell'argomento \param{policy} per la funzione + \func{sched\_setscheduler}. } + \label{tab:proc_sched_policy} +\end{table} +Il valore della priorità è passato attraverso la struttura \var{sched\_param}, +riportata in \figref{fig:sig_sched_param}. Il solo campo che serve è +\var{sched\_priority} che nel caso delle priorità assolute deve essere +specificato nell'intervallo fra 1 e 99 (il valore zero è legale, ma indica i +processi normali). I processi con politica di scheduling \macro{SCHED\_OTHER} +devono specificare un valore nullo (altrimenti si avrà un errore +\macro{EINVAL}), questo valore infatti non ha niente a che vedere con la +priorità dinamica determinata dal valore di \var{nice}. +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} +struct sched_param { + ... + int sched_priority; + ... +}; + \end{lstlisting} + \end{minipage} + \normalsize + \caption{La struttura \var{sched\_param}.} + \label{fig:sig_sched_param} +\end{figure} - +Il kernel mantiene i processi con la stessa priorità assoluta in una lista, ed +esegue sempre il primo della lista, mentre un nuovo processo che torna in +stato \textit{runnable} viene sempre inserito in coda alla lista. Se la +politica scelta è \macro{SCHED\_FIFO} quando il processo viene eseguito viene +automaticamente rimesso in coda alla lista, ma la sua esecuzione continua e +tolto dalla lista, la sua esecuzione fintanto che non viene bloccato da una +richiesta di I/O, o non rilascia volontariamente la CPU (in tal caso, tornando +nello stato \textit{runnable} sarà reinserito in coda alla lista; l'esecuzione +viene ripresa subito solo nel caso che esso sia stato interrotto da un +processo a priorità più alta.