Oggi scopriremo un trucco molto utile: impostare manualmente la priorità dei processi in esecuzione. Andiamo nel dettaglio, e vediamo come agire.
Pensiamo di possedere un sistema ad un solo processore.
Unix (soprattutto Linux) , come tutti sanno, è un sistema in grado di eseguire diverse operazioni in contemporanea (multitasking)…solo apparentemente,però!
Infatti una bella fetta del lavoro viene effettuato dal processore, che si occupa di eseguire i processi e di gestire le operazioni multiple, suddividendo il tempo dedicato ai processi in esecuzione in contemporanea in base ad una scala di misura che, in unix, si chiama NICE.
Il valore NICE è un numero intero associato ad ogni processo, che può avere valori da -20 a +20 , che cambia con questo criterio : più tempo il processore deve dare al processo, più basso deve essere il valore di NICE associato e, quindi, più veloce sarà l’esecuzione del processo in oggetto.
Facciamo un esempio, se avviamo in contemporanea due istanze del programma sort (che ordina un file) sullo stesso file, la prima con un nice -15 e la seconda con nice +10, nonostante siano state avviate contemporaneamente, la prima istanza sarà molto più veloce della seconda.
Facciamo un esempio pratico.
Apriate un terminale,e scrivete
ps al
L’output sarà:
malefika:~$ ps al
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 0 1061 1 2 0 0 1704 472 n_tty_ Ss+ tty2 0:00 /sbin/getty
0 0 1660 1 2 0 0 1704 476 n_tty_ Ss+ tty1 0:00 /sbin/getty
Guardate la colonna COMMAND e la colonna NI: la prima evidenzia il pathname del processo, la seconda il valore di NICE. Vedremo che i processi di sistema in esecuzione hanno tutti la stessa priorità (il valore di NICE è a 0 in tutti). Guardiamo la process list completa. Il comando per questo è
ps xal
Vediamo un pezzo dell’ output:
malefika:~$ ps axl
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 20 0 2632 1520 poll_s Ss ? 0:01 /sbin/init
1 0 2 0 15 -5 0 0 kthrea S< ? 0:00 [kthreadd]
1 0 3 2 -100 - 0 0 migrat S< ? 0:00 [migration]
1 0 4 2 15 -5 0 0 ksofti S< ? 0:02 [ksoftirqd]
5 0 5 2 -100 - 0 0 watchd S< ? 0:00 [watchdog/]
1 0 6 2 15 -5 0 0 worker S< ? 0:00 [events/0]
Avete visto come cambiano i valori? Ci sono dei processi che hanno già priorità più elevata rispetto a quelli visti prima.
NB : priorità alta = NICE basso.
Adesso vediamo come gestire la priorità da riga di comando. Lo possiamo fare in due modi:
- Vogliamo aumentare/diminuire la priorità prima di mandare il processo in esecuzione, e desideriamo eseguirlo con la priorità che abbiamo deciso: è semplice, infatti il nice, oltre che un indice, è anche un comando shell. Il comando nice è utile per aggiungere/sottrarre la quantità specificata nell’argomento -n. Di standard ogni programma parte con valore di nice uguali a 0. Quindi se, ad esempio, desideriamo ordinare un file di testo con un numero su ogni linea, in ordine crescente , con priorità elevatissima ( -15, il massimo è -20), scriveremo:
-
nice -d -15 sort -n file_di_testo.txt
Oppure:
nice -d <incremento_o_decremento> <comando> <argomenti_comando>
- Desideriamo aumentare/diminuire la priorità di un processo che è già in esecuzione: adesso abbiamo bisogno del pid e del valore corrente del nice di questo processo. Immaginiamo di voler modificare la priorità del processo nautilus. Da shell, diamo il comando:
ps axl | grep nautilus
Facciamo attenzione alla terza ed alla sesta colonna : il pid e il nice del processo. L’output sarà:
malefika:~$ ps axl | grep nautilus
0 1000 1938 1834 20 0 92924 31260 poll_s S ? 0:19 nautilusIl pid del nautilus è 1938,e il nice precedente è 0. Immaginiamo di voler rallentare l’esecuzione, diminuendo la priorità. Dobbiamo aggiungere, ipotizziamo, 10 al valore del nice di nautilus corrente, e lo faremo con il comando renice:
renice 10 -p 1938
In generale:
renice <incremento_o_decremento> -p <pid_processo>
Se volete modificare la priorità dei vari processi, fatelo solo se ne avete realmente necessità, ed attenzione a quello che combinate dietro ai server, se maneggiate in malo modo il nice, potreste bloccare il sistema.