Indietro Indice Home PHC Avanti


Multitasking preemptive

Un server di rete normalmente offre un certo numero di servizi (web, ftp, posta...) che devono poter essere utilizzabili contemporaneamente e da più persone nello stesso tempo. È quindi necessario che il sistema operativo permetta a più processi di utilizzare periodicamente il processore (CPU); questa caratteristica va sotto il nome di ``multitasking''.

Esistono due tipi diversi di multitasking: quello cooperativo e il preemptive; nel primo il sistema operativo lascia il pieno controllo della CPU al processo che deve essere eseguito in quel momento, e si affida ad esso affinché rilasci il processore dopo un po' di tempo, mentre nel secondo il pieno controllo resta sempre al sistema operativo, che riesce a bloccare il processo e a riprendersi la cpu, se necessario. Ovviamente il multitasking preemptive è molto più sicuro. In pratica si permette ad ogni processo di utilizzare la cpu solo per un tempo limitato (200ms) alla volta, e se un processo deve essere eseguito più rapidamente semplicemente gli si premette più spesso di utilizzarla.

Per sapere quale processo ha più urgenza di essere eseguito si utilizza un sistema di priorità, in modo che quelli con priorità maggiore utilizzino la CPU più spesso. Stranamente la priorità viene rappresentata da un numero (NICE) compreso tra -20 e 20, e i processi a maggiore priorità sono quelli con un valore di NICE minore. La priorità di un processo può essere specificata al momento dell'esecuzione con il comando nice o modificata mentre il processo è in esecuzione con il comando renice.

L'uso del comando nice è semplice: se seguito da -n, da un numero (positivo o negativo) e dal comando, tenta di eseguire quel comando assegnandogli il valore di NICE specificato dal numero. Se invece si scrive semplicemente nice <numero> <comando> verrà incrementato del valore specificato la NICE del comando, che in genere è sempre `0'.

Il comando renice è ancora più semplice: seguito da un numero (positivo o negativo) e dal PID di un processo setta il valore di NICE del processo con il numero specificato.

Sia con nice che con renice valori negativi possono essere assegnati solo da root.

Il multitasking rientra in un disegno generale più ampio volto a far sìche esista una differenziazione tra processi che comunicano direttamente con l'hardware (si dice che girano in kernel mode) e processi che non possono farlo (girano in user mode), e che per poter utilizzare le risorse della macchina devono necessariamente passare per i primi. Normalmente in kernel mode gira solo il kernel stesso, ma in diverse forme. Esistono infatti dei processi, come kflushd, kswapd ed altri che sono dei veri e propri pezzi di kernel che però girano come processi indipendenti. A parte questi ogni altro programma che voglia utilizzare una qualche risorsa hardware lo fa utilizzando delle chiamate di sistema che il kernel interpreta nel modo dovuto. La stabilità di una macchina è quindi fortemente legata a quella del kernel che monta, e il kernel Linux è considerato piuttosto stabile.


Antonio Messina
2000-03-17