# Nice (Unix)

nice è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che esegue un altro comando modificando il suo valore di nice.
Il valore di nice è un attributo numerico di ciascun processo dei sistemi Unix e Unix-like che è usato dallo scheduler per stabilire quanto tempo di CPU dedicare all'esecuzione del processo. A parità di priorità e di politica di schedulazione, i processi che hanno valori di nice maggiori ottengono in proporzione meno tempo di CPU rispetto a processi che hanno valori di nice minori, e quindi la loro esecuzione procede più lentamente, favorendo gli altri processi. L'idea generale è che un utente si comporti in maniera cortese (la traduzione dalla lingua inglese del termine nice è appunto cortese, simpatico) nei confronti degli altri utenti quando avvia elaborazioni particolarmente lunghe ed intense, avviandole con un valore di nice elevato in modo da non rallentare eccessivamente l'esecuzione dei processi degli altri utenti.
Facciamo un esempio su un sistema Linux Mint 17.2 Rafaela consultando il Monitor di Sistema in cui la quasi totalità dei programmi ha il nice a 0:
* BOINC è un programma di calcolo distribuito e non deve interferire col lavoro del calcolatore nonostante utilizzi quasi il 100% delle CPU:Ha il nice settato a 10
* Per non sentire a scatti e vedere un filmato fuori sincrono il manager dell'audio PulseAudio deve avere una priorità altissima nonostante usi meno dell'1% di CPU ed ha il nice a -11
nice è anche il nome di una chiamata di sistema definita dallo standard POSIX che modifica il valore di nice del processo che la invoca. Di fatto il comando nice opera invocando l'omonima chiamata di sistema.
Per diminuire il valore di nice è necessario disporre dei privilegi dell'amministratore (root), mentre ciò non è necessario per aumentarlo. Tipicamente è possibile diminuire il valore di nice fino a 20 unità rispetto al valore predefinito, o aumentarlo fino a 19 unità: è possibile specificare scostamenti più ampi, ma essi sono automaticamente ricondotti entro i limiti sopra citati.

## Il comando nice
### Uso

La sintassi generale di nice è la seguente:
Il parametro comando indica il comando da eseguire, ed i parametri facoltativi argN i suoi parametri.
Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.
Tra le opzioni significative vi sono:

#### -n delta

    somma algebricamente il valore delta al valore di nice, in modo da aumentarlo o diminuirlo; delta può essere negativo, in modo da privilegiare il programma rispetto agli altri, ma in tal caso occorre disporre dei privilegi dell'amministratore (root).
Se l'opzione -n non è specificata, il comportamento predefinito prevede di aggiungere 10 al valore di nice (come se fosse stata specificata l'opzione -n 10).

### Esempi

Avvia parallelamente due copie del programma factor, ciascuna delle quali calcola i fattori primi del numero 4611686018427387903, misurando il tempo di esecuzione tramite il comando time: la prima copia viene eseguita con un valore di nice elevato (aumentato di 20 unità rispetto al normale), mentre la seconda usa il valore di nice predefinito. Entrambe le copie impiegano lo stesso tempo di CPU per effettuare il calcolo, ma la prima copia è svantaggiata e (su un sistema con una sola CPU) completa il suo calcolo ben dopo la seconda:

## La chiamata di sistema nice

La chiamata di sistema nice è dichiarata nello header file signal.h:
Il parametro incr indica di quanto aumentare (o diminuire, in caso di valore negativo) il valore di nice del processo chiamante.

### Valore di ritorno

Se non vi sono errori, viene ritornato il precedente valore di nice e la variabile errno viene lasciata immutata.
Altrimenti, se vi sono errori, viene ritornato il valore -1 e la variabile errno viene modificata per indicare l'errore specifico.
Notare che -1 in alcuni sistemi è un valore di nice valido, per cui non è sufficiente controllare il risultato per stabilire se vi sono stati errori, ma occorre prima impostare la variabile errno a 0 e poi controllare se il suo valore è cambiato.

### Errori

In caso di errore la variabile errno può valere:
* EPERM – Il parametro incr è negativo ed il chiamante non ha sufficienti privilegi per diminuire il valore di nice.