Previous Next Contents

8. I processi

8.1 Linux e il multitasking

Uno dei principali motivi del successo di linux è senza dubbio dovuto alla sua capacità di multitasking. Per multitasking si intende ovviamente la possibilità da parte del sistema operativo di far girare contemporeneamente più di una applicazione.

Ovviamente la validità del multitasking offerto da un OS si giudica da diversi fattori, ovvero dall'algoritmo di scheduling dei processi, dalla capacità di gestione della memoria, dalla velocità di esecuzione dei vari processi e da molto altro. Preferiremmo in questa sede non entrare in tecnicismi troppo spinti, e tuttavia non possiamo esimerci dal dire che linux offre uno dei multitasking tecnologicamente più evoluti del mercato. Molti esperti del settore dicono addirittura che da questo punto di vista, Linux si presenta più veloce, piu affidabile e più stabile di molti unix commerciali per non parlare ovviamente del confronto con sistemi non Unix che sono anni luce dietro a Linux da questo punto di vista.

Nelle ultime evoluzioni del kernel linux si sta dirigendo con successo anche verso architetture multiprocessore, compiendo così un ulteriore passo in aventi in quanto a capacità tecnologiche.

Oltre queste due caratteristiche, Linux ne presenta un'altra molto interessante, ovvero quella delle VIRTUAL CONSOLE, ovvero quella di mettere a disposizione dell'utente fino a ben 64 macchine virtuali, ovvero 64 computer virtuali ognuno in grado di svolgere compiti di multitasking, ognuno completamente indipendente dall'altro. Questo significa che un utente linux non solo avrà la possibilità di eseguire contemporeneamente più applicazioni in background, ma disporrà di 64 macchine virtuali all'interno delle quali si possono svolgere attività in foreground o in background, ovvero possibilità illimitate.

Quanto alla solidità del multitasking di Linux, da test da noi svolti abbiamo dedotto che si possono eseguire contemporeneante senza impallamenti o crash del sistema una quantità tale di applicazioni che una persona da solo non riuscirà mai a lanciare, il tutto con decadimento delle prestazioni ovviamente progressivo all'aumentare del numero di processi attivi, ma tale da restare sempre entro limiti più che accettabili.

Detto in parole povere, con Linux difficilmente incontrerete problemi di decadimento delle prestazioni anche in situazioni di elevato sfruttamento delle risorse.

Per questi motivi Linux diviene uno dei migliori OS per la gestione di reti dove un buon multitasking assume importanza rilevante, ma anche per l'utente singolo che vuole sfruttare al massimo tutta la potenza del suo sistema.

8.2 I Job

Per semplificare, identificheremo con la parola job ogni programma eseguito da un utente o dal sistema (in realtà il concetto di job è decisamente piu' ampio).

In un qualsiasi sistema multitasking sono da prevedersi almeno due aspetti per la gestione contemporanea di più job. Un primo aspetto di cui si occupa il kernel di sistema, ovvero scheduling dei job, allocazione della memoria, condivisione delle risorse etc. Un secondo aspetto più esteriore, ovvero un set di strumenti tali da concedere all'utente la possibilità di eseguire un job in background, foreground, sospendere un job, riattivarlo, terminarlo, cambiare la sua priorità di esecuzione rispetto ad altri job.

Per ora lasceremo da parte gli aspetti tecnici legati soprattuto al kernel, per dedicarci fondamentalmente alla seconda parte del problema, ovvero gli strumenti messi a disposizione dell'utente.

8.3 Eseguire un processo in background

Eseguire un processo in background significa praticamente lasciarlo lavorare mentre noi ci dedichiamo a fare con il computer qualcos'altro.

Tipicamente per eseguire un processo in background, basta aggiungere alla linea di comando che lo lancia il suffiso &.

Ad esempio:

find / -iname prg.culturale.6 > result &

compirà una ricerca del file prg.culturale.6 in tutti gli fs montati in quel momento sull'HD, ivi compresi i file system remoti, e invierà il risultato della ricerca verso il file result, ma non occuperà il sistema, bensì lavorerà in background consentendo all'utente di continuare a fare quello che vuole, non so magari scrivere una lettera.

Quando lanceremo un processo seguito dal termine & il sistema restituirà immediatamente quindi il prompt all'utente che potrà continuare a lavorare; al processo così lanciato verra associato un numero, il cui significato vedremo fra poco.

Ovviamente si possono lanciare in background più processi contemporaneamente, l'unica accortezza è di redirigere l'output verso /dev/null o verso un file in modo da non vedersi il video sporcato da eventuali messaggi del processo in background.

Es:

   make zImage 2> /dev/null > /dev/null &

questo esegue la compilazione del kernel in background, preoccupandosi di redirigere sia l'output che eventuali errori su /dev/null.

Subito dopo avere premuto il tasto return avremo una situazione del genere:

   [1] 540
   usr/src/linux/$>

ovvero la prima linea ci indica che il numero del processo in background appena attivato è 540, dopodiché ci restituisce il prompt.

8.4 nohup

Tipicamente l'esecuzione di un processo in background termina non solo perché il processo ha eseguito il suo compito, ma anche perché per esempio l'utente che ha lanciato il processo si è sconnesso dal sistema.

Per evitare di dovere comunque rimanere connessi al sistema anche quando non si ha niente da fare, tanto per aspettare che un eventuale processo in background termini, esiste il comando nohup, che fa sì che un processo continui a funzionare anche dopo che l'utente che lo ha lanciato si è scollegato. Questo è utilissimo per eseguire lavori ad esempio di routine, che possono cosi essere eseguiti durante la notte.

Immaginate di volere compilare un programma gigantesco, avete bisogno del compilatore che sta sul server. Beh, lanciate qualcosa del genere:

nohup make mioprog &

il sistema vi restituerà il prompt

$>

voi vi scollegate

logout

ve ne andate tranquillamente a dormire e l'indomani troverete il vostro programma compilato.

8.5 Sospendere un processo

Immaginate di eseguire un processo in foreground, ad un certo punto volete sospendere l'esecuzione di quel processo per dedicarvi ad altro.

Supponete per esempio di stare scrivendo una lettera e che dovete uscire per un momento da quel processo per cercare un documento. Questa operazione è possibile tramite la pressione contemporanea dei tasti <CTRL Z>.

Questo fa sì che il processo in questione venga immediatamente congelato, il prompt viene restituito all'utente per ulteriori operazioni, la memoria e le risorse del sistema precedentemente occupate dal processo in questione vengono rilasciate per altri programmi, lo stato del processo al momento della sospensione viene salvato in una apposita tabella.

Il processo precedentemente sospeso può essere riesumato e fatto ripartire esattamente dal punto dove l'avevamo lasciato.

Il metodo più semplice per riesumare un processo è quello di digitare %n, dove n è il numero del processo che si vuole riesumare, oppure con %string, dove string è il nome del proceso che si intende scongelare, %?name riesuma tutti i processi contenenti la stringa name, %1 & riesuma il processo congelato, ma ne continua l'esecuzione in background.

8.6 I comandi fg e bg

Cosa si fa quando si vuole portare un processo da background a foreground? La risposta è semplice, si usa il comando fg.

fg %1

riporta in foreground un processo precedentemente sospeso.

fg nomeprocesso riporta in foreground un processo funzionante in background.

8.7 Priorità dei processi

Tipicamente in Linux la maggior parte dei processi gode della stessa priorità ossia può accedere alla CPU per un tempo uguale al tempo offerto agli altri processi eseguiti in quel momento, tuttavia Linux mette a disposizione anche un comando tale da poter attribuire manualmente ad un processo una certa priorità.

Il comando in questione è nice.

nice -14 grep -i jaco /etc/passwd

esegue il processo grep con una priorità pari a 14 (tipicamente la priorità è 10), il range delle priorità varia fra -20 (la massima priorità) e 19 (la più bassa priorità).


Previous Next Contents